我们正准备发布ZendFramework1.6.0。然而,一个重要的Dijit不得不从发布中省略,因为我无法及时让它工作:dijit.Editor
。
这个dijit很重要,因为它提供了一个开箱即用的WYSIWYG编辑器,您可以将其用于您的表单。不幸的是,实际上将它与表单一起使用非常棘手—Dojo实际上最终将内容存储在表单之外,这意味着您需要创建一个处理程序,在保存时将内容拉入隐藏元素。
不过,我已经创建了一个实现,您现在就可以开始使用了,我将其发布在下方。它包括一个用于显示它的视图助手,以及一个用于Zend_Form
的表单元素。
ViewHelper看起来像这样:
<?php /** Zend_Dojo_View_Helper_Textarea */ require_once 'Zend/Dojo/View/Helper/Textarea.php'; /** * dijit.Editor view helper * * @uses Zend_Dojo_View_Helper_Textarea * @category My * @package My_View * @subpackage Helper * @license New BSD {@link http://framework.zend.com/license/new-bsd} * @version $Id: $ */ class My_View_Helper_Editor extends Zend_Dojo_View_Helper_Textarea { /** * @param string Dijit type */ protected $_dijit = 'dijit.Editor'; /** * @param string Dojo module */ protected $_module = 'dijit.Editor'; /** * dijit.Editor * * @param string $id * @param string $value * @param array $params * @param array $attribs * @return string */ public function editor($id, $value = null, $params = array(), $attribs = array()) { $hiddenName = $textareaName = $id; $hiddenAttribs = array( 'id' => $hiddenName, 'name' => $hiddenName, 'value' => $value, 'type' => 'hidden', ); if (array_key_exists('id', $attribs)) { $hiddenAttribs['id'] = $attribs['id']; $attribs['id'] .= 'Editor'; $id = $attribs['id']; } if (']' == $textareaName[strlen($textareaName) - 1]) { $textareaName = rtrim($textareaName, ']'); $textareaName .= 'Editor]'; } $this->_createGetParentFormFunction(); $this->_createEditorOnSubmit($hiddenAttribs['id'], $id); $html = '<input' . $this->_htmlAttribs($hiddenAttribs) . $this->getClosingBracket() . $this->textarea($textareaName, $value, $params, $attribs); return $html; } /** * Create JS function for retrieving parent form * * @return void */ protected function _createGetParentFormFunction() { $function =<<<EOJ if (zend == undefined) { var zend = {}; } zend.findParentForm = function(elementNode) { while (elementNode.nodeName.toLowerCase() != 'form') { elementNode = elementNode.parentNode; } return elementNode; }; EOJ; $this->dojo->addJavascript($function); } /** * Create onSubmit binding for element * * @param string $hiddenId * @param string $editorId * @return void */ protected function _createEditorOnSubmit($hiddenId, $editorId) { $this->dojo->onLoadCaptureStart(); echo <<<EOJ function() { var form = zend.findParentForm(dojo.byId('$hiddenId')); dojo.connect(form, 'onsubmit', function () { dojo.byId('$hiddenId').value = dijit.byId('$editorId').getValue(false); }); } EOJ; $this->dojo->onLoadCaptureEnd(); } }
那里有很多代码,但重要的是最后两个方法,它允许找到编辑器dijit的父表单,然后将表单提交事件绑定到一个操作,该操作将隐藏值设置为提供的编辑器内容。
表单元素要简单得多:
<?php /** Zend_Dojo_Form_Element_Dijit */ require_once 'Zend/Dojo/Form/Element/Dijit.php'; /** * dijit.Editor * * @uses Zend_Dojo_Form_Element_Dijit * @category My * @package My_Form * @subpackage Element * @license New BSD {@link http://framework.zend.com/license/new-bsd} * @version $Id: $ */ class My_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit { /** * @var string View helper */ public $helper = 'Editor'; }
老实说,就是这样。由于视图助手完成了显示的繁重工作,所有元素需要做的就是指示要使用哪个助手。
将所有内容放在一个表单中,您需要执行以下操作:
$view->addHelperPath('My/View/Helper/', 'My_View_Helper'); $form->addPrefixPath('My_Form_Element', 'My/Form/Element'); $form->addElement('Editor', 'content');
辅助前缀路径可能最好添加到您的引导程序中;表单前缀路径应该在表单类的init()
方法的早期添加,或者通过配置传入。
您应该会在ZF1.6.1的ZF标准库中看到该元素。
更新:JasonE.注意到视图助手缺少dijit.Editor
的$_module
声明—这已被添加。