繁体   English   中英

SYMFONY 5 - 表单中的查询生成器

[英]SYMFONY 5 - Query Builder in a form

我在恢复表单中的广告系列名称时遇到了一点问题。 我的表单所做的是显示一个工作正常的用户组和组名,但是活动名称的下拉列表为空,我一直在尝试使用 query_builder 检索活动名称列表但没有成功.. 这是我的 controller代码:

namespace App\Controller;
     
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Entity\VicidialUserGroups;
use App\Form\VicidialUserGroupsType;
use App\Form\CentreApplGrpsType;
use App\Form\VicidialUserGroupsAdminType;
     
class SomeController {   
  
  public function newbyadminAction(Request $request ): Response {
             
    $session = $request->getSession();
    if ($session->get('niveau') !== 9) {
      throw $this->createAccessDeniedException();
    } 
     
    $groupe = new VicidialUserGroups();
    $centreapplgrp = new CentreApplGrps();
    $em = $this->getDoctrine()->getManager();
             
    $idgroupes = $em->getRepository(CentreApplGrps::class)->groupesidparappel($session->get('appel_id'));
    $idcampagnes = $em->getRepository(VicidialUserGroups::class)->campagnesidparappel($idgroupes);
     
    $form = $this->createForm(VicidialUserGroupsAdminType::class, $groupe , array('idcampagnes' => $idcampagnes));
    $form->handleRequest($request);
     
    if ($form->isSubmitted() && $form->isValid()) {
      $centreapplgrp->setUserGroup($session->get('call_triptyque') . '_' . $form->get('userGroup')->getData());
      $centreapplgrp->setCallcenterId($session->get('appel_id'));
      $groupe->setUserGroup($session->get('call_triptyque') . '_' . $groupe->getUserGroup());
      $groupe->setGroupName($session->get('call_triptyque') . '_' . $groupe->getGroupName());

      $em->persist($groupe);
      $em->persist($centreapplgrp);
      $em->flush();
    }
    return $this->render('groupe/nouveau_groupe_par_admin.html.twig', array('form' => $form->createView()));       
  }
}

这是我的表单代码:

namespace App\Form;
    
use App\Entity\VicidialUserGroups;
use App\Entity\VicidialCampaigns;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use App\Repository\VicidialCampaignsRepository;
    
class VicidialUserGroupsAdminType extends AbstractType {
    
  public function buildForm(FormBuilderInterface $builder, array $options {   
    $builder
      ->add('userGroup', TextType::class, array(
        'label' => 'Id Groupe',
        'attr' => array('class' => 'form-control')
      ))
      ->add('groupName',TextType::class, array(
        'label' => 'Nom du groupe',
        'attr' => array('class' => 'form-control')
      ))
      ->add('allowedCampaigns', EntityType::class, array(
        'class' => VicidialCampaigns::class, 
        'label' => 'Campagne',
        'choice_label' => 'campaignName',
        'placeholder' => 'Les campagnes', 
        'attr' => array('class' => 'form-control'),
        'query_builder' => function (VicidialCampaignsRepository $er) use ($options) {
          return $er->formcampagnesparappel($options['campagnesid']);
        }
      ));
  }
    
  public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults([
      'data_class' => VicidialUserGroups::class,
      'campagnesid' => array()
    ]);
  }
}

这是我的 VicidialCampaignsRepository:

namespace App\Repository;
    
use App\Entity\VicidialCampaigns;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
    
/**
 * @method VicidialCampaigns|null find($id, $lockMode = null, $lockVersion = null)
 * @method VicidialCampaigns|null findOneBy(array $criteria, array $orderBy = null)
 * @method VicidialCampaigns[]    findAll()
 * @method VicidialCampaigns[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class VicidialCampaignsRepository extends ServiceEntityRepository {
        
  public function __construct(ManagerRegistry $registry) {
    parent::__construct($registry, VicidialCampaigns::class);
  }
   
  public function formcampagnesparappel($cc) {
    $qb = $this->createQueryBuilder('c')
      ->select('c')
      ->where('c.campaignId IN (:cc)')
      ->setParameter('cc', $cc);
    
    return $qb;
  }
}

这是我的 CentreApplGrpsRepository 代码:

namespace App\Repository;
    
use App\Entity\CentreApplGrps;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
    
/**
 * @method CentreApplGrps|null find($id, $lockMode = null, $lockVersion = null)
 * @method CentreApplGrps|null findOneBy(array $criteria, array $orderBy = null)
 * @method CentreApplGrps[]    findAll()
 * @method CentreApplGrps[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class CentreApplGrpsRepository extends ServiceEntityRepository {

  public function __construct(ManagerRegistry $registry) {
    parent::__construct($registry, CentreApplGrps::class);
  }

  public function groupesidparappel ($centreappl) {
    $qb = $this->createQueryBuilder('g')
      ->select('g.userGroup')
      ->where('g.centreappel = :centreappl')
      ->setParameter('centreappl', $centreappl);
    
    return $qb->getQuery()->getResult();
  }
}

这是我的屏幕截图:在此处输入图像描述

在语句中$form = $this->createForm(VicidialUserGroupsAdminType::class, $groupe, array('idcampagnes' => $idcampagnes)); 表单的选项数组有键'idcampagnes' 然而,您的表格 class 需要在其选项数组'campagnesid'中有一个键。 选项的数组键应该相同。 为了保持一致性,您可能应该将表单调用选项数组更改为array('campagnesid' => $idcampagnes)) ,但这取决于您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM