【发布时间】: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