简体   繁体   English

Symfony2:如何在表单类中获取动作名称

[英]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为updateparent字段(下拉列表)包含所有类别,但已编辑类别除外。 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 ? ifquery_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM