【问题标题】:Symfony2: How to get action name in form classSymfony2:如何在表单类中获取操作名称
【发布时间】:2015-11-05 14:15:43
【问题描述】:

我的表单基于自引用实体(类别有父类别)

对于parent 字段,我希望根据操作名称具有不同的query_builder 函数。当操作为update 时,parent 字段(下拉列表)包含所有类别,编辑类别除外。这是很好的工作。但是,当操作为 Create new 时,父表单字段仅包含 null 值(在我的情况下为 Main 类别)。 这是类别表格类 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';
    }

}

在query_builder 中添加if 是个好主意吗?如何获得动作名称? $options 数组包含动作名称,但里面太深了。

【问题讨论】:

  • 您需要从请求中获取的stackoverflow.com/questions/22852664/… 的可能副本
  • 感谢您的回复。我会尝试将动作名称从控制器发送到表单。
  • @psyhos 把你的结果写成答案,这样会更好;)

标签: php forms symfony


【解决方案1】:

从您的控制器操作中将一个选项传递给构建器,该选项可以作为条件:

/**
 * @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']);
}

【讨论】:

  • 在我的控制器中我已经使用action : $form = $this-&gt;createForm(new CategoryType(), $entity, array( 'action' =&gt; $this-&gt;generateUrl('category_update', array('id' =&gt; $entity-&gt;getId())), 'method' =&gt; 'PUT', ));
【解决方案2】:

我是这样取得结果的: 我在我的表单类中使用EventListener。向cookbook学习 现在我在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());
                    },
                ));
            }
        });
    }

我没有采取行动(但我仍然不会)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多