我们正准备发布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声明—这已被添加。
