私はこの問題に適切な解決策を見つけるのに苦労しています。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;
コントローラコードはどこですか? –
追加されました。それが適切かどうかは分かりませんでした。私はそれが私の列マッピングと関係しているのだろうかと思います。私はまだ教義関係のマッピングを理解するのに苦労しています。 –
Symfonyを初めてお使いですか?あなたのコントローラーが何をすることを期待していますか? 'editAction()'関数で$ deleteFormを作成したようですが、symfonyのサイトでは "createDeleteForm"への参照はありません。 TWIGファイル "terminology/edit.html.twig"も表示されません。おそらくそこに何かしますか? –