0

最初に、私がやろうとしていることを説明しましょう。

したがって、type (テキスト、電子メール、または multi_option のいずれか) というフィールドを持つ property というエンティティと、プロパティの値である propertyValue という別のエンティティがあります。

だから私はこのチュートリアルを見つけました。私の質問は、単純なフィールドではなく EventListener にあります。他のエンティティの値を持つチェックボックスの選択またはセットを追加するにはどうすればよいですか?

ここに私の EventListener コードがあり、私が直面している問題を確認できます

    <?php
namespace Comehoy\AdBundle\Form\EventListener;

use Symfony\Component\Form\Event\DataEvent;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvents;

class AddValueFieldSubscriber implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        // Tells the dispatcher that we want to listen on the form.pre_set_data
        // event and that the preSetData method should be called.
        return array(FormEvents::PRE_SET_DATA => 'preSetData');
    }

    public function preSetData(DataEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        // During form creation setData() is called with null as an argument
        // by the FormBuilder constructor. We're only concerned with when
        // setData is called with an actual Entity object in it (whether new,
        // or fetched with Doctrine). This if statement let's us skip right
        // over the null condition.
        if (null === $data) {
            return;
        }

        // check if the ProprertyValue object is "new"
        $type = $data->getI18nField()->getProperty()->getType();

        if ('multi_option' === substr($type, 0, 12)) {
            /*
             * 
             * Here is the problem since I'm kind of sure this is not the way to do this
             * 
             */
            $builder = $this->factory->createNamedBuilder('entity', 'value');
            $builder->add('value', 'entity', array(
                'class' => 'ComehoyAdBundle:Translation\AdPropertyOption',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('po')
                        ->orderBy('po.value', 'ASC');
                }
            ));
        } else {
            //It's not a multi option field so we use the type directly
            $form->add($this->factory->createNamed($type, 'value'));
        }
    }
}

だから私が基本的にやろうとしているのは、 $bulder パラメーターを使用して型の buildForm でできることと同じことです

ありがとう

4

1 に答える 1

0
public function preSetData(DataEvent $event)
{
    $data = $event->getData();
    $form = $event->getForm();

    $form->add($this->factory->createNamed('type', 'name', $data->getValue(), array(
            'class' => 'ComehoyAdBundle:Translation\AdPropertyOption',
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('po')
                     ->orderBy('po.value', 'ASC');
            }
    )));
}

SF 2.1を使用している場合は、次のようにします。

public function preSetData(DataEvent $event)
{
    $data = $event->getData();
    $form = $event->getForm();

    $form->add($this->factory->createNamed('name', 'type', $data->getValue(), array(
            'class' => 'ComehoyAdBundle:Translation\AdPropertyOption',
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('po')
                     ->orderBy('po.value', 'ASC');
            }
    )));
}
于 2012-07-02T06:01:32.707 に答える