В настоящее время я играю с HTML_QuickForm для создания форм в PHP. Кажется, что это немного ограничено тем, что трудно вставить мой собственный javascript или настроить отображение и группировку определенных элементов.
Есть ли альтернативы QuickForm, которые могут обеспечить большую гибкость?






Если вам сложно вставить Javascript в элементы формы, рассмотрите возможность использования инфраструктуры JavaScript, такой как Прототип или jQuery. Там вы можете централизовать задачу внедрения обработки событий в элементы управления формы.
Под этим я подразумеваю, что вам не нужно вставлять обработчики событий в код HTML-формы. Вместо этого вы регистрируете эти события откуда-то еще. Например, в Prototype вы можете написать что-то вроде этого:
$('myFormControl').observe('click', myClickFunction)
Также посмотрите ответы на Другой вопрос.
/ EDIT: конечно, вы также можете вставлять настраиваемые атрибуты и, следовательно, обработчики событий в элементы формы, используя HTML_QuickForm. Однако вышеупомянутый способ лучше.
Я обнаружил, что пакет Zend_Form для Zend Framework особенно гибок. Этот компонент также можно использовать с Zend_Dojo для быстрой реализации распространенных помощников форм javascript. Однако компонент не зависит от библиотеки, которую вы используете, но наивно поддерживает Dojo. Компонент также позволяет группировать, многостраничные формы, настраиваемые декораторы, валидаторы и другие функции, что делает его очень гибким.
Я второй Zend_Form; он имеет отличную реализацию в стиле ini, которая позволяет очень быстро определять форму:
[main]
vessel.form.method = "post"
vessel.form.elements.name.type = "text"
vessel.form.elements.name.name = "name"
vessel.form.elements.name.options.label = "Name: "
vessel.form.elements.name.options.required = true
vessel.form.elements.identifier_type.type = "select"
vessel.form.elements.identifier_type.name = "identifier_type"
vessel.form.elements.identifier_type.options.label = "Identifier type: "
vessel.form.elements.identifier_type.options.required = true
vessel.form.elements.identifier_type.options.multioptions.IMO Number = "IMO Number";
vessel.form.elements.identifier_type.options.multioptions.Registry organisation and Number = "Registry organisation and Number";
vessel.form.elements.identifier_type.options.multioptions.SSR Number = "SSR Number";
vessel.form.elements.identifier.type = "text"
vessel.form.elements.identifier.name = "identifier"
vessel.form.elements.identifier.options.label = "Identifier: "
vessel.form.elements.identifier.options.required = true
vessel.form.elements.identifier.options.filters.lower.filter = "StringToUpper"
vessel.form.elements.email.type = "text"
vessel.form.elements.email.name = "email"
vessel.form.elements.email.options.label = "Email: "
vessel.form.elements.email.options.required = true
vessel.form.elements.owner_id.type = "hidden"
vessel.form.elements.owner_id.name = "owner_id"
vessel.form.elements.owner_id.options.required = true
; submit button
vessel.form.elements.submit.type = "submit"
vessel.form.elements.submit.name = "Update"
vessel.form.elements.submit.option.value = "Update"
Я написал об этом статью для OnLamp: Автозаполнение форм PHP
Моя претензия к HTML_QuickForm и Zend_Form и всем другим фреймворкам обработки форм, которые я смог найти, заключается в том, что они, похоже, предполагают, что вы будете писать код для генерации формы. Но это не соответствовало моему процессу разработки, когда я начинал с ВИДА страницы (заданной с помощью HTML-шаблонов) и добавлял к ней функциональные возможности.
С моей точки зрения, обработка форм сводится к:
fillInFormValues () делает 2, 3 и 5 очень простыми.
+1 от меня. Я полностью с вами согласен, и мне очень нравится внешний вид вашего класса fillInFormValues ().
Ссылка больше не действительна.
С Zend_Form вполне возможно начать визуально с вашей формы, а затем работать с обратными словами.
Это делается путем удаления всех декораторов и замены их декоратором ViewScript.
$this->form->setDecorators( array(array('ViewScript', array('viewScript' => 'forms/aform.phtml'))));
И в этом сценарии просмотра вы бы сделали что-то вроде этого:
<?=$this->element->title->renderViewHelper()?>
Следуя этому подходу, вы можете делать с формой все, что захотите.
Еще одна замечательная особенность Zend_Form заключается в том, что вы можете создавать собственные элементы, которые могут инкапсулировать в них другие вещи. Например, у вас может быть элемент, который выводит текстовое поле, а затем некоторый Javascript, чтобы превратить его в область WYSIWYG.
Я не могу ничего сказать об этом, но на днях я наткнулся на библиотеку форм рыба-клон. Это выглядело достаточно многообещающе, чтобы оказаться в моем списке закладок как «посмотрите на это позже».
Спасибо за предложение. Звучит очень полезно, и я обязательно его проверю.