загрузка текущих значений в поле entitytype symfony 5

#symfony #collections #entity

#symfony #Коллекции #сущность

Вопрос:

У меня есть отношения «много ко многим» (пользователь, устройства), затем в user у меня есть ноль или больше устройств в коллекции. Затем у меня есть форма пользователя с полем entitytype устройства, в котором отображаются все возможные устройства. Пока здесь все работает нормально.

Теперь мне нужно отредактировать user, затем в поле device entitytype мне нужно показать все возможные устройства и выделить текущие сохраненные устройства. Например, если у меня есть устройство 1,2,3,4,5, а параметры 2,3 — это текущие значения, которые мне нужно показать 1,2,3,4,5 с выбранным 2,3 (выделено).

Теперь, когда я получаю объект user, у него есть коллекции с сохраненными устройствами, но в поле device сохраненные устройства не выбраны (выделены).

Это мой контроллер (Пользователь = Usuario, Драйвер = Dispositivo):

 <?php

namespace AppController;

use AppEntityUsuario;

use AppFormUsuarioType;

use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;

/**
 * @Route("/usu")
 */
class UsuarioController extends AbstractController
{


    /**
     * @Route("/{id}/edit", name="usuario_edit", methods={"GET","POST"})
     */
    public function edit(Request $request, $id): Response
    {
        $entityManager = $this->getDoctrine()->getManager();
        $usuario = $entityManager->getRepository(Usuario::class)->find($id);

        //dd($usuario);
        $form = $this->createForm(UsuarioType::class, $usuario );
        $form->handleRequest($request);

        if ($form->isSubmitted() amp;amp; $form->isValid()) {
            $this->getDoctrine()->getManager()->flush();

            return $this->redirectToRoute('usuario_index');
        }

        return $this->render('usuario/edit.html.twig', [
            'usuario' => $usuario,
            'form' => $form->createView(),
        ]);
    }

}
 

Это мои значения пользовательских сущностей (вариант 2 находится в коллекциях):

 UsuarioController.php on line 49:
AppEntityUsuario {#670 ▼
  -id: 1
  -id_usuario_k: 1
  -id_usuario_a: 1
  -dispositivos: DoctrineORMPersistentCollection {#690 ▼
    -snapshot: array:1 [ …1]
    -owner: AppEntityUsuario {#670}
    -association: array:19 [ …19]
    -em: DoctrineORMEntityManager {#566 …11}
    -backRefFieldName: "usuarios"
    -typeClass: DoctrineORMMappingClassMetadata {#673 …}
    -isDirty: false
    #collection: DoctrineCommonCollectionsArrayCollection {#692 ▼
      -elements: array:1 [▼
        0 => AppEntityDispositivos {#703 ▼
          -id: 2
          -descripcion: "Disp2"
          -usuarios: DoctrineORMPersistentCollection {#705 ▶}
        }
      ]
    }
    #initialized: true
  }
}
 

Это мой объект User (Usuario= User dispositivo= Драйвер)

 <?php

namespace AppEntity;

use AppRepositoryUsuarioRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;

/**
 * @ORMEntity(repositoryClass=UsuarioRepository::class)
 */
class Usuario
{
    /**
     * @ORMId
     * @ORMGeneratedValue
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMColumn(type="integer")
     */
    private $id_usuario_k;

    /**
     * @ORMColumn(type="integer")
     */
    private $id_usuario_a;

    /**
     * @ORMManyToMany(targetEntity="Dispositivos", inversedBy="usuarios", fetch="EAGER")
     * @ORMJoinTable(name="UsuDisp",
     *  joinColumns={@ORMJoinColumn(name="usuario_id", referencedColumnName="id")},
     *  inverseJoinColumns={@ORMJoinColumn(name="dispositivo_id", referencedColumnName="id")}
     *  )
     */
    private $dispositivos;

    public function __construct()
    {
        $this->dispositivos = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getIdUsuarioK(): ?int
    {
        return $this->id_usuario_k;
    }

    public function setIdUsuarioK(int $id_usuario_k): self
    {
        $this->id_usuario_k = $id_usuario_k;

        return $this;
    }

    public function getIdUsuarioA(): ?int
    {
        return $this->id_usuario_a;
    }

    public function setIdUsuarioA(int $id_usuario_a): self
    {
        $this->id_usuario_a = $id_usuario_a;

        return $this;
    }

    /**
     * @return Collection|Dispositivos[]
     */
    public function getDispositivos(): Collection
    {
        return $this->dispositivos;
    }

    public function setDispositivos(ArrayCollection $dispositivos)
    {
      $this->dispositivos = $dispositivos;
  
      return $this;
    }
  
    public function addDispositivo(Dispositivo $dispositivo): self
    {
        if (!$this->dispositivos->contains($dispositivo)) {
            $this->dispositivos[] = $dispositivo;

        }
        return $this;
    }

    public function removeDispositivo(Dispositivo $dispositivo): self
    {
        if ($this->dispositivos->contains($dispositivo)) {
            $this->dispositivos->removeElement($dispositivo);
            $dispositivo->removeGroupe($this);
        }
        return $this;
    }
}
 

Это мой код формы:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('Drivers', EntityType::class, [
                'class' => Driver::Class,
                'choice_label' => 'description',
                'placeholder' => 'Select a device',
                'multiple' => true,
                'empty_data' => '',

            ]);

    }
 

Это мой экран (опция 2 сохранена):
введите описание изображения здесь

Я буду признателен за некоторую помощь.

Комментарии:

1. Есть ли у вас свойство с именем 'Drivers' или методы с именем getDrivers , addDriver , amp; removeDriver ? Если да, пожалуйста, дополните свой вопрос. Также, пожалуйста, скопируйте и вставьте свой дамп, это будет гораздо полезнее, чем использование изображения текста.

2. Вы также должны добавить свой код для метода контроллера, обрабатывающего форму.

3. Я добавил контроллер и код объекта. Это на испанском языке, в моем первоначальном вопросе я перевожу usuario = пользователь и dispositivo = водитель.

Ответ №1:

РЕШАЕМАЯ

Я должен добавить choice_value=’descripcion’, то же самое, что и choice_label.

Я не знаю почему, что symfony делает внутри компании?