[symfony 4] Фильтр CollectionType - PullRequest
       7

[symfony 4] Фильтр CollectionType

0 голосов
/ 06 ноября 2018

Я управляю зачислением студентов в студенческую организацию, а также в группу 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 голосов
/ 14 ноября 2018

Я добавляю addEventListener(FormEvents::PRE_SET_DATA) Это работа завершена. У меня есть эта страница: Официальный документ от Symfony: https://symfony.com/doc/current/form/events.html

Я сделал это так:

  • Внутри buildForm: $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {....}

  • Вам необходимо получить форму и данные. Здесь я получаю идентификатор и управляю запросом.

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

Я выполняю getOnOrNullResult()

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