2016-07-05 3 views
0

Ich habe Probleme, die richtige Lösung für dieses Problem zu finden.Abrufen des Symfony3-Dropdown-Felds, das mit EntityType erstellt wurde, auf den vorherigen Wert

Ich habe ein Formular mit einem Dropdown, das ich dynamisch über einen Aufruf an eine DB mithilfe des EntityType-Felds generieren möchte. Alles funktioniert perfekt, aber ich konnte es nicht auf den vorherigen Wert beim Bearbeiten voreinstellen. Alle anderen Felder im Formular (alle Texte) werden standardmäßig auf den vorherigen Wert gesetzt, und wenn ich das Feld manuell mit ChoiceType erstelle, wird standardmäßig wie erwartet vorgegangen.

Ich habe versucht, die "Daten" -Option zu verwenden, um es manuell einzustellen, aber es hat nicht funktioniert. Abgesehen davon, dies als ChoiceType zu erstellen und die Daten über den Controller zu senden, gibt es noch andere Dinge, die ich versuchen sollte?

Hier ist meine Form Klasse TerminologyType.php

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Doctrine\ORM\EntityRepository; 

class TerminologyType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     // Event listener added to prevent users from editing the unique 
     // code after it has been created. 
     $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
      $terminology = $event->getData(); 
      $form = $event->getForm(); 

      // check if the Terminology object is "new" 
      // This should be considered a new "Terminology" and user must enter a code 
      if (!$terminology || null === $terminology->getCode()) { 
       $form->add('code'); 
      } 

     }); 
     $builder 
      ->add('name') 
      ->add('version') 
      ->add('description') 
      ->add('status', EntityType::class, [ 
       'class' => 'AppBundle:CodeSet', 
       'query_builder' => function (EntityRepository $er) { 
       return $er->createQueryBuilder('c') 
       ->where('c.terminologyCode = :code') 
       ->setParameter('code', 'entity_status') 
       ->orderBy('c.name', 'ASC'); 
       }, 
       'choice_label' => 'name', 
       'choice_value' => 'code', 
      ]); 

} 
    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Terminology', 
     )); 
    } 
} 

-Controller

<?php 

namespace AppBundle\Controller; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use AppBundle\Entity\Terminology; 
use AppBundle\Form\TerminologyType; 

/** 
* Terminology controller. 
* 
* @Route("/admin/terminology") 
*/ 
class TerminologyController extends Controller 
{ 
    /** 
    * Lists all Terminology entities. 
    * 
    * @Route("/", name="terminology_index") 
    * @Method("GET") 
    */ 
.... 



/** 
* Displays a form to edit an existing Terminology entity. 
* 
* @Route("/{code}/edit", name="terminology_edit") 
* @Method({"GET", "POST"}) 
*/ 
public function editAction(Request $request, Terminology $terminology) 
{ 
    $deleteForm = $this->createDeleteForm($terminology); 
    $editForm = $this->createForm('AppBundle\Form\TerminologyType', $terminology); 

    $editForm->handleRequest($request); 
    $em = $this->getDoctrine()->getManager(); 

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

     $em->persist($terminology); 
     $em->flush(); 

     return $this->redirectToRoute('terminology_show', array('code' => $terminology->getCode())); 
    } 

    return $this->render('terminology/edit.html.twig', array(
     'terminology' => $terminology, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

Entity

<?php 

// src/AppBundle/Entity/Terminology.php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Mapping\Annotation as Gedmo; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
    * @ORM\Entity 
    * @Gedmo\Loggable 
    * @ORM\Table(name="ts_terminology") 
    * @Gedmo\SoftDeleteable(fieldName="dateDeleted", timeAware=false) 
    * @UniqueEntity("code") 
    * 
    */ 

class Terminology extends TerminologyServices 
{ 

    /** 
    * @ORM\Column(type="string", length=75) 
    * @ORM\OneToMany(targetEntity="CodeSet", mappedBy="terminologyCode") 
    * @ORM\Id 
    */ 
    protected $code; 

    /** 
    * @ORM\Column(type="string", length=75, nullable=true) 
    * @ORM\OneToOne(targetEntity="CodeSet") 
    * @ORM\JoinColumn(name="status", referencedColumnName="code") 
    * @Gedmo\Versioned 
    */ 
    protected $status; 
+0

Wo ist Ihr Controller-Code? –

+0

Jetzt hinzugefügt. War mir nicht sicher, ob es relevant war oder nicht. Ich frage mich, ob es mit meiner Spaltenzuordnung zu tun hat. Ich kämpfe immer noch um das Doktrin-Beziehungs-Mapping zu verstehen. –

+0

Sind Sie neu in Symfony? Was erwarten Sie von Ihrem Controller? Es sieht so aus, als ob Sie ein $ deleteForm in der 'editAction()' Funktion erstellen, aber ich sehe auf der Symfony Website keinen Verweis auf "createDeleteForm". Sie zeigen auch nicht Ihre TWIG-Datei "terminology/edit.html.twig", vielleicht tun Sie etwas darin? –

Antwort

0

ich in der Lage war, das Problem aufzuspüren. In der Entitätsdefinition für den Status hatte ich den Spaltentyp, die Länge usw. in den Annotationen definiert. @ORM \ Column (type = "string", length = 75, nullable = true)

Durch das Entfernen begann es auf den zuletzt eingegebenen Wert zu setzen (dies brach jedoch später andere Dinge). Ich glaube, dies hat damit zu tun, dass EntityType ein Objekt erwartet, aber der Entitätstyp als String definiert ist und nur diesen liefert (was erklärt, warum die ChoiceType-Option funktioniert hat).

Verwandte Themen