Zend_Form За избавление от декораторов по умолчанию - PullRequest
3 голосов
/ 07 декабря 2009

У меня проблемы с удалением набора декораторов по умолчанию с помощью Zend_Form.

Я пытаюсь расширить Zend_Form для реализации другого стиля декоратора.

class CRM_Form extends Zend_Form
{
 public function init()
 {  
  $this->setDisableLoadDefaultDecorators(true);

  $this->addDecorator('FormElements')
->addDecorator('Form');

  $this->setElementDecorators(array(
  'ViewHelper',
  'Label',
 'Errors',
   new Zend_Form_Decorator_HtmlTag(array('tag' => 'p'))
  ));
 }
}

Когда я пытаюсь использовать этот класс следующим образом:

$form = new CRM_Form();
$form->setAction('/')->setMethod('post'); 
$id = $form->createElement('text','id')->setLabel('ID:');
$form->addElement($id);

Используются старые декораторы (список определений), а не стиль моего абзаца.

Если я добавляю addElement () в метод init () класса CRM_Form, они используют стиль, который я установил.

Как заставить все элементы, созданные с использованием этого класса, использовать мой стиль по умолчанию?

Ответы [ 3 ]

1 голос
/ 09 декабря 2009

Когда вы вызываете setElementDecorators в init, у вас нет элементов для украшения, поэтому ничего не происходит. Вместо этого вы можете переопределить функцию Zend_Form :: createElement, которая будет выполнять следующие действия:

  1. Если массив опций содержит список декораторов, просто передайте его без изменений.
  2. Если параметры недоступны, добавьте значения по умолчанию.

..

// not tested
public function createElement($type, $name, $options = null)
{
  if ( !is_array($options) ) {
    $options = array();
  }
  if ( !isset($options['decorators']) ) {
    $options['decorators'] = array(
      'ViewHelper','Label','Errors',
      new Zend_Form_Decorator_HtmlTag(array('tag' => 'p'))
    );
    // I'd make this array a protected class member
  }

  return parent::createElement($type, $name, $options);
}
1 голос
/ 12 декабря 2009

По умолчанию, если вы используете $form->addElement('type', 'name', array('options'=>'example')); формат добавления элементов, Zend_Form будет использовать декораторы, которые вы установили в setElementDecorators.

Если вы сами создаете элементы, а затем передаете их в функцию $form->addElement(), автоматические настройки декораторов не будут выполняться.

Вы можете легко переопределить эту функцию, чтобы установить декораторы для элементов, которые уже созданы, выполнив что-то вроде этого в вашей форме:

public function addElement($element, $name = null, $options = null)
{
  if ($element instanceOf Zend_Form_Element) {
    $element->setDecorators($this->_elementDecortors);
  }
  return parent::addElement($element, $name, $options);
}
0 голосов
/ 07 декабря 2009

Форма Zend украшает Элементы после того, как вы добавите их. Поэтому создайте метод, подобный addAndDecorte:

public function addAndDecorate($element) 
{
   $this->addElement($element);

   // do your decorating stuff..
}
...