Zend_Form переопределяет значения элемента по умолчанию для пользовательского макета

В настоящее время я пытаюсь создать простой пользовательский слой, который буду расширять вместо 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. Я оборачиваю метку в «td», а декоратор метки применяет «id» по умолчанию к этому «td», но я также хочу добавить класс к этому «td».

Есть ли способ сделать это с помощью этого массива? Если нет, есть ли лучший способ сделать это? Или, если да, может ли кто-нибудь описать мне, как работает этот массив?

Желаемый результат:

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

Спасибо.


person KSolo    schedule 09.02.2010    source источник


Ответы (2)


Я нашел решение, хотя и не уверен, что оно лучшее.

Здесь я решил просто создать собственный декоратор и вместо этого загрузить его.

/**
 * 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);
        }
        //...
    }
}

Хотя это прекрасно работает, мне все еще интересно, есть ли более простой способ сделать это.

Любые идеи?

person KSolo    schedule 10.02.2010

Быстрый прием, который я использовал при решении той же проблемы:

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' => 'th')),

Итак, в вашем столбце «label» есть элементы TH, а в столбце элементов - элементы TD.

Затем вы можете стилизовать их по своему усмотрению.

person timdev    schedule 22.11.2010