Comments 20
На мой взгляд в Symfony библиотека классов элементов форм (вджетов) реализована на порядок лучше. C этой точки зрения Zend уступает Symfony.
Хотелось бы почитать статью о создании аналогичного элемента на симфони. Кстати, речь про первую или вторую?
А симпатично получилось!
>> Здесь стоит заметить, что код нуждается в дополнение, т.к. в случае, если на странице будет
>> больше одного такого элемента, то нет необходимости в повторном подключении скриптов и css.
так ежели бы родными headScript, headLink или ZendX_JQuery_Container пользовались, даж думать об этом не пришлось, да и писать поменьше
>> $xhtml .= '/>'. PHP_EOL;
а вот тут следовало бы воспользоваться $this->view->doctype()->isXhtml() для определения необходимости слэша
>> if (!empty($value))
получается '0' в такое поле не записать. Хотя, может для вашей задачи это не имеет значения
>> url: '". $options['autocomplete_script']. "',
ну и это не кошерно. Есть же Zend_Json, который корректно заэнкодил бы
Да и вообще я бы в данном случае экстендил хелпер formText, там половина вашего кода хэлпера уже написана
>> больше одного такого элемента, то нет необходимости в повторном подключении скриптов и css.
так ежели бы родными headScript, headLink или ZendX_JQuery_Container пользовались, даж думать об этом не пришлось, да и писать поменьше
>> $xhtml .= '/>'. PHP_EOL;
а вот тут следовало бы воспользоваться $this->view->doctype()->isXhtml() для определения необходимости слэша
>> if (!empty($value))
получается '0' в такое поле не записать. Хотя, может для вашей задачи это не имеет значения
>> url: '". $options['autocomplete_script']. "',
ну и это не кошерно. Есть же Zend_Json, который корректно заэнкодил бы
Да и вообще я бы в данном случае экстендил хелпер formText, там половина вашего кода хэлпера уже написана
ну и по Jquery
>> .ajax({
>> url: '". $options['autocomplete_script']. "',
>> dataType: 'json',
>> success: function() {
>> tl_$elemId.getContainer().removeClass('textboxlist-loading');
>> }
>> })
ни к чему писать так многосложно
>> .getJSON('". $options['autocomplete_script']. "', function() {
>> tl_$elemId.getContainer().removeClass('textboxlist-loading');
>> })
>> .ajax({
>> url: '". $options['autocomplete_script']. "',
>> dataType: 'json',
>> success: function() {
>> tl_$elemId.getContainer().removeClass('textboxlist-loading');
>> }
>> })
ни к чему писать так многосложно
>> .getJSON('". $options['autocomplete_script']. "', function() {
>> tl_$elemId.getContainer().removeClass('textboxlist-loading');
>> })
Этот код из мануала по плагину. доработкой не заморачивался.
А ещё в Zend есть понятие SubForm. Ваш элемент не сможет работать в составе SubForm, потому что
>> $id = $name;
а name у вложенных в SubForm элементов такого вида: subformname[elementname]
>> $id = $name;
а name у вложенных в SubForm элементов такого вида: subformname[elementname]
И последнее.
В Zend вообще и в Zend_Form в частности метод setOptions имеет fallback на неизвестные ключи в поиска метода setOptionKeyName().
Если следовать стандартам, то вы должны бы были не объявлять сомнительный public $options (сбивающий с толку, так как не имеет прямого и логичного отношения к методу setOptions()), а объявить отдельные члены класса и сеттеры для них с соответствующими именами. И, тогда, setOptions вообще не надо было бы перекрывать.
И, кстати, в стандарте Zend ключи options следует писать camelCase. Что как раз и позволяет имя ключа превратить в setter = 'set'. ucfirst($key) (см. Zend_Form_Element, строка 353)
перечисление options получилось немного более многосложным, но в тоже время и более гибким и соответствующим принципам Zend
В Zend вообще и в Zend_Form в частности метод setOptions имеет fallback на неизвестные ключи в поиска метода setOptionKeyName().
Если следовать стандартам, то вы должны бы были не объявлять сомнительный public $options (сбивающий с толку, так как не имеет прямого и логичного отношения к методу setOptions()), а объявить отдельные члены класса и сеттеры для них с соответствующими именами. И, тогда, setOptions вообще не надо было бы перекрывать.
И, кстати, в стандарте Zend ключи options следует писать camelCase. Что как раз и позволяет имя ключа превратить в setter = 'set'. ucfirst($key) (см. Zend_Form_Element, строка 353)
перечисление options получилось немного более многосложным, но в тоже время и более гибким и соответствующим принципам Zend
Хотя нет. Есть ещё что сказать. Не сочтите за троллинг, наоборот — я рад появлению вашего материала, но конституция заставляет меня указывать на изъяны в материале, цель которого — просвящение.
Ваш элемент немного не самостоятелен. Он способен жить только в контексте. Ему необходимо чтобы файлы лежали на своих местах (те, что в defaultOptions), ему нужен jquery.
Можно чуточку отвязать его от необходимости в контексте.
Если используете $this->jquery (ZendX_JQuery_Container), то очень к месту была бы строчка в рендере
$this->query->enable();
элемент сам бы включал jquery на страницу.
Ваш элемент немного не самостоятелен. Он способен жить только в контексте. Ему необходимо чтобы файлы лежали на своих местах (те, что в defaultOptions), ему нужен jquery.
Можно чуточку отвязать его от необходимости в контексте.
Если используете $this->jquery (ZendX_JQuery_Container), то очень к месту была бы строчка в рендере
$this->query->enable();
элемент сам бы включал jquery на страницу.
+ использование $this->jquery->addOnload() убрало бы запуск ajax'а в $(documet).ready и вообще сделало бы на 1 тег script меньше (наверняка же на onload уже что-то есть)
Да, спасибо. про многое из вами сказанного впервые слышу. полезно ;)
Подскажите, как быть, если элемент вызывается ajax'ом (например, в каком-нить попапе грузится форма)? Как в этом случае на него навесить js код, чтобы элемент заработал, если код прописан в $this->jquery->addOnload()?
Понятное дело, что речь идет о самостоятельном элементе.
Понятное дело, что речь идет о самостоятельном элементе.
Увы, я не знаю качественного решения
Если элемент использует jQuery, то его следует насделовать от ZendX_JQuery_Form_Element_UiWidget. Обект этого класса конфигурируется параметрами через методы setJQueryParam и setJQueryParams.
Соотв. эти параметры находятся в хелпере, кот отрисовывает элемент, и инкодятся с помощью ZendX_JQuery::encodeJson() — его фишка в enableJsonExprFinder => true
Соотв. эти параметры находятся в хелпере, кот отрисовывает элемент, и инкодятся с помощью ZendX_JQuery::encodeJson() — его фишка в enableJsonExprFinder => true
Да, так было бы многократно круче, однако следует понимать, что
ZendX/JQuery/View/Helper/UiWidget.php
62: ->uiEnable();
т.е. JQueryUI придётся таскать с собой в пустую
ZendX/JQuery/View/Helper/UiWidget.php
62: ->uiEnable();
т.е. JQueryUI придётся таскать с собой в пустую
Полностью с вами согласен. Однако на больших проектах я обычно юзаю jQueryUI (всегда понадобится dialog, calendar и прочие повседневные виджеты), поэтому для меня это неактуальная проблема!
P.S. К тому же на jQueryUI можно писать кастомные виджеты, вот хорошая статья на эту тему.
P.S. К тому же на jQueryUI можно писать кастомные виджеты, вот хорошая статья на эту тему.
Возможно, я ошибаюсь, но вот тут:
не должно быть нечто типа:
$xhtml .= <фрагмент кода выше>?
Просто это, как я понимаю, сгенеренный javascript, который не добавляется
в $xhtml.
$.getJSON('" . $options['autocomplete_script'] . "', null, function (data) {
tl.plugins['autocomplete'].setValues(data);
tl.getContainer().removeClass('textboxlist-loading');
});";
не должно быть нечто типа:
$xhtml .= <фрагмент кода выше>?
Просто это, как я понимаю, сгенеренный javascript, который не добавляется
в $xhtml.
Sign up to leave a comment.
Zend_Form_Element: создание своего элемента