[英]Symfony2: How to get action name in form class
My form is on the base of self-referenced entity (category have parent category) 我的表格基于自引用实体(类别具有父类别)
For the parent
field, I want to have different query_builder
function depending of action name. 对于parent
字段,我想根据操作名称使用不同的query_builder
函数。 When action is update
, parent
field (drop-down list) contains all categories, excepting edited category. 当action为update
, parent
字段(下拉列表)包含所有类别,但已编辑类别除外。 This is work good. 这很好。 But, when action is Create new
, parent form field contains only null
value (in my case Main category). 但是,当操作为Create new
,父表单字段仅包含null
值(在我的情况下为Main类别)。 This is category form class CategoryType
class: 这是类别表单类CategoryType
类:
namespace Dimas\CatalogBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;
class CategoryType extends AbstractType {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('name')
->add('parent', 'entity', array(
'label' => 'Parent Category ',
'empty_value' => '- Main level -',
'class' => 'DimasCatalogBundle:Category', 'property' => 'getTreeName',
'required' => false,
'query_builder' => function(EntityRepository $er) use ($options) {
$er->createQueryBuilder('u');
//need only if action is 'update'
$er->where('u.id <> :selfId');
$er->setParameter(':selfId', $options['data']->getId());
// end if
return $er;
},
));
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'Dimas\CatalogBundle\Entity\Category'
));
}
/**
* @return string
*/
public function getName() {
return 'dimas_catalogbundle_category';
}
}
Is it a good idea to add if
in query_builder
? if
在query_builder
添加, if
是个好主意? How to get action name? 如何获得动作名称? $options
array contains action name, but it is so deep inside. $options
数组包含动作名称,但是里面太深了。
Pass in an option into the builder from your controller action that can act as a conditional: 从控制器操作中将选项传递给构建器,该操作可以作为条件:
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($options['action'] === 'update') {
$callable = function (EntityRepository $er)...
} elseif ($option['action'] === 'Create new') {
$callable = function (EntityRepository $er) ...
}
...
'required' => false,
'query_builder' => $callable,
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver
->setDefaults(array(
'data_class' => 'Dimas\CatalogBundle\Entity\Category'
))
->setRequired(['action'])
;
}
// Your controller
public function createNewAction(Request $request)
{
$form = $this->createForm(new CategoryType(), $category, ['action' => 'Create new']);
}
public function updateAction(Request $request)
{
$form = $this->createForm(new CategoryType(), $category, ['action' => 'update']);
}
I achieve result this way: I use EventListener
to my form class. 我通过以下方式获得结果:我将EventListener
用作表单类。 Learned from cookbook Now my builForm
function in CategoryType
class looks like that: 从菜谱中学习现在,我在CategoryType
类中的builForm
函数如下所示:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('name');
$builder->addEventListener(FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($options) {
$category = $event->getData();
$form = $event->getForm();
// check if the Category object is "new"
// If no data is passed to the form, the data is "null".
// This should be considered a new "Category"
if (!$category || null === $category->getId()) {
$form->add('parent', 'entity', array(
'label' => 'Parent Category ',
'empty_value' => '- Main level -',
'class' => 'DimasCatalogBundle:Category', 'property' => 'getTreeName',
'required' => false,
'query_builder' => function(EntityRepository $er) use ($options) {
return $er->createQueryBuilder('u');
},
));
} else {
$form->add('parent', 'entity', array(
'label' => 'Parent Category ',
'empty_value' => '- Main level -',
'class' => 'DimasCatalogBundle:Category', 'property' => 'getTreeName',
'required' => false,
'query_builder' => function(EntityRepository $er) use ($options) {
return $er->createQueryBuilder('u')
->where('u.id <> :selfId')
->setParameter(':selfId', $options['data']->getId());
},
));
}
});
}
I did not get action (but I still wont). 我没有采取行动(但我仍然不会)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.