0

カスタム フォーム タイプを使用して 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">
4

1 に答える 1

0

3つの方法がありますが、どれが良いかわかりません

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」ではなくビュー内の変数として直接渡し、適切な小枝ブロックに表示することです。

3番目の方法が最良の方法だと思いますが、よくわかりません。

于 2013-04-13T08:11:20.530 に答える