в проекте, который я пишу с Symfony, в формах очень часто будут наборы полей, поэтому я хотел бы создать механизм, чтобы я мог группировать поля по наборам полей и по-прежнему использовать метод __toString() моих форм. На этой странице я прочитал о sfWidgetFormSchema и о том, как его можно рассматривать как виджет, который позволяет вкладывать поля. Итак, вот что я сделал: я создал вложенные поля:
$this->setWidgets(array(
'customer' => new sfWidgetFormSchema(array(
'customer_name' => new sfWidgetFormInputText(),
'customer_email' => new sfWidgetFormInputText(array())
)),
'library' => new sfWidgetFormSchema(array(
'library_name' => new sfWidgetFormInputText(),
'library_address' => new sfWidgetFormInputText(),
'library_city' => new sfWidgetFormInputText(),
'library_postcode' => new sfWidgetFormInputText(),
'library_website' => new sfWidgetFormInputText()
)),
'message' => new sfWidgetFormTextarea(array(),array( "cols" => 50, "rows" => 10 )),
));
Затем я создал класс fieldsetFormSchemaFormatter, который в основном оборачивает поля в теги, и связал его с полями sfWidgetFormSchema:
foreach (array('customer', 'library') as $fieldset)
{
$this->widgetSchema[$fieldset]->addFormFormatter('tableless',
new tableLessFormSchemaFormatter($this->widgetSchema['customer']));
$this->widgetSchema[$fieldset]->setFormFormatterName('tableless');
$this->widgetSchema[$fieldset]->setNameFormat('%s');
}
$this->widgetSchema->addFormFormatter('fieldset',
new FieldsetFormSchemaFormatter($this->widgetSchema,
'TableLessFormSchemaFormatter'));
$this->widgetSchema->setFormFormatterName('fieldset');
И это просто отлично сработало, я получил свою форму fieldset. У меня проблема с проверкой, которая совсем не описана на странице, на которую я ссылался ранее в этом вопросе. Сообщения об ошибках появляются в верхней части формы для всех полей, кроме поля «сообщение», за которым следует сообщение об ошибке. Я не думаю, что смогу заставить сообщения об ошибках отображаться сразу после строк и по-прежнему использовать конструкцию echo $form, не кодируя что-то уродливое, поэтому я думаю, что пойду с другой реализацией. Я думаю, что виджеты sfWidgetFormSchema предназначены для создания взаимозависимых полей, которые будут иметь глобальные правила проверки.
Как бы вы реализовали эту функциональность набора полей?