Элемент Zend Form с Javascript - Декоратор, View Helper или View Script? - PullRequest
4 голосов
/ 19 сентября 2011

Я хочу добавить javacscript в Zend_Form_Element_Text.

Сначала я думал, что лучший способ сделать это - декоратор, но, поскольку это всего лишь сценарий (разметка не меняется), то, возможно, помощник вида лучше?или сценарий представления?

Кажется, что они все для одной цели (относительно элемента формы).

Я хочу добавить JavaScript, который не является событием (например, изменить, нажать,так далее.).Я могу легко добавить его с помощью headScript (), но я хочу сделать его многоразовым, поэтому я подумал о помощнике декоратора / представления.Мне просто не ясно о разнице между ними.

Какая лучшая практика в этом случае?Преимущества?

ОБНОВЛЕНИЕ: Похоже, что лучше всего использовать помощники представлений из сценариев представлений, чтобы лучше подходили декораторы?

Ответы [ 4 ]

2 голосов
/ 19 сентября 2011

На самом деле я не вижу, где это должен быть декоратор, помощник вида или скрипт вида.

Если бы я хотел присоединить какое-либо поведение на стороне клиента к элементу формы, я бы, вероятно, установил атрибут с $elt->setAttrib('class', 'someClass') или $elt->setAttrib('id', 'someId'), каким-то хуком, к которому может присоединиться мой скрипт. Затем я добавлю слушателей / обработчики к этим целевым элементам.

Например, для обработчика кликов, использующего jQuery, это будет что-то вроде:

(function($){
    $(document).ready(function(){
        $('.someClass').click(function(e){
            // handle the event here
        });
    });
})(jQuery);

Преимущество заключается в том, что оно ненавязчиво, поэтому разметка остается чистой. Надеюсь, javascript - это улучшение, а не критическая часть функциональности, поэтому он постепенно изнашивается.

Возможно, вы имеете в виду, что сам этот сегмент javascript необходимо многократно использовать в разных идентификаторах элементов - someClass, в этом примере. В этом случае вы могли бы просто написать помощник вида, который принимает имя класса CSS в качестве параметра.

2 голосов
/ 19 сентября 2011

Вы можете создать свой собственный декоратор, расширив Zend_From_Decorator_Abstract и сгенерировав свой фрагмент с помощью render() метода:

class My_Decorator_FieldInitializer extends Zend_Form_Decorator_Abstract {
    public function render($content){

        $separator = $this->getSeparator();
        $element = $this->getElement();

        $output = '<script>'.
             //you write your js snippet here, using 
             //the data you have in $element if you need 
             .'</script>';

        return $content . $separator . $output;
    }
}

Если вам нужна дополнительная информация, попросите ее в комментарии, я будуотредактируйте этот ответ.И я не проверял этот код.

2 голосов
/ 19 сентября 2011

Используйте функцию setAttrib.

Например: -

$element = new Zend_Form_Element_Text('test');
$element->setAttrib('onclick', 'alert("Test")');
1 голос
/ 19 сентября 2011

"разметка не меняется", Yap,

но мне нравится добавлять некоторые функции javascript throw ZendForm Element:

$text_f = new Zend_Form_Element_Text("text_id");
$text_f->setAttrib('OnChange', 'someFunction($(this));');

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

...