Symfony 2从实体中选择属性

时间:2014-08-15 13:29:12

标签: forms symfony properties entity

如何处理从我选择的属性作为值添加from元素而将另一个属性作为显示值添加?

->add('locale', 'entity', array(
              'class' => 'PrUserBundle:Language',
              'property' => 'name','required' => true,
             'data' => $userData->getLocale()
))

将导致

<option value="3">English</option>

我想

<option value="en">English</option>

我可以通过属性或看似

的权限内处理此问题
/**
* @ORM\Entity
* @ORM\Table(name="language")
*/
class Language {
/**
 * @ORM\Id 
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue
 */
protected $id;

/** @ORM\column(type="string", length=200) */
protected $locale;


/** @ORM\column(type="string", length=200) */
protected $name;

1 个答案:

答案 0 :(得分:5)

我认为数据转换器是最好的方法。

http://symfony.com/doc/current/cookbook/form/data_transformers.html

首先,您创建了DataTransformer,它将处理来自&#34; Language&#34;实体到他的&#34; locale&#34;字符串(必须是唯一的)。

在您的情况下,变压器应如下所示:

<?php

namespace YouBundle\Form\DataTransformer;

use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class StringToLanguageTransformer implements DataTransformerInterface
{

    /**
     * @var ObjectManager
     */
    private $om;

    /**
     * @param ObjectManager $om
     */
    public function __construct(ObjectManager $om)
    {
        $this->om = $om;
    }

    /**
     * @param string $locale
     * @return Language|null
     * @throws \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function transform($locale)
    {
        // Here, you can use Object manager, get your repository et get the "Language" Entity with your local string
        // return the entity or thow a TransformationFailedException if none are found
    }

    /**
     * @param Language $language
     * @return string
     */
    public function reverseTransform($language)
    {
        if (null === $language) {
            return "";
        }

        return $language->getLocale();
    }
}

要使用此功能,请创建一个自定义表单类型,该类型将扩展&#34;实体&#34;表格类型。

namespace YouBundle\Form;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use YouBundle\Form\DataTransformer\StringToLanguageTransformer;

class LanguageType extends AbstractType
{

    /** @var \Doctrine\ORM\EntityManager */
    protected $entityManager;

    /**
     * @param EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $languageTransformer = new StringToLanguageTransformer($this->entityManager);
        $builder->addModelTransformer($languageTransformer);
    }

    /**
     * @return string
     */
    public function getParent()
    {
        return 'entity';
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'language_entity';
    }

} 

将此新表单类型声明为服务:

your_bundle.form.type.language_entity:
        class: YourBundle\Form\LanguageType
        tags:
            - { name: form.type, alias: language_entity }
        arguments: [@doctrine.orm.entity_manager]

现在,您可以像经典实体类型一样使用它(但是这个将使用locale而不是id来生成下拉列表。

->add('locale', 'language_entity ', array(
              'class' => 'PrUserBundle:Language',
              'property' => 'name','required' => true
))

我希望这会对你有所帮助。

祝你好运