Zend:如何在使用addElement()作为工厂时将装饰器添加到表单元素?

时间:2012-01-31 09:33:10

标签: php zend-framework zend-form

正如标题所暗示的,我在Zend Framework中有一个关于装饰器的问题。请考虑以下代码示例:

$this->addElement('select', 'DisplayUntil', array(
    'label' => 'Display until:',
    'multiOptions' => $this->getOptions(),
    'filters' => array(
        'HTMLEntities',
        'StringTrim',
    ),
    'validators' => array(
        'Int',
    ),
));

这是我向表单添加元素的首选方法。在尝试建立最佳实践时,我已经标准化了使用工厂方法而不是方法链。为什么?我个人觉得它更具可读性,它缩短了我自定义表单类的长度,即编码更少。上面的示例工作得非常好,但是,我很难找到文档或示例,其中使用相同的方法添加装饰器。因此,在添加装饰器时,我假设使用相同的代码片段,您将执行以下操作:

$this->addElement('select', 'DisplayUntil', array(
    'label' => 'Display until:',
    'multiOptions' => $this->getOptions(),
    'filters' => array(
        'HTMLEntities',
        'StringTrim',
    ),
    'validators' => array(
        'Int',
    ),
    'decorators' => array(
        'ViewHelper', 
        'Label' => array(
            'tag' => 'dt'
        ),
        'HtmlTag' => array(
            'tag' => 'div',
            'openOnly' => true,
            'id' => 'divDisplayUntil',
            'placement' => 'prepend',
        ),
    ),
));

不幸的是我在注册表中找不到“名称插件'Dt';使用路径:Zend_Form_Decorator_:Zend / Form / Decorator /”错误消息。我是Zend的新手,如果有人能告诉我如何使前面的代码示例有效,我将不胜感激?这种方法甚至可能吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

装饰者似乎还有一层数组。这是1.1x手册:

$this->addDecorators(array(
    array('ViewHelper'),
    array('Errors'),
    array('Description', array('tag' => 'p', 'class' => 'description')),
    array('HtmlTag', array('tag' => 'dd')),
    array('Label', array('tag' => 'dt')),
));

所以在你的情况下试试

'decorators' => array(
    array('ViewHelper'), 
    array('Label', array(
        'tag' => 'dt'
        )
    ),
    array('HtmlTag', array(
        'tag' => 'div',
        'openOnly' => true,
        'id' => 'divDisplayUntil',
        'placement' => 'prepend',
        )
    ),
),