Форма Symfony EntityType с arrayCollection не отображает каждый объект - PullRequest
0 голосов
/ 11 сентября 2018

В моем приложении у меня есть объект ZoneMaterial, который связывает Zone с набором других объектов. ZoneMaterial Сущность имеет две коллекции arrayCollections: epis и epcs, которые являются другими сущностями. У меня проблема с этими двумя коллекциями.

Связать и отменить связь EPIS и EPCS с моим ZoneMaterial не проблема, но когда я удаляю EPI или EPC из моего ZoneMaterial, я не найду его в следующий раз, когда пойду в мой вид обновления, чтобы связать его снова.

Объект ZoneMaterial настроен следующим образом:

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

    /**
     * @ORM\ManyToOne(targetEntity="Zone", inversedBy="zoneMaterials")
     * @ORM\JoinColumn(name="zone_id", referencedColumnName="id")
     */
    private $zone;

    /**
     * @ORM\ManyToOne(targetEntity="Material")
     * @ORM\JoinColumn(name="material_id", referencedColumnName="id")
     */
    private $material;

    /**
     * @ORM\ManyToOne(targetEntity="Outil")
     * @ORM\JoinColumn(name="outil_id", referencedColumnName="id")
     */
    private $outil;

    /**
     * @ORM\ManyToOne(targetEntity="Process")
     * @ORM\JoinColumn(name="process_id", referencedColumnName="id")
     */
    private $process;

    /**
     * @ORM\ManyToOne(targetEntity="Method")
     * @ORM\JoinColumn(name="method_id", referencedColumnName="id")
     */
    private $method;

    /**
     * @ORM\ManyToOne(targetEntity="DustLevel")
     * @ORM\JoinColumn(name="dustLevel_id", referencedColumnName="id")
     */
    private $dustLevel;

    /**
     * @ORM\ManyToMany(targetEntity="EPC", cascade={"persist"}, orphanRemoval=true)
     * @ORM\JoinTable(name="app_zone_material_epc",
     *      joinColumns={@ORM\JoinColumn(name="zoneMaterial_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="epc_id", referencedColumnName="id")}
     *      )
     */
    private $epcs;

    /**
     * @ORM\ManyToMany(targetEntity="EPI", cascade={"persist"}, orphanRemoval=true)
     * @ORM\JoinTable(name="app_zone_material_epi",
     *      joinColumns={@ORM\JoinColumn(name="zoneMaterial_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="epi_id", referencedColumnName="id")}
     *      )
     */
    private $epis;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     * @Gedmo\Timestampable(on="create")
     */
    private $createdAt;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     * @Gedmo\Timestampable(on="update")
     */
    private $updatedAt;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $deletedAt;

    public function __construct(Zone $zone){
        $this->epcs    = new ArrayCollection();
        $this->epis    = new ArrayCollection();
        $this->setZone($zone);
        $this->createdAt            = new \DateTime('now');
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    public function getZone()
    {
        return $this->zone;
    }

    public function getMaterial()
    {
        return $this->material;
    }

    public function getProcess()
    {
        return $this->process;
    }

    public function getOutil()
    {
        return $this->outil;
    }

    public function setOutil($outil)
    {
        $this->outil = $outil;
    }

    public function getMethod()
    {
        return $this->method;
    }

    public function getDustLevel()
    {
        return $this->dustLevel;
    }

    public function setZone($zone)
    {
        $this->zone = $zone;
    }

    public function setMaterial($material)
    {
        $this->material = $material;
    }

    public function setProcess($process)
    {
        $this->process = $process;
    }

    public function setMethod($method)
    {
        $this->method = $method;
    }

    public function setDustLevel($dustLevel)
    {
        $this->dustLevel = $dustLevel;
    }

    public function addEpc(EPC $e)
    {
        $this->epcs[] = $e;
    }

    public function removeEpc(EPC $e)
    {
        $this->epcs->removeElement($e);
    }

    public function getEpcs()
    {
        return $this->epcs;
    }

    public function addEpi(EPI $e)
    {
        $this->epis[] = $e;
    }

    public function removeEpi(EPI $e)
    {
        $this->epis->removeElement($e);
    }

    public function getEpis()
    {
        return $this->epis;
    }
}

Моя форма определяется следующим образом:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('process', EntityType::class ,    array(  'label'               =>'Processus',
                                                    'choices_as_values'   => true,
                                                    'class'               => 'AppBundle\Entity\Process',
                                                    'query_builder'       =>  function ($repository) use ($options) {
                                                    return $repository
                                                        ->createQueryBuilder('a')
                                                        ->orderBy('a.name', 'ASC');
                                                    }))
    ->add('material', EntityType::class ,   array(  'label'               =>'Matériau',
                                                    'choices_as_values'   => true,
                                                    'class'               => 'AppBundle\Entity\Material',
                                                    'query_builder'       =>  function ($repository) use ($options) {
                                                    return $repository
                                                        ->createQueryBuilder('a')
                                                        ->orderBy('a.name', 'ASC');
                                                    }))
    ->add('method', EntityType::class ,     array(  'label'               =>'Méthode',
                                                    'choices_as_values'   => true,
                                                    'class'               => 'AppBundle\Entity\Method',
                                                    'query_builder'       =>  function ($repository) use ($options) {
                                                    return $repository
                                                        ->createQueryBuilder('a')
                                                        ->orderBy('a.name', 'ASC');
                                                    }))
    ->add('outil', EntityType::class ,     array(   'label'                =>'Outil',
                                                    'choices_as_values'   => true,
                                                    'class'               => 'AppBundle\Entity\Outil',
                                                    'query_builder'       =>  function ($repository) use ($options) {
                                                    return $repository
                                                        ->createQueryBuilder('a')
                                                        ->orderBy('a.name', 'ASC');
                                                    }))
    ->add('dustLevel', EntityType::class ,  array(  'label'               => "Niveau d'empoussièrement",
                                                    'choices_as_values'   => true,
                                                    'class'               => 'AppBundle\Entity\DustLevel',
                                                    'query_builder'       =>  function ($repository) use ($options) {
                                                    return $repository
                                                        ->createQueryBuilder('a')
                                                        ->orderBy('a.name', 'ASC');
                                                    }))
    ->add('epcs', EntityType::class,        array(  'label'               =>'MPC',
                                                    'class'               => 'AppBundle\Entity\EPC',
                                                    'query_builder'       =>  function ($repository) use ($options) {
                                                    return $repository
                                                        ->createQueryBuilder('a')
                                                        ->orderBy('a.name', 'ASC');
                                                    },
                                                    'multiple'            => true,
                                                    'expanded'            => true))
    ->add('epis', EntityType::class,        array(  'label'               =>'EPI',
                                                    'class'               => 'AppBundle\Entity\EPI',
                                                    'query_builder'       =>  function ($repository) use ($options) {
                                                    return $repository
                                                        ->createQueryBuilder('a')
                                                        ->orderBy('a.name', 'ASC');
                                                    },
                                                    'multiple'            => true,
                                                    'expanded'            => true))

    ;
}

и отображается так:

{{ form_start(form, {'action': path('updt_zone_material', {'id':id}), 'method': 'POST'}) }}
<div class="modal-header">
    <h4 class="modal-title" id="smallModalLabel">Matériau lié à la zone</h4>
</div>
<div class="modal-body">
    <div class="row">
        <div class="col-sm-12">
            {{ form_widget(form) }}        
        </div>
    </div> 
</div>
<div class="modal-footer">
    <button type="button" class="btn btn-link waves-effect" data-dismiss="modal">Fermer</button>
    <button type="submit" class="btn btn-primary waves-effect">Modifier</button>
</div>
{{ form_end(form) }}

Кажется, все работает нормально, но когда я удаляю EPC или EPI из ZoneMaterial, я не могу вернуть его обратно, потому что он просто исчезает из списка EPI или EPC в моей форме.

Здесь нет фильтра для выбора элемента для формы:

->add('epcs', EntityType::class, array(
'label'=>'MPC',
'class'=>'AppBundle\Entity\EPC',
'query_builder'=>feach time I remove an element from the entity using the form, I wont find it anymore in my formeach time I remove an element from the entity using the form, I wont find it anymore in my formunction ($repository) use ($options) {
return $repository->createQueryBuilder('a')->orderBy('a.name', 'ASC');
},
'multiple'=>true,

Почему каждый раз, когда я удаляю элемент из сущности, используя форму, я больше не найду его в своей форме , чтобы вернуть его в мою сущность?

Вот функция обновления контроллера:

public function updtZoneMaterialAction(Request $request, $id){

    $doctrine       = $this->getDoctrine();
    $zoneMaterial   = $doctrine->getRepository(ZoneMaterial::class)->find($id);

    $form = $this->createForm(ZoneMaterialType::class, $zoneMaterial);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        //Persist informations
        $entityManager = $doctrine->getManager();
        $entityManager->persist($zoneMaterial);
        $entityManager->flush();

        return $this->redirectToRoute('zone_edit', array(
            'id' => $zoneMaterial->getZone()->getId(),
            'act' => 'material'
        ));
    }

    //Render view
    return $this->render('AppBundle:Zone:updt_zone_material.html.twig', array(
        'form'  => $form->createView(),
        'id'    => $id
    ));
}

Нужна помощь

...