[symfony 4]筛选器CollectionType

时间:2018-11-06 15:27:31

标签: php symfony-forms symfony4

我通过学生实体以及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

1 个答案:

答案 0 :(得分:0)

我添加了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(); $ query = .....;

我执行了getOnOrNullResult()

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