File indexing completed on 2024-12-29 05:27:35
0001 <?php 0002 /** 0003 * Zend Framework 0004 * 0005 * LICENSE 0006 * 0007 * This source file is subject to the new BSD license that is bundled 0008 * with this package in the file LICENSE.txt. 0009 * It is also available through the world-wide-web at this URL: 0010 * http://framework.zend.com/license/new-bsd 0011 * If you did not receive a copy of the license and are unable to 0012 * obtain it through the world-wide-web, please send an email 0013 * to license@zend.com so we can send you a copy immediately. 0014 * 0015 * @category Zend 0016 * @package Zend_Dojo 0017 * @subpackage View 0018 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0019 * @license http://framework.zend.com/license/new-bsd New BSD License 0020 * @version $Id$ 0021 */ 0022 0023 /** Zend_Dojo_View_Helper_Dijit */ 0024 // require_once 'Zend/Dojo/View/Helper/Dijit.php'; 0025 0026 /** Zend_Json */ 0027 // require_once 'Zend/Json.php'; 0028 0029 /** 0030 * Dojo Editor dijit 0031 * 0032 * @uses Zend_Dojo_View_Helper_Textarea 0033 * @package Zend_Dojo 0034 * @subpackage View 0035 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0036 * @license http://framework.zend.com/license/new-bsd New BSD License 0037 */ 0038 class Zend_Dojo_View_Helper_Editor extends Zend_Dojo_View_Helper_Dijit 0039 { 0040 /** 0041 * @param string Dijit type 0042 */ 0043 protected $_dijit = 'dijit.Editor'; 0044 0045 /** 0046 * @var string Dijit module to load 0047 */ 0048 protected $_module = 'dijit.Editor'; 0049 0050 /** 0051 * @var array Maps non-core plugin to module basename 0052 */ 0053 protected $_pluginsModules = array( 0054 'createLink' => 'LinkDialog', 0055 'insertImage' => 'LinkDialog', 0056 'fontName' => 'FontChoice', 0057 'fontSize' => 'FontChoice', 0058 'formatBlock' => 'FontChoice', 0059 'foreColor' => 'TextColor', 0060 'hiliteColor' => 'TextColor', 0061 'enterKeyHandling' => 'EnterKeyHandling', 0062 'fullScreen' => 'FullScreen', 0063 'newPage' => 'NewPage', 0064 'print' => 'Print', 0065 'tabIndent' => 'TabIndent', 0066 'toggleDir' => 'ToggleDir', 0067 'viewSource' => 'ViewSource' 0068 ); 0069 0070 /** 0071 * JSON-encoded parameters 0072 * @var array 0073 */ 0074 protected $_jsonParams = array('captureEvents', 'events', 'plugins', 'extraPlugins'); 0075 0076 /** 0077 * dijit.Editor 0078 * 0079 * @param string $id 0080 * @param string $value 0081 * @param array $params 0082 * @param array $attribs 0083 * @return string 0084 */ 0085 public function editor($id, $value = null, $params = array(), $attribs = array()) 0086 { 0087 if (isset($params['plugins'])) { 0088 foreach ($this->_getRequiredModules($params['plugins']) as $module) { 0089 $this->dojo->requireModule($module); 0090 } 0091 } 0092 0093 // Previous versions allowed specifying "degrade" to allow using a 0094 // textarea instead of a div -- but this is insecure. Removing the 0095 // parameter if set to prevent its injection in the dijit. 0096 if (isset($params['degrade'])) { 0097 unset($params['degrade']); 0098 } 0099 0100 $hiddenName = $id; 0101 if (array_key_exists('id', $attribs)) { 0102 $hiddenId = $attribs['id']; 0103 } else { 0104 $hiddenId = $hiddenName; 0105 } 0106 $hiddenId = $this->_normalizeId($hiddenId); 0107 0108 $textareaName = $this->_normalizeEditorName($hiddenName); 0109 $textareaId = $hiddenId . '-Editor'; 0110 0111 $hiddenAttribs = array( 0112 'id' => $hiddenId, 0113 'name' => $hiddenName, 0114 'value' => $value, 0115 'type' => 'hidden', 0116 ); 0117 $attribs['id'] = $textareaId; 0118 0119 $this->_createGetParentFormFunction(); 0120 $this->_createEditorOnSubmit($hiddenId, $textareaId); 0121 0122 $attribs = $this->_prepareDijit($attribs, $params, 'textarea'); 0123 0124 $html = '<div' . $this->_htmlAttribs($attribs) . '>' 0125 . $value 0126 . "</div>\n"; 0127 0128 // Embed a textarea in a <noscript> tag to allow for graceful 0129 // degradation 0130 $html .= '<noscript>' 0131 . $this->view->formTextarea($hiddenId, $value, $attribs) 0132 . '</noscript>'; 0133 0134 $html .= '<input' . $this->_htmlAttribs($hiddenAttribs) . $this->getClosingBracket(); 0135 0136 return $html; 0137 } 0138 0139 /** 0140 * Generates the list of required modules to include, if any is needed. 0141 * 0142 * @param array $plugins plugins to include 0143 * @return array 0144 */ 0145 protected function _getRequiredModules(array $plugins) 0146 { 0147 $modules = array(); 0148 foreach ($plugins as $commandName) { 0149 if (isset($this->_pluginsModules[$commandName])) { 0150 $pluginName = $this->_pluginsModules[$commandName]; 0151 $modules[] = 'dijit._editor.plugins.' . $pluginName; 0152 } 0153 } 0154 0155 return array_unique($modules); 0156 } 0157 0158 /** 0159 * Normalize editor element name 0160 * 0161 * @param string $name 0162 * @return string 0163 */ 0164 protected function _normalizeEditorName($name) 0165 { 0166 if ('[]' == substr($name, -2)) { 0167 $name = substr($name, 0, strlen($name) - 2); 0168 $name .= '[Editor][]'; 0169 } else { 0170 $name .= '[Editor]'; 0171 } 0172 return $name; 0173 } 0174 0175 /** 0176 * Create onSubmit binding for element 0177 * 0178 * @param string $hiddenId 0179 * @param string $editorId 0180 * @return void 0181 */ 0182 protected function _createEditorOnSubmit($hiddenId, $editorId) 0183 { 0184 $this->dojo->onLoadCaptureStart(); 0185 echo <<<EOJ 0186 function() { 0187 var form = zend.findParentForm(dojo.byId('$hiddenId')); 0188 dojo.connect(form, 'submit', function(e) { 0189 var value = dijit.byId('$editorId').getValue(false); 0190 if(dojo.isFF) { 0191 value = value.replace(/<br _moz_editor_bogus_node="TRUE" \/>/, ''); 0192 } 0193 dojo.byId('$hiddenId').value = value; 0194 }); 0195 } 0196 EOJ; 0197 $this->dojo->onLoadCaptureEnd(); 0198 } 0199 }