2016-07-05 8 views
0

私はこの問題に適切な解決策を見つけるのに苦労しています。EntityTypeを使用して構築されたSymfony3ドロップダウンフィールドをデフォルト値の前の値に戻す

私は、EntityTypeフィールドを使用してDBへの呼び出しによって動的に生成したいドロップダウンのフォームを持っています。すべてが完全に機能しますが、編集時に以前の値にデフォルト設定することができませんでした。フォーム内の他のフィールド(すべてのテキスト)の既定値はデフォルトであり、ChoiceTypeを使用して手動でフィールドを構築すると、期待どおりの既定値になります。

「データ」オプションを手動で設定しようとしましたが、動作しませんでした。これをChoiceTypeとして構築し、コントローラを介してデータを送信するのに手間がかかります。

は、ここで私が問題を追跡することができました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', 
     )); 
    } 
} 

コントローラ

<?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(), 
    )); 
} 

エンティティ

<?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

コントローラコードはどこですか? –

+0

追加されました。それが適切かどうかは分かりませんでした。私はそれが私の列マッピングと関係しているのだろうかと思います。私はまだ教義関係のマッピングを理解するのに苦労しています。 –

+0

Symfonyを初めてお使いですか?あなたのコントローラーが何をすることを期待していますか? 'editAction()'関数で$ deleteFormを作成したようですが、symfonyのサイトでは "createDeleteForm"への参照はありません。 TWIGファイル "terminology/edit.html.twig"も表示されません。おそらくそこに何かしますか? –

答えて

0

私のフォームクラスです。ステータスのエンティティ定義では、注釈の列のタイプ、長さなどを定義しました。 @ORM \ Column(type = "string"、length = 75、nullable = true)

これを削除すると、最後に入力された値にデフォルト設定され始めました。私はEntityTypeがオブジェクトを期待しているにもかかわらずエンティティタイプが文字列として定義されているだけであることを信じています(これはChoiceTypeオプションが機能する理由を説明しています)。

関連する問題