Zend_Form переопределяющий элемент по умолчанию для пользовательского макета - PullRequest
1 голос
/ 10 февраля 2010

В настоящее время я пытаюсь создать простой пользовательский слой, который я буду расширять вместо 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>

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

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

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

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

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

Есть идеи?

0 голосов
/ 22 ноября 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')),
    );
}

Разница: `массив ('Метка', массив ('тег' => ' th ')),

Таким образом, ваш столбец "label" имеет элементы TH, а ваш столбец элемента имеет элементы TD.

Тогда вы можете стилизовать их так, как захотите.

...