如何处理从我选择的属性作为值添加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;
答案 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
))
我希望这会对你有所帮助。
祝你好运