передача данных от контроллера к типу symfony2 - PullRequest
25 голосов
/ 18 октября 2011

, если я показываю поле типа "сущность" в моей форме, и я хочу отфильтровать этот тип сущности на основе аргумента, который я передаю от контроллера, как мне это сделать ..?

//PlumeOptionsType.php
public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('framePlume', 'entity', array(
        'class' => 'DessinPlumeBundle:PhysicalPlume',
        'query_builder' => function(EntityRepository $er) {
                                return $er->createQueryBuilder('pp')
                                    ->where("pp.profile = :profile")
                                    ->orderBy('pp.index', 'ASC')
                                    ->setParameter('profile', ????)
                                ;
                            },

    ));
}

public function getName()
{
    return 'plumeOptions';
}

public function getDefaultOptions(array $options)
{
    return array(
            'data_class'      => 'Dessin\PlumeBundle\Entity\PlumeOptions',
            'csrf_protection' => true,
            'csrf_field_name' => '_token',
            // a unique key to help generate the secret token
            'intention'       => 'plumeOptions_item',
    );
}
}

и внутри контроллера я создаю форму:

i have that argument that i need to pass in my action code:
$profile_id = $this->getRequest()->getSession()->get('profile_id');
...
and then i create my form like this
$form = $this->createForm(new PlumeOptionsType(), $plumeOptions);

$ plumeOptions - это просто класс для сохранения.Но он имеет непосредственное отношение с другим классом, называемым PhysicalPlume.Теперь, когда я хочу отобразить framePlume в своем коде, я хочу показать отфильтрованную сущность PhysicalPlume.

Ответы [ 2 ]

40 голосов
/ 19 октября 2011

Вы можете передать параметры в класс формы следующим образом:

//PlumeOptionsType.php
protected $profile;

public function __construct (Profile $profile)
{
    $this->profile = $profile;
}

Затем используйте его в query_builder вашей buildForm:

$profile = $this->profile;

$builder->add('framePlume', 'entity', array(
    'class' => 'DessinPlumeBundle:PhysicalPlume',
    'query_builder' => function(EntityRepository $er) use ($profile) {
                            return $er->createQueryBuilder('pp')
                                ->where("pp.profile = :profile")
                                ->orderBy('pp.index', 'ASC')
                                ->setParameter('profile', $profile)
                            ;
                        },

));

И, наконец, в вашем контроллере:

// fetch $profile from DB
$form = $this->createForm(new PlumeOptionsType($profile), $plumeOptions);
4 голосов
/ 18 октября 2011

Вы можете использовать $plumeOptions для передачи всего вашего аргумента, но вам нужно будет добавить getDefaultOptions() в PlumeOptionsType, чтобы указать значение по умолчанию для вашего параметра.Смотрите, например, https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php, чтобы увидеть, как должен выглядеть этот метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...