Php 在symfony中将实体用作EntityType输入筛选器的参数
我要做的是使用传递给控制器中createForm方法的实体来过滤EntityType字段 实体是相关的: 员工('1')---('1')用户('M')----('1')票证客户('M')----('1')票证 用户('M')---('1')票证 我想做的是使用ticket与ticketqueue的关系,以便能够将用户字段筛选为仅具有员工配置文件且分配给分配了ticket的队列的用户 到目前为止,这就是我所处的位置: 我成功地满足了以下条件: -仅具有员工档案的用户 -仅限具有指定队列的用户 但我还不知道如何使用where语句筛选出,where TICKTQUEUE=“无论票证分配给什么” 现在,此表单仅在编辑票证状态和受让人(用户)时使用 表格类别:Php 在symfony中将实体用作EntityType输入筛选器的参数,php,forms,symfony,filtering,query-builder,Php,Forms,Symfony,Filtering,Query Builder,我要做的是使用传递给控制器中createForm方法的实体来过滤EntityType字段 实体是相关的: 员工('1')---('1')用户('M')----('1')票证客户('M')----('1')票证 用户('M')---('1')票证 我想做的是使用ticket与ticketqueue的关系,以便能够将用户字段筛选为仅具有员工配置文件且分配给分配了ticket的队列的用户 到目前为止,这就是我所处的位置: 我成功地满足了以下条件: -仅具有员工档案的用户 -仅限具有指定队列的用户 但我
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 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')));
}
}
}
“我要做的是使用传递给控制器中createForm方法的实体筛选EntityType字段。”
您需要在表单中使用PRE_SET_DATA函数:
此功能允许您准备表单
例如:
$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);
祝你好运 为什么不添加到查询生成器:->where('u.TicketQueue=1')?这会适应另一个具有不同队列的票证吗?我想要的是只显示与问题中的票证具有相同队列的用户。我想您需要使用一些多连接语句$qb->select('u')->from('AuthBundle\Entity\User',s')->join('AuthBundle\Entity\User','e')->where('u.User=s.User')->和where('u.TicketQueue=s.TicketQueue')发布完整的表单类。
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) {
$form = $event->getForm();
$entity = $event->getData();
if (!$entity->getEnabled()) {
$form->remove('validity');
}
}
);