Zend Framework Формы, подчиненные формы и декораторы - PullRequest
1 голос
/ 09 июня 2011

В настоящее время у меня есть приложение Zend Framework с несколькими модулями. Каждый модуль должен использовать один и тот же Zend_Form_Decorator_ViewScript , расположенный в папке default modules /views/scripts.

Без каких-либо изменений модули по умолчанию ищут только сценарии просмотра декоратора форм в своей собственной папке /views/scripts, расположенной под каждым модулем, поэтому, чтобы они загрузили их из папки default modules, мне сначала нужно применить это внутри форма:

$view = new Zend_View();
$view->setScriptPath(APPLICATION_PATH . '/views/scripts');
$this->setView($view);

В этой же форме я создаю несколько Zend_Form_SubForm s, для которых мне нужно снова применить тот же код. Если этого недостаточно, мне нужно применить этот путь к каждому отдельному элементу в каждой SubForm, а также к родительской форме. Кроме того, каждый элемент должен иметь свой ViewScript, определенный каждый раз как:

$username->setDecorators(array(array('ViewScript', array('viewScript' => '/formScripts/wizardElement.phtml'))));

Теперь, все это работает, если я определяю все это для каждого элемента / подчиненной формы / формы в одном и том же файле, но это просто кажется ненужной работой / кодом.

  • Можно ли сначала упростить процесс просто имея родительскую форму определить scriptPath для себя, его элементы, его подчиненные формы и элементы субформ?
  • Могут ли для новых созданных элементов автоматически определяться ViewScripts, определенные для них, в зависимости от типа элемента (т. Е. Поле ввода, флажок, поле выбора, текстовое поле, кнопка и т. Д.)?

В настоящее время я расширяю свою форму непосредственно из значения по умолчанию Zend_Form, у меня не будет проблем с созданием собственной абстрактной формы для расширения моих форм, но особенно с проблемами scriptPath, я не совсем уверен как я должен подойти ко всей этой проблеме.

Применение:

$this->setSubFormDecorators(array(
            'Form',
            array('ViewScript', array('viewScript' => '/formScripts/wizardSubForm.phtml'))            
));

перезаписывает все специфичные для элемента декораторы, которые я применял до этого.

Предложения

1 Ответ

1 голос
/ 16 июня 2011

Может быть, я не получил ваш случай в деталях, но я бы предложил вам создать базовую форму, затем классы базовой формы для каждого модуля, а затем ваши конкретные формы расширить соответствующую форму модуля

My_Base_Form extends Zend_Form
{
   public function init()
   {
     //if you need to init something for all forms
     parent::init();
   }

   public function _createSelect($name)
   {
      $element=new Zend_Form_Element_Select($name);
      $element->setDecorators(
             //decorators for select
         )
      $element->viewScript='select.phtml';
      return $element;
   }
}

My_Default_Form extends My_Base_Form
{
   public function init()
   {

     //what you do to init dirs for this module
     $view = new Zend_View();
     $view->setScriptPath(APPLICATION_PATH . '/views/scripts');
     $this->setView($view);
     parent::init();
   }

   //called automatically by Zend_Form
   public function loadDefaultDecorators()
   {

       parent::loadDefaultDecorators();
       $this->setDefaultFormDecorators($this);
       $this->setButtonDecorators($this);
   }

}
My_Admin_Form extends My_Base_From{}

Чтобы не повторять настройку элементов декораторов, вы можете создать вспомогательные методы, которые сделают это за вас и поместите его в базовый класс формы или в класс формы модуля

Default_Form_Register extends My_Default_Form
{
     public function init()
     {
         $el=$this->_createSelect($name);
         $el->setLabel('Select');
         $this->addElement($el);
         parent::init();
     }
}

вам может понадобиться использовать тот же подход для подчиненных форм, затем поместить базовые классы в вашу библиотеку, и все будет в порядке.

Вы можете вносить общие изменения в зависимости от модуля или типа элемента.

...