2010-10-15 3 views
1

Я создаю приложение с использованием Zend_Framework, и я хотел бы попросить вас дать совет относительно Zend_Form. Все формы на сайте должны быть украшены таблицами, а не списками определений. Моя идея состоит в том, что я должен создать общую форму (без элементов), а затем просто создать ее через сайт и добавить элементы по мере необходимости. Эта общая форма должна будет изменить стандартные декораторы, чтобы вместо списков определений использовались таблицы. Как вы предлагаете это делать? Переопределить метод addElement() Zend_Form, чтобы он менял декораторы новых элементов?Советы по Zend_Form

Но есть еще одно предостережение. При необходимости должна быть возможность использовать другой набор декораторов для определенного элемента. Поэтому я немного озадачен, как это сделать. У тебя есть какой-нибудь совет?

ответ

1

Используйте промежуточный класс для вашей проектной широкой конфигурации. Затем вы расширить этот класс вместо Zend_Form

файл My/Form.php

<?php 
abstract class My_Form extends Zend_Form { 

    public function __construct ($options = null) { 
     parent::__construct($options); 

     $this->setElementDecorators(array(
       // the base <input, <select, <textarea markup 
       'ViewHelper', 

       // wrap that into a <div class="input-wrap" /> 
       array (
        'HtmlTag', 
        array (
         'tag' => 'div', 
         'class' => 'input-wrap', 
        ) 
       ), 

       // append errors in <ul/li> 
       'Errors', 

       // then prepend <label markup 
       'Label', 
      )); 
    } 
} 

затем в файле My/Form/Demo.php

<?php 
class My_Form_Demo extends My_Form { 

    public function init() { 
     // Your elements here 
    } 
} 

Вы можете сделать это для конкретного элемента, а

файл My/Form/Element/Group.php

<?php 
class My_Form_Element_Group extends Zend_Form_Element_Select { 

    public function init() { 
     // Specific options 
     $this->addMultiOptions(array(
      'A' => 'group A', 
      'B' => 'group B', 
     )); 

     // This element doesn't need the div.input-wrap 
     $this->removeDecorator('HtmlTag'); 
    } 
} 
2

Нет простого способа переопределить декораторы по умолчанию. Решение, которое я использую, состоит в том, чтобы переопределить все элементы и переопределить метод loadDefaultDecorators.

Проблема в том, что каждый элемент имеет определенный набор декораторов. Например, скрытому элементу нужен только декоратор ViewHelper, а файловому элементу нужны файлы, ошибки, описание, HtmlTag (td), ярлык (th), HtmlTag (tr).

Вы также можете использовать Zend_Form :: setElementDecorators в конце вашего метода init (после вызовов addElement). Но вам нужно настроить его для каждой формы ...

Смежные вопросы