Zend Framework - проблема с Zend_Form Decorator - PullRequest
4 голосов
/ 18 декабря 2008

У меня есть класс, который расширяет Zend_Form следующим образом (упрощенно):

class Core_Form extends Zend_Form
{
    protected static $_elementDecorators = array(
        'ViewHelper',
        'Errors',
        array('Label'),
        array('HtmlTag', array('tag' => 'li')),
    );  

    public function loadDefaultDecorators()
    {
        $this->setElementDecorators(self::$_elementDecorators);
    }
}

Затем я использую этот класс для создания всех моих форм:

class ExampleForm extends Core_Form
{
    public function init()
    {
        // Example Field
        $example = new Zend_Form_Element_Hidden('example');
        $this->addElement($example);
    }
}

В одном из моих представлений мне нужно отобразить только это одно поле (без чего-либо еще сгенерированного Zend_Form). Так что, на мой взгляд, у меня есть это:

<?php echo $this->exampleForm->example; ?>

Это прекрасно работает, за исключением того, что генерирует поле следующим образом:

<li><input type="hidden" name="example" value=""></li>

Это очевидно, потому что я установил в декораторы элементов HtmlTag: tag => 'li'.

Мой вопрос: как я могу отключить все декораторы для этого элемента. Мне не нужны декораторы для скрытых элементов ввода.

Ответы [ 5 ]

5 голосов
/ 18 декабря 2008

лучшее место для его установки - публичная функция loadDefaultDecorators ()

например, вот так:

class ExampleForm extends Core_Form
    {
        public function init()
        {
            //Example Field
            $example = new Zend_Form_Element_Hidden('example');
            $this->addElement($example);
        }

        public function loadDefaultDecorators()
        {
            $this->example->setDecorators(array('ViewHelper'));
        }
    }
3 голосов
/ 28 июня 2009

Если вы отключите декораторы dd / dt для скрытого элемента, у вас будет недействительный XHTML, потому что у вас будет что-то, что не является допустимым элементом в dl. Единственное решение - отключить эти декораторы для всех элементов формы, а не только для скрытых, и отключить их также для всей формы. Для единообразия вы захотите сделать это во всех формах.

ИМХО, это плохое дизайнерское решение в ZF. Я имею в виду, что сказать, что значение ввода - это «определение» термина «семантически», - это милая идея, но она не полностью продумана.

Тот же вопрос здесь: Zend Framework: Как удалить декораторы на скрытом элементе Zend Form?

3 голосов
/ 18 декабря 2008

Сброс декораторов для элемента формы, чтобы использовать только ViewHelper. Например:

<?php echo $this->exampleForm->example->setDecorators(array('ViewHelper')) ; ?>

Очевидно, что представление не идеальное место для этого, но вы поняли идею. Обратите внимание, что вызов setDecorator *** s *** () сбрасывает все декораторы вместо добавления нового.

1 голос
/ 11 мая 2011

Если вы собираетесь добавить элементы таким образом:

$this->addElement(
  'text',
  'a1',
  array('required' => true, 'validators' => array('Alpha'))
);

Вы можете получить теги dd/dt для каждого элемента с помощью:

$this->setElementDecorators(array('ViewHelper'));

или если вы собираетесь добавить элементы другим способом:

$nombre1 = new Zend_Form_Element_Text(
          'n1', 
          array('id'=> 'Nombre1', 'validators' => array('Alpha') )
            );
//$nombre1->setDecorators(array('ViewHelper'));
$this->addElement($nombre1);

Вам необходимо раскомментировать:

//$nombre1->setDecorators(array('ViewHelper'));

для отключения тегов dd/dt. Этот последний способ заключается только в отключении текущего элемента, остальные элементы формы сохраняют теги <dd> <dt> как обычно.

0 голосов
/ 08 января 2011

Вот что я делаю:

class M_Form_Element_Hidden extends Zend_Form_Element_Hidden {
   public function init() {
      $this->setDisableLoadDefaultDecorators(true);
      $this->addDecorator('ViewHelper');
      $this->removeDecorator('DtDdWrapper');
      $this->removeDecorator('HtmlTag');
      $this->removeDecorator('Label');
      return parent::init();
   }
}

Тогда в вашей форме,

$element = new M_Form_Element_Hidden('myElement');
$this->addElement($element);

Источник

...