Передача данных с контроллера на тип symfony2
если я показываю поле типа "сущность" в моей форме, и я хочу отфильтровать этот тип сущности на основе аргумента, который я передаю от контроллера, как я это делаю.?
//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.
Ответы
Ответ 1
Вы можете передать параметры классу формы следующим образом:
//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);
Ответ 2
Вы можете использовать $plumeOptions
, чтобы передать все свои аргументы, но вам нужно добавить getDefaultOptions()
в PlumeOptionsType
, чтобы указать значение по умолчанию для вашего параметра.
См. Например https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php, чтобы увидеть, как выглядит этот метод.