我正在尝试使用自定义表单类型实现Facebook风格的自动完成字段。JavaScript小部件依赖于类名,因此我将其添加到自定义表单类型类中的attr键中,就像我在其他地方所做的那样,但由于某种原因,它从未显示在输出HTML中:-
相关代码:
class AutocompleteType extends AbstractType
{
protected $em;
public function __construct(ObjectManager $em)
{
$this->em = $em;
}
public function getDefaultOptions(array $options)
{
return array(
'attr' => array(
'class' => 'autocomplete',
'data-autocomplete' => '{"url":"'.$options['url'].'"}'
)
);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'url' => false,
'object' => false,
'repository' => false,
'field' => false
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new AutocompleteTransformer($this->em, $options['object'], $options['repository'], $options['field']);
$builder->addModelTransformer($transformer);
}
/**
* {@inheritdoc}
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars = array_replace($view->vars, array(
'url' => $options['url'],
'object' => $options['object'],
'repository' => $options['repository'],
'field' => $options['field']
));
}
public function getParent()
{
return 'text';
}
public function getName()
{
return 'autocompleter';
}
}
生成的HTML:
<input type="text" required="required" name="post[Tags]" id="post_Tags">
预期HTML <input type="text" class="autocomplete" data-autocomplete="url/passed/from/builder" required="required" name="post[Tags]" id="post_Tags">
有三种方法,我不知道哪一种更好
1)在buildForm()方法下,你可以获取和设置属性'attr':
public function buildForm(FormBuilderInterface $builder, array $options)
{
$attrs = $builder->getAttribute('attr');
...
$builder->setAttribute('attr', $attrs);
}
2)另一种方法是在构建视图下设置属性,我认为这更符合逻辑
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars['attr'] = array_merge(array(
....
), $view->vars['attr']);
}
3)最新的方法是将它们直接作为视图中的变量传递,而不是在'attr'中传递,然后在适当的分支块中显示它们。
我认为第三种方法是最好的,但我不确定。