我正在尝试使用Symfony2表单组件,尽管Silex微型框架。
$app = $this->app; $constraint = new Assert\Collection(array( 'username' => new Assert\NotBlank(),'password' => new Assert\NotBlank(),)); $builder = $app['form.factory']->createBuilder('form',$data,array('validation_constraint' => $constraint)); $form = $builder ->add('username','text',array('label' => 'Username')) ->add('password','password',array('label' => 'Password')) ->getForm() ; return $form;
问题是生成的表单正在创建如下:
<fieldset> <input type="hidden" value="******" name="form[_token]" id="form__token"> <section class=""> <label class=" required" for="form_username">Username</label> <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div> </section> <section class=""> <label class=" required" for="form_password">Password</label> <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div> </section> <section> <div><button class="fr submit">Login</button></div> </section> </fieldset>
<div><input type="text" value="" name="username" id="username" class="text"></div> ... <div><input type="password" value="" name="password" id="password" class="password"></div>
我已经浏览了网站,并发现了’property_path’选项的建议,但我相信这是用来处理数据的类用于实际的Symfony2框架本身。
我已经通过了表单组件文件,并且要设置的点在:
Symfony / Component / Form / Extension / Core / Type / FieldType.PHP – 第71行
public function buildView(FormView $view,FormInterface $form) { $name = $form->getName(); if ($view->hasParent()) { $parentId = $view->getParent()->get('id'); $parentFullName = $view->getParent()->get('full_name'); $id = sprintf('%s_%s',$parentId,$name); $fullName = sprintf('%s[%s]',$parentFullName,$name); } else { $id = $name; $fullName = $name; } ...
不幸的是,FormFactory使用FormBuilder,然后使用Form类,我没有足够的时间来分析组件的整个内部工作。
我知道这些字段被添加到FormBuilder中的“children”数组中,并具有相应的选项列表。当getForm函数被调用时,一个新的Form被实例化,每个子FieldType都使用add()方法输入到Form中。 Form> add()方法自动将Form设置为每个子项的父项:
public function add(FormInterface $child) { $this->children[$child->getName()] = $child; $child->setParent($this); if ($this->dataMapper) { $this->dataMapper->mapDataToForm($this->getClientData(),$child); } return $this; }
没有开始重写这些类只是为了删除这个还有其他人知道最好的方法只是显示字段名称?
可以在form_div_layout.html.twig widget_attributes块中拖动“name”而不是“full_name”,但我不确定这是否是理想的(因为id保持不变)或者是否有其他方法或注入选项会做的伎俩。
解决方法
而不是使用createBuilder函数:
$builder = $app['form.factory']->createNamedBuilder(null,'form',array('validation_constraint' => $constraint));
第一个参数是表单名称。
例如Bernhard Schussek自己在http://stackoverflow.com/a/13474522/520114