Symfony 表单中的字段集实现
在我用 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');
它工作得很好,我得到了我的字段集表单。我遇到的问题是验证,我在这个问题中之前链接的页面上根本没有描述这一点。错误消息显示在除“消息”字段之外的所有字段的表单顶部,“消息”字段后面紧接着有一条错误消息。我不认为我能够在行之后显示错误消息,并且仍然使用 echo $form 构造而不编写丑陋的代码,所以我想我会采用另一个实现。 我认为 sfWidgetFormSchema 小部件旨在构建相互依赖的字段,这些字段将具有全局验证规则。
您将如何实现此字段集功能?
on the project I am writing with Symfony, there will be fieldsets in forms very often, so I would like to create a mechanism so that I can group fields by fieldsets and still use the __toString() method of my forms.
On this page, I read about the sfWidgetFormSchema, and how it could be considered as a widget, which enables to nest fields.
So here is what I did:
I created nested fields:
$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 )),
));
Then I created a fieldsetFormSchemaFormatter class, which basically wraps fields in tags, and associated it with the sfWidgetFormSchema fields:
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');
And it just worked fine, I got my fieldset form. The problem I have is with validation, which is not at all described on the page I linked sooner in this question. The error messages appear on top of the form for all fields but the "message" field, which has an error message right after it. I don't think I'm gonna be able to get the error messages to display right after the rows and still use the echo $form construct without coding something ugly, so I think I'm gonna go with another implementation.
I think that sfWidgetFormSchema widgets are meant to build interdependant fields, which would have global validation rules.
How would you implement this fieldset functionality?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是我经过一番研究后得出的结论,它似乎工作正常,但渲染时不再使用位置机制。我想知道这是否会有问题。
如果您想使用格式化程序,则必须实现以下接口:
Here is what I have come up with after some research, it seems to work fine, but the positions mechanism is not used anymore when rendering. I wonder if this can be problematic.
Here is the interface your formatter must implement if you want to use it: