2012-03-22 7 views
0

У меня есть собственный класс формы, который расширяет базу Zend_Form и определяет декораторы для самой формы и элементов.Класс по умолчанию для элементов формы

А теперь я застрял - как добавить какой-то определенный класс HTML к каждому элементу ввода?

Единственное, что я мог придумать, это переопределить addElement(), но я открыт для лучших решений, если они есть.

+0

Пробовал ли 'get_class_methods ($ formObject)', чтобы узнать, имеются ли какие-либо другие доступные методы, которые могут адресовать ваш запрос? –

+0

@Mike Purcell: Я сейчас смотрю на источники Zend_Form и не могу понять, что может мне помочь. – zerkms

+0

Что значит «особый класс»? Атрибут класса HTML? –

ответ

2

просто другое решение:

class My_Form extends Zend_Form 
{ 
    public function render(Zend_View_Interface $view = null) 
    { 
     foreach ($this->getElements() as $element) { 
      $element->setAttrib('class', 'default'); 
     } 

     return parent::render($view); 
    } 
} 
+1

'if (! $ this -> _ getIsRendered())' вокруг этого метода тело может сэкономить некоторый CPU – zerkms

0

Добавление атрибутов класса HTML для элементов, как этот

$element->setAttrib('class', 'text'): 
or directly 
$element->class = 'text; 
+0

если у него есть 500 элементов, которые вы хотите, чтобы он сделал это вручную? –

+0

, если у него 500 элементов со всем одним и тем же именем класса, конечно, нет, но тогда вам даже не нужен класс, начинающийся с –

+0

К сожалению, это не отвечает на вопрос. Я ** знаю **, как установить класс. И вопрос был «как добавить какой-то конкретный класс HTML к каждому входному элементу?» в автоматическом режиме – zerkms

1

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

Расширение на ответ дается b.b3rn4rd, попробовать что-то вроде:

class My_Form extends Zend_Form 
{ 
    public function render(Zend_View_Interface $view = null) 
    { 
     foreach ($this->getElements() as $element) { 
      //assign the class as some unique identifier that is part of the element 
      //each element requires a unique name so it's a good place to start 
      $element->setAttrib('class', $element->getName()); 
     } 

     return parent::render($view); 
} 

}

+0

Да. Лично я перепробовал 'addEelement' и добавил проверку, если' class' уже существует (чтобы не потерять уже добавленные классы). Но не уверен, почему вы думаете, что мне нужен уникальный класс. Мне нужен тот же класс, который применяется к множеству элементов, вот что «класс» в html для ;-) – zerkms

+0

@zerkms не был уверен, чего вы хотели, чтобы я сделал удар. Рад, что вы нашли свое решение. – RockyFord

1

Я не люблю решения, которые унаследуют Zend_Form, поэтому я придумал еще один способ сделать это.

<?php 

abstract class Application_Style 
{ 

    private $_object; 


    function __construct ($object = null) 
    { 
     if (isset ($object)) 
     { 
      $this->apply ($object); 
     } 
    } 


    function apply ($object) 
    { 
     $this->setObject ($object); 
     if ($this->filter()) 
     { 
      $this->onApply(); 
     } 

     return $object; 
    } 


    function __call ($method, $arguments) 
    { 
     return call_user_func_array (array (
      $this->getObject(), 
      $method 
     ), $arguments); 
    } 


    abstract protected function onApply(); 


    protected function filter() 
    { 
     return true; 
    } 


    function setObject ($_object) 
    { 
     $this->_object = $_object; 
    } 


    function getObject() 
    { 
     return $this->_object; 
    } 
} 




class Application_Style_ElementClass extends Application_Style 
{ 


    function onApply() 
    { 
     foreach ($this->getObject() 
      ->getElements() as $element) 
     { 
      $element->setOptions (array (
       'class' => 'test-class' 
      )); 
     } 
    } 


    function filter() 
    { 
     return $this->getObject() instanceof Zend_Form; 
    } 
} 


$form = new Zend_Form(); 
$form->addElement ('text', 'name'); 
new Application_Style_ElementClass ($form); // apply the class name 
echo $form; 

Этот способ позволяет применять все стили, необходимые для любой формы в любом порядке.

+0

Возможно, вам захотелось реализовать стратегический паттерн. Конструктор, который делает всю работу, является чем-то неправильным. Кроме того, я думаю, что '$ this-> getObject()' overkill.Внутри одного дерева наследования нет ничего плохого в чтении и записи непосредственно в свойствах. – zerkms

+0

Вы можете быть правы обо всем этом, но это план. Вы можете полностью игнорировать решение, если вам это не нравится. – akond

+0

Мне нравится это как альтернатива ;-) – zerkms

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