11

データベースからのエンティティの選択フィールドを持つフォームがあります:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('categories', 'document', array(
        'class' => 'Acme\DemoBundle\Document\Category',
        'property' => 'name',
        'multiple' => true,
        'expanded' => true,
        'empty_value' => false
    ));
}

このフォームはチェックボックスのリストを生成し、次のようにレンダリングされます。

[ ] Category 1
[ ] Category 2
[ ] Category 3

このリストの項目のいくつかを値で無効にしたいのですが、それを行うために選択フィールド項目をどこでインターセプトすればよいかわかりません。

誰かが解決策を知っていますか?

4

2 に答える 2

12

イベントリスナーfinishViewで処理しただけです。PRE_BIND

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('categories', 'document', array(
        'class' => 'Acme\DemoBundle\Document\Category',
        'property' => 'name',
        'multiple' => true,
        'expanded' => true,
        'empty_value' => false
    ));

    $builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) {
        if (!$ids = $this->getNonEmptyCategoryIds()) {
            return;
        }

        $data = $event->getData();

        if (!isset($data['categories'])) {
            $data['categories'] = $ids;
        } else {
            $data['categories'] = array_unique(array_merge($data['categories'], $ids));
        }

        $event->setData($data);
    });
}

...

public function finishView(FormView $view, FormInterface $form, array $options)
{
    if (!$ids = $this->getNonEmptyCategoryIds()) {
        return;
    }

    foreach ($view->children['categories']->children as $category) {
        if (in_array($category->vars['value'], $ids, true)) {
            $category->vars['attr']['disabled'] = 'disabled';
            $category->vars['checked'] = true;
        }
    }
}
于 2013-01-15T20:42:10.323 に答える
12

'choice_attr'inを使用して、選択した値、キー、またはインデックスに応じて、属性$form->add()を追加するかどうかを決定する関数を渡す ことができます。disabled

...
    'choice_attr' => function($key, $val, $index) {
        $disabled = false;

        // set disabled to true based on the value, key or index of the choice...

        return $disabled ? ['disabled' => 'disabled'] : [];
    },
...
于 2015-12-30T09:42:59.313 に答える