开放的编程资料库

当前位置:我爱分享网 > PHP教程 > 正文

在 Zend Framework 中使用 dijit.Editor

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

未经允许不得转载:我爱分享网 » 在 Zend Framework 中使用 dijit.Editor

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏