首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将使用Symfony3构建的EntityType下拉字段默认为以前的值

将使用Symfony3构建的EntityType下拉字段默认为以前的值
EN

Stack Overflow用户
提问于 2016-07-05 03:40:32
回答 1查看 556关注 0票数 0

我正努力为这个问题找到正确的解决办法。

我有一个带有下拉列表的表单,我希望通过使用EntityType字段调用DB来动态生成该表单。但是,在编辑时,一切都很完美,但我无法使它默认为以前的值。表单(所有文本)中的所有其他字段默认为前一个值,如果我使用ChoiceType手动构建字段,则默认设置为预期。

我试过使用“data”选项手动设置它,但是它没有工作。除了将其构建为ChoiceType并通过控制器发送数据之外,还有其他需要尝试的地方吗?

这是我的表单类TerminologyType.php

代码语言:javascript
复制
<?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',
        ));
    }
}

控制器

代码语言:javascript
复制
<?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(),
    ));
}

实体

代码语言:javascript
复制
<?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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-06 15:46:31

我找到了这个问题。在状态的实体定义中,我在注释中定义了列类型、长度等。@ORM\列(type=“string”,length=75,nullable=true)

通过删除这个值,它开始默认到最后一个输入的值(但是这随后破坏了其他东西)。我认为这与EntityType所期望的对象有关,但实体类型被定义为字符串,并且只提供该类型(这解释了为什么ChoiceType选项有效)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38194871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档