Существует ли form-builder (PHP) + validator (client/server) в одном флаконе?

Статус
В этой теме нельзя размещать новые ответы.

AmdY

Пью пиво
Команда форума
Sad Spirit
можно же генератор js сделать через фабрику, чтобы желающие прикрутили любой js фреймворк. а так конечно, нельзя завязываться на jQuery, не им единым.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: AmdY
можно же генератор js сделать через фабрику, чтобы желающие прикрутили любой js фреймворк. а так конечно, нельзя завязываться на jQuery, не им единым.
Генератор делать через фабрику нет особого смысла: код, который он генерирует, простой как валенок.

А библиотеку, методы из которой дёргает генерируемый код, легко поменять можно на вариант на базе jQuery (если его кто-нибудь когда-нибудь напишет).
 

Groove

Новичок
Sad Spirit
есть несколько вопросов/предложений, задам их здесь, вдруг кому-то еще интересно:
============================================================
1) количество создаваемых элементов ограничено, может быть вместо одного абстрактного метода
PHP:
$fsAuth = $form->addElement('fieldset')->setLabel('Auth credentials');
сделать несколько конкретных методов, которые будут создавать и возвращать элемент конкретного типа, тем более что в параметры для них не надо будет передавать мусор, например для fieldset достаточно только $label передавать, ничего другого там нет, максимум возможно понадобится еще addClass().
PHP:
$fsAuth = $form->addFieldset('Auth credentials');
PHP:
    /**
     * Append fieldset to the container
     *
     * @return   HTML_QuickForm2_Container_Fieldset     Added element
     * @param string $label
     */
    function addFieldset($label){
        return $this->addElement('fieldset')->setlabel($label);
    }



    /**
     * Append group to the container
     *
     * @return   HTML_QuickForm2_Container_Group     Added element
     * @param string $name
     */
    function addGroup($name=null){
        return $this->addElement('group',$name);
    }



    /**
     * Append <input type="button" /> to the container
     *
     * @param string $name
     * @param string $value
     * @return   HTML_QuickForm2_Element_InputButton     Added element
     */
    function addInputButton($name, $value){
        return $this->addElement('inputbutton',$name,array('value'=>$value));
    }
============================================================
2) Метод addClass($class) находится в HTML_Common2, что создает некоторые проблемы для автокомплита кода, так как возвращает HTML_Common2
PHP:
   /**
    * Adds the given CSS class(es) to the element
    *
    * @param    string|array    Class name, multiple class names separated by
    *                           whitespace, array of class names
    * @return   HTML_Common2
    */
    public function addClass($class)
может быть добавить проксирование методов для Node и/или Container, чтобы они возвращали нужный тип
PHP:
    /**
    * Adds the given CSS class(es) to the element (proxy-method for IDE autocomplite)
    * @return   HTML_QuickForm2_Container
    */
    public function addClass($class){
        return parent::addClass($class);
    }
в частности это позволит делать конструкции типа
PHP:
$form->addFieldset('Группа элементов')->addClass('class_name')->addInputButton('usr_name','Get User Name');
причем IDE будет предлагать после addClass методы HTML_QuickForm2_Container
понимаю, что IDE вроде как не должна диктовать архитектуру, просто хотелось бы как можно реже заглядывать в код и максимально использовать возможности рабочего места, при это не делая хаки для HTML_QuickForm2 (сейчас именно такими хаками все сделано, это повышает скорость работы)
============================================================
3) Предлагаю еще добавить в Node методы для примера заполнения поля setExample/getExample
и, соответственно, в рендере, и тогда это покрывает практически 99% потребностей при создании формы
http://prntscr.com/xhza
На скриншоте:
жирным - label
красным - сообщение об ошибке
серым - комментарий
бледно-коричневым - пример заполнения поля, по клику вставляется значение в поле по аналогии с формой поиска Яндекс.
============================================================
4) Не могу придумать как для какого-то конкретного поля сделать ajax-проверку, причем чтобы результат проверки учитывался HTML_QuickForm2: JS library
============================================================
Заранее благодарен за ответы

-~{}~ 19.09.10 17:27:

Кстати, Алексей, если ты не против, то я, возможно, хотел бы оформить свои наработки в виде отдельного проекта QuickForm2 + jQuery в стиле документации, где пошагово рассказать что и как, для популяризации так сказать обоих фреймворков.
Туда как раз я добавляю интерфейсные штуки, которых судя по твоим словам не будет "искаропки" в QuickForm2 .
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Groove
Sad Spirit
есть несколько вопросов/предложений, задам их здесь, вдруг кому-то еще интересно:
============================================================
1) количество создаваемых элементов ограничено, может быть вместо одного абстрактного метода
PHP:
$fsAuth = $form->addElement('fieldset')->setLabel('Auth credentials');
сделать несколько конкретных методов, которые будут создавать и возвращать элемент конкретного типа, тем более что в параметры для них не надо будет передавать мусор, например для fieldset достаточно только $label передавать, ничего другого там нет, максимум возможно понадобится еще addClass().
Тут есть 2 проблемы:
1) Количество типов элементов неограничено, потому что есть возможность создавать свои элементы
2) У Container'а уже висит метод __call() который (фактически) преобразует вызов addFieldset(...) в addElement('fieldset', ...)

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

2) Метод addClass($class) находится в HTML_Common2, что создает некоторые проблемы для автокомплита кода, так как возвращает HTML_Common2
PHP:
   /**
    * Adds the given CSS class(es) to the element
    *
    * @param    string|array    Class name, multiple class names separated by
    *                           whitespace, array of class names
    * @return   HTML_Common2
    */
    public function addClass($class)
может быть добавить проксирование методов для Node и/или Container, чтобы они возвращали нужный тип
PHP:
    /**
    * Adds the given CSS class(es) to the element (proxy-method for IDE autocomplite)
    * @return   HTML_QuickForm2_Container
    */
    public function addClass($class){
        return parent::addClass($class);
    }
Мне, честно говоря, эта идея не очень нравится... Вот интересно, а есть ли возможность задать что-то типа @return self, чтобы и phpDocumentor правильно понимал происходящее, и в IDE выдавались правильные подсказки? В принципе, неплохая идея для feature request'ов их авторам. ;)

3) Предлагаю еще добавить в Node методы для примера заполнения поля setExample/getExample
и, соответственно, в рендере, и тогда это покрывает практически 99% потребностей при создании формы
http://prntscr.com/xhza
На скриншоте:
жирным - label
красным - сообщение об ошибке
серым - комментарий
бледно-коричневым - пример заполнения поля, по клику вставляется значение в поле по аналогии с формой поиска Яндекс.
QuickForm2 (как и предыдущая версия, собственно) позволяет задать несколько меток для элемента, надо массив передавать в setLabel() и шаблон доработать (не помню, есть ли это в примерах)

4) Не могу придумать как для какого-то конкретного поля сделать ajax-проверку, причем чтобы результат проверки учитывался HTML_QuickForm2: JS library
Это вопрос или утверждение? :)

Ну для учёта можно повесить доп. правило callback на элемент, работающее только на клиенте, а уже этот callback будет тупо возвращать результат AJAX проверки, когда будет вызвана проверка по onsubmit.

Кстати, Алексей, если ты не против, то я, возможно, хотел бы оформить свои наработки в виде отдельного проекта QuickForm2 + jQuery в стиле документации, где пошагово рассказать что и как, для популяризации так сказать обоих фреймворков.
Туда как раз я добавляю интерфейсные штуки, которых судя по твоим словам не будет "искаропки" в QuickForm2 .
А с чего мне быть против? Наоборот, дополнения, сторонняя документация (если она, кнэшно, не очень от реальности далека) всячески приветствуется!

-~{}~ 19.09.10 21:14:

Собственно, даже уже есть feature request про @return self: http://pear.php.net/bugs/bug.php?id=16223
 

Groove

Новичок
Автор оригинала: Sad Spirit
Тут есть 2 проблемы:
1) Количество типов элементов неограничено, потому что есть возможность создавать свои элементы
2) У Container'а уже висит метод __call() который (фактически) преобразует вызов addFieldset(...) в addElement('fieldset', ...)
Ну это не такие уж и большие проблемы, по первому пункту скажу так: основные элементы уже созданы в виде отдельных классов, для них и предлагаю сделать обертки, в которые передавать только $name, остальное chain-методами.
По второму пункту - я не мог это не заметить, естественно, просто эта вся красота и лаконичность самого кода форм напрочь убивает удобство и скорость разработки имхо, вся эта магия от лукавого.
Вот честно, еще ни разу не встречал довода внушительного почему все так прутся от магии, особенно восторгаясь магии ActiveRecord от RubyOnRails в стиле
ModelName::model()->find_news_name_or_news_url("имя новости"); ведь это все делает код очень зависимым от опечаток, которые потом надо отлавливать.

Автор оригинала: Sad Spirit
Ну и кроме того, в начале разработки мы приняли решение, что конструкторы всех элементов будут единообразны, с тем же набором параметров. Разные параметры для конструкторов в старом QuickForm было напрочь невозможно запомнить.
вот кстати про разные параметры в конструкторах: не знаю, может быть это только у меня так получалось, но код добавления элемента в форму при помощи типового конструктора, в котором сделана попытка соединить функционал и потребности всех возможных наследников путем передачи хитрых массивов, индексы которых тоже надо держать в голове, - весьма пугает. А вот конкретные методы в цепочке - нет.
Поясню примером отсюда:
не удобно, возможно большое количество опечаток:
PHP:
$form->addSelect('name', array('label' => 'My select', 'options' => $options), array('style' => 'color:red'));
удобно, количество опечаток сведено до минимума:
PHP:
$form->addSelect('name')->setLabel('My select')->loadOptions($options);
Автор оригинала: Sad Spirit
Мне, честно говоря, эта идея не очень нравится... Вот интересно, а есть ли возможность задать что-то типа @return self, чтобы и phpDocumentor правильно понимал происходящее, и в IDE выдавались правильные подсказки? В принципе, неплохая идея для feature request'ов их авторам. ;)
Оч. хороший вариант, но пока буду проксировать, хотя и очень не хотелось влезать в код. Все ради своего быстродействия.

Автор оригинала: Sad Spirit
QuickForm2 (как и предыдущая версия, собственно) позволяет задать несколько меток для элемента, надо массив передавать в setLabel() и шаблон доработать (не помню, есть ли это в примерах)
А цель добавления нескольких меток для одного элемента?

Автор оригинала: Sad Spirit
Ну для учёта можно повесить доп. правило callback на элемент, работающее только на клиенте, а уже этот callback будет тупо возвращать результат AJAX проверки, когда будет вызвана проверка по onsubmit.
Спасибо за идею, завтра сделаю. В голову не пришло даже, что во второй версии форм можно правило сделать ТОЛЬКО на клиенте, раньше по-моему было если указываешь клиента, то только тогда он выполняется на клиенте, а серверные проверки были не отключаемыми.

Автор оригинала: Sad Spirit
А с чего мне быть против? Наоборот, дополнения, сторонняя документация (если она, кнэшно, не очень от реальности далека) всячески приветствуется!
Ну, тогда думаю в течение месяца успею доделать демо-сайт с разными формами и вариантами использования.

Автор оригинала: Sad Spirit
Собственно, даже уже есть feature request про @return self: http://pear.php.net/bugs/bug.php?id=16223
Вот и замечательно, возможно одна проблема будет решена сразу на "правильном" уровне, а не костылями
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Groove
вот кстати про разные параметры в конструкторах: не знаю, может быть это только у меня так получалось, но код добавления элемента в форму при помощи типового конструктора, в котором сделана попытка соединить функционал и потребности всех возможных наследников путем передачи хитрых массивов, индексы которых тоже надо держать в голове, - весьма пугает. А вот конкретные методы в цепочке - нет.
Поясню примером отсюда:
не удобно, возможно большое количество опечаток:
PHP:
$form->addSelect('name', array('label' => 'My select', 'options' => $options), array('style' => 'color:red'));
удобно, количество опечаток сведено до минимума:
PHP:
$form->addSelect('name')->setLabel('My select')->loadOptions($options);
Да, тут я согласен, сначала планировалось сделать одинаковые конструкторы, а потом --- уже в процессе --- стало понятно, что гораздо удобнее использовать fluent interfaces.
Ну и хитрый массив, на самом деле, только один. Ибо второй массив --- HTML атрибуты.

А цель добавления нескольких меток для одного элемента?
Ну так одну выводить жирным, вторую --- серым, третью --- бледно-коричневым...
 

Groove

Новичок
Практически готово у меня.
Sad Spirit
Алексей, если не трудно - постучи в аську 77227733 (или jabber:[email protected]), сперва хочу тебе показать, есть пара вопросов.
 

Groove

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

-~{}~ 25.09.10 14:21:

Результат топика:
http://phpclub.ru/talk/showthread.php?s=&threadid=120582&rand=0
http://habrahabr.ru/blogs/php/104834/
http://forum.searchengines.ru/showthread.php?p=7674390

тема закрыта, по крайней мере для меня :)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху