Zend框架/表单元素:创建自定义类或?

时间:2010-08-04 06:41:27

标签: php zend-framework

我想要的结果是一个连接WMD(降价编辑器)的textarea。并包含div.wmd-preview元素。我目前在我的表格中(扩展Zend_Form)...我通过装饰者添加功能

// init()
$this->addElement('textarea', 'bio', array(
    'label' => 'Bio',
    'description' => '<a href="http://daringfireball.net/projects/markdown/syntax" target="_blank" title="get markdown editing/syntax help">Markdown enabled</a>',
    'validators' => array(
        array('StringLength', false, array(0, 1000))
    ),
    'decorators' => array(
        'ViewHelper',
        'Errors',
        array('Description', array('tag' => 'p', 'escape' => false)),
        'Label',
        array('HtmlTag', array('tag' => 'p')),
        new Application_Form_Decorator_WmdPreview,
     )
));
...
// add WMD & Prettify
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$view = $bootstrap->getResource('view');
$view->headScript()->prependFile($view->baseUrl("/js/wmd/wmd.js"))
                   ->prependScript('wmd_options = {"output": "Markdown"};')
                   ->prependFile($view->baseUrl("/js/prettify/prettify.js"));
$view->headLink()->prependStylesheet($view->baseUrl('/js/prettify/prettify.css'));
}

但如果我希望大多数textareas都支持wmd,我认为将所有这些封装在一个单独的类中可能更好?或某些包装元素?无论哪种方式,如果我能做一些像

这样的事情会更好
$this->addElement(new Application_Form_Element_WmdEditor); 

或类似的东西

如果答案是创建自定义Zend_Form_Element,我该如何去做呢?只需创建一个包含所有标记的自定义视图助手?如果我想让其他装饰器如错误和描述放在textarea和预览div之间呢?

1 个答案:

答案 0 :(得分:1)

创建一个扩展Zend_Form_Element_TextArea的新表单元素类:

final class Application_Form_Element_WmdEditor extends Zend_Form_Element_TextArea {
    public $helper = 'WMDEditor';
}

然后就像你说一个助手一样:

final class Application_View_Helper_WMDEditor extends Zend_View_Helper_FormElement {

     public function WMDEditor($name, $value = null, $attribs = null) {
        //set it up here
     }
}

这样,您还拥有标准表单元素助手的所有优点