【问题标题】:[symfony 4]Filter CollectionType[symfony 4]过滤器集合类型
【发布时间】:2018-11-06 15:27:31
【问题描述】:

我使用一个学生实体和一个 ActivityStudent 实体来管理学生注册。 学生必须有一堂课。所以对于题字,我做了一个这样的 CollectionType:

RegistrationType.php

$builder
->add('StudentsNonSubscribe', CollectionType::class, array(
    'entry_type' => StudentRegistrationType::class,
    'by_reference' => true
));

StudentRegistrationType.php

$builder
            ->add('id', HiddenType::class)

            ->add('barCode')
            ->add('firstname')
            ->add('name')
            ->add('phone_number')
            ->add('Activity', EntityType::class, array(
                'class' => Activity::class,
                'choice_label' => "name",
                'expanded' => true,
                'mapped' => false))
            ->add('Departure', EntityType::class, array(
                'class' => ActivityScanPlace::class,
                'choice_label' => 'name',
                'expanded' => true,
                'mapped' => false
            ))
            ->add('needEquipement', CheckboxType::class, array('required' => false, 'mapped' => false))
            ->add('needLesson', CheckboxType::class, array('required' => false, 'mapped' => false))
            ->add('save', SubmitType::class, array('label' => 'Save'))
                ;

这里显示了所有学生,我希望仅限于 ActivityStudent 中的学生。 为了更好地理解,我将放置三个重要的实体: ActivityStudent.php

class ActivityStudent
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;


/**
 * @var needEquipement
 *
 * @ORM\Column(name="need_mequipement", type="boolean", nullable=true)
 */
private $needEquipement;

/**
 * @var needLesson
 *
 * @ORM\Column(name="need_lesson", type="boolean", nullable=true)
 */
private $needLesson;

/**
 * @var \ActivityScanPlace
 *
 * @ORM\ManyToOne(targetEntity="ActivityScanPlace")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_scan_place", referencedColumnName="id")
 * })
 */
private $idScanPlace;

/**
 * @var \Student
 *
 * @ORM\ManyToOne(targetEntity="Student")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_student", referencedColumnName="id")
 * })
 */
private $idStudent;

/**
 * @var \ActivityOccurence
 *
 * @ORM\ManyToOne(targetEntity="ActivityOccurence")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_activity_occurence", referencedColumnName="id")
 * })
 */
private $idActivityOccurence;

}

Student.php

class Student{

/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @var int
 *
 * @ORM\Column(name="bar_code", type="string", nullable=false)
 */
private $barCode;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="born_date", type="date", nullable=false)
 */
private $bornDate;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=125, nullable=false)
 */
private $name;

/**
 * @var string
 *
 * @ORM\Column(name="firstname", type="string", length=125, nullable=false)
 */
private $firstname;

/**
 * @var bool
 *
 * @ORM\Column(name="sex", type="boolean", nullable=false)
 */
private $sex;

/**
 * @var string|null
 *
 * @ORM\Column(name="email", type="string", length=100, nullable=true)
 */
private $email;

/**
 * @var string|null
 *
 * @ORM\Column(name="phone_number", type="string", length=25, nullable=true)
 */
private $phone_number;

/**
 * @var \Address
 *
 * @ORM\ManyToOne(targetEntity="Address")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_address", referencedColumnName="id")
 * })
 */
private $idAddress;

/**
 * @var \Class
 *
 * @ORM\ManyToOne(targetEntity="Class_")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_class_", referencedColumnName="id")
 * })
 */
private $idClass;

/**
 * @var \Company
 *
 * @ORM\ManyToOne(targetEntity="Company")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_company", referencedColumnName="id")
 * })
 */
private $idCompany;}

Class_.php

class Class_
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\Column(name="level", type="integer", nullable=false)
     */
    private $level;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=25, nullable=false)
     */
    private $name;

    /**
     * @var \Day
     *
     * @ORM\ManyToOne(targetEntity="Day")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_day", referencedColumnName="id")
     * })
     */
    private $idDay;

    /**
     * @var \Teacher
     *
     * @ORM\ManyToOne(targetEntity="Teacher")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_teacher", referencedColumnName="id")
     * })
     */
    private $idTeacher;

    /**
     * @var \Student
     *
     * @ORM\OneToMany(targetEntity="Student", mappedBy="idClass", cascade="all")
     * @ORM\OrderBy({"name" = "ASC"})
     */
    private $students;


    public function __construct() {
        $this->students = new \Doctrine\Common\Collections\ArrayCollection();
    }



    public function addStudent(Student $student)
    {
        $this->students[] = $student;
        $student->setIdClass($this->getId());

        return $this;
    }

    public function setStudents($students)
    {
        $this->students = $students;
    }
}

只需要一种不显示 ActivityStudent 中的学生的方法,而我不知道如何从 CollectionType 中做到这一点。 如果您有完整的答案甚至是曲目,我将很乐意接受。先感谢您 ! : D

【问题讨论】:

  • 您可以尝试在 StudentRegistrationType 中添加addEventListener(FormEvents::PRE_SET_DATA (...) 以仅为您想要的人构建表单。另一种方法是为 RegistrationType 创建一个 DTO,您可以在其中仅使用您需要的那些过滤 StudentRegistration 的集合。 (不确定我是否可以理解......)

标签: php symfony-forms symfony4


【解决方案1】:

我添加了addEventListener(FormEvents::PRE_SET_DATA) 它的工作完成了。我使用过这个页面:symfony 的官方文档:https://symfony.com/doc/current/form/events.html

我是这样做的:

  • 在 buildForm 内部:$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {....}

  • 您需要获取表单和数据。在这里,我得到了 ID 并操作了我的查询。

    $form = $event->getForm(); $id = $event->getData()->getId(); $查询 = .....;

我执行getOnOrNullResult()

if($result == null){
 //TODO : $form .....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2011-04-09
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多