2015-11-05 89 views
0

我的形式是自引用的实体的基础(类具有父类)Symfony2的:如何在窗体类获得动作名称

对于parent领域上,我想有不同的query_builder功能根据动作名。当动作为update时,parent字段(下拉列表)包含所有类别,但编辑类别除外。这很好。但是,当行动是Create new,父窗体字段只包含null值(在我的情况下主要类别)。 这类别窗体类 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数组包含操作名称,但内部非常深。

+0

您需要得到的http://stackoverflow.com/questions/22852664/how-can-i-get-the-action-name-in-a-symfony2-controller的可能重复是来自请求 –

+0

谢谢为答复。我会尝试将操作名称从控制器发送到表单。 – Psyhos

+0

@psyhos写你的结果作为答案,它会更好;) – Veve

回答

0

通行证从您的控制器操作的选项进入建设者,可以作为一个有条件的行动:

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

在我的控制器我alredy使用'行动':'$ form = $ this-> createForm(new CategoryType(),$ entity,array( 'action '=> $ this-> generateUrl('category_update',array('id'=> $ entity-> getId())), 'method'=>'PUT', )); ' – Psyhos

-1

我实现的结果是这样的: 我用EventListener我的表单类。从cookbook 了解到,目前我在CategoryTypebuilForm功能看起来像这样:

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()); 
        }, 
       )); 
      } 
     }); 
    } 

我没有动作(但我仍然不会)。

相关问题