Zend_Form覆盖自定义布局的元素默认值

时间:2010-02-09 22:48:50

标签: php zend-framework zend-form decorator

我目前正在尝试构建一个简单的自定义图层,我将扩展而不是Zend_Form。例如,My_Form。

我希望我的所有表单看起来都一样,所以我在My_Form中设置它。这是迄今为止的情况。

class My_Form extends Zend_Form
{
    protected $_elementDecorators = array(
        'ViewHelper',
        'Errors',
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')),
        array('Label', array('tag' => 'td')),
        array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
    );
}

我的所有表格都会扩展这一点。现在这个工作,问题来自$ _elementDecorators数组。我将Label包装在“td”中,Label Decorator将默认的“id”应用于“td”,但我也希望在“td”中添加一个类。

无论如何要用这个数组实现这个目标吗?如果没有,有更好的方法吗?或者如果是这样,有人可以向我描述这个数组是如何工作的吗?

期望的结果:

<tr>
    <td class='label_cell'>
        <label />
    </td>
    <td class='value_cell'>
        <input />
    </td>
</tr>

谢谢。

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,虽然不确定它是最好的。

在这里,我决定只创建一个自定义装饰器并加载它。

/**
 * Overide the default, empty, array of element decorators.  
 * This allows us to apply the same look globally
 * 
 * @var array
 */
protected $_elementDecorators = array(
    'ViewHelper',
    'Errors',
    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')),
    array('CustomLabel', array('tag' => 'td')),
    array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
);

/**
 * Prefix paths to use when creating elements
 * @var array
 */
protected $_elementPrefixPaths = array(
    'decorator' => array('My_Form_Decorator' => 'My/Form/Decorator/')
);

装饰:

class My_Form_Decorator_CustomLabel extends Zend_Form_Decorator_Label
{
    public function render($content)
    {
        //...
        /**
         * Line 48 was added for the cutom class on the <td> that surrounds the label
         */
        if (null !== $tag) {
            require_once 'Zend/Form/Decorator/HtmlTag.php';
            $decorator = new Zend_Form_Decorator_HtmlTag();
            $decorator->setOptions(array('tag'   => $tag,
                                         'id'    => $this->getElement()->getName() . '-label',
                                         'class' => 'label_cell'));

            $label = $decorator->render($label);
        }
        //...
    }
}

虽然这很好用,但我仍然很好奇是否有更简单的方法可以做到这一点。

有什么想法吗?

答案 1 :(得分:0)

在处理相同问题时我最终使用的快速黑客:

class My_Form extends Zend_Form
{
    protected $_elementDecorators = array(
        'ViewHelper',
        'Errors',
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')),
        array('Label', array('tag' => 'th')),
        array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
    );
}

不同之处在于:`array('Label',array('tag'=&gt;' th ')),

所以你的“label”列有TH元素,你的元素列有TD元素。

然后你可以根据自己的喜好设计它们。