【问题标题】:Using entity as parameter for EntityType input filter in symfony在 symfony 中使用实体作为 EntityType 输入过滤器的参数
【发布时间】:2017-10-11 00:54:30
【问题描述】:

我想要做的是使用传递给我的控制器中 createForm 方法的实体来过滤 EntityType 字段。

实体相关:

Employee('1')----('1')User('M')-----('1')TicketQueue('M')----('1')Ticket

用户('M')----('1')票

我想要做的是使用票证关系到票证队列,以便能够将用户字段过滤到仅具有员工个人资料并分配到票证分配到的队列的用户。

到目前为止,这是我所在的位置:

我已成功满足我的一些条件,这些条件是: - 仅具有员工资料的用户 - 仅具有分配队列的用户

但我还没有弄清楚如何使用 where 语句过滤掉 TicketQueue = "whatever the ticket is assigned to"

现在此表单将仅在编辑工单状态和受理人(用户)时使用。

表单类:

class TicketUpdateType extends AbstractType {

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('assignedto', EntityType::class, array('multiple' => false,
                'class' => 'AuthBundle\Entity\User', 'placeholder' => 'Select Personel', 
                    'query_builder' => function (UserRepository $er) {
                        return $er->createQueryBuilder('u')
                        ->select('u') 
                        ->join('u.employee','e')
                        ->join('u.ticketQueues','tq')                                  
                        ->orderBy('u.username', 'ASC');                                                  
                    },
                'label' => "Assigned To:",
                'choice_label' => function
                ($q) {
                    return $q->getEmployee()->getFirstName()." ".$q->getEmployee()->getLastName();
                }, 'attr' => array('class' => 'form-control')))                   
            ->add('ticketstatus', EntityType::class, array('multiple' => false,
                'class' => 'TicketBundle\Entity\TicketStatus', 'placeholder' => 'Select Status','label' => "Ticket Status", 'choice_label' => function
                ($q) {
                    return $q->getName();
                }, 'attr' => array('class' => 'form-control')));               
}

public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
        'data_class' => Ticket::class,
    ));
}
}

编辑:

表格:

class TicketUpdateType extends AbstractType{

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder

            ->addEventSubscriber(new AddQueueFieldSubscriber())                

            ->add('ticketstatus', EntityType::class, array('multiple' => false,
                'class' => 'TicketBundle\Entity\TicketStatus', 'placeholder' => 'Select Status','label' => "Ticket Status", 'choice_label' => function
                ($q) {
                    return $q->getName();
                }, 'attr' => array('class' => 'form-control')));               
}


public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
        'data_class' => Ticket::class,
    ));
}
}

事件订阅者:

class AddQueueFieldSubscriber implements EventSubscriberInterface{

public static function getSubscribedEvents()
{
    // Tells the dispatcher that you want to listen on the form.pre_set_data
    // event and that the preSetData method should be called.
    return array(FormEvents::PRE_SET_DATA => 'preSetData');
}


public function preSetData(FormEvent $event)
{
    $ticket = $event->getData();
    $form = $event->getForm();
    $queue = $event->getData()->getTicketQueue()->getName();

    if ($ticket) {
        $form->add('assignedto', EntityType::class, array('multiple' => false,
                'class' => 'AuthBundle\Entity\User', 'placeholder' => 'Select Personel', 
                    'query_builder' => function (UserRepository $er) use ($queue){
                        return $er->createQueryBuilder('u')
                        ->select('u') 
                        ->join('u.employee','e')
                        ->join('u.ticketQueues','tq')   
                        ->where('tq.name = :queue')        
                        ->orderBy('u.username', 'ASC')
                        ->setParameter('queue', $queue);        
                    },
                'label' => "Assigned To:",
                'choice_label' => function
                ($q) {
                    return $q->getEmployee()->getFirstName()." ".$q->getEmployee()->getLastName();
                }, 'attr' => array('class' => 'form-control')));  
    }
}    
}

【问题讨论】:

  • 为什么不添加到查询生成器:->where('u.TicketQueue = 1') ?
  • 这会适应另一张具有不同队列的票吗?我想要的只是显示与相关票具有相同队列的用户
  • 我认为你需要使用一些多重连接语句 $qb->select('u')->from('AuthBundle\Entity\User', 's') ->join('AuthBundle\ Entity\User', 'e') ->where('u.user=s.user') ->andWhere('u.TicketQueue = s.TicketQueue')
  • 发布您的完整表单类。

标签: php forms symfony filtering query-builder


【解决方案1】:

“我想要做的是使用传递给我的控制器中的 createForm 方法的实体来过滤 EntityType 字段。”

您需要在表单中使用 PRE_SET_DATA 函数: symfony doc

此功能可让您准备表格。

示例:

$builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (FormEvent $event) {
            $form = $event->getForm();
            $entity = $event->getData();

            if (!$entity->getEnabled()) {
                $form->remove('validity');
            }
        }
    );

不要忘记使用控制器中的实体初始化表单:

$form = $this->createForm(TicketUpdateType::class, $yourEntity);

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多