The*_*Tom 2 forms entity properties symfony
如何处理从具有我选择的属性作为值的实体添加from元素而将另一个作为显示值添加?
->add('locale', 'entity', array(
'class' => 'PrUserBundle:Language',
'property' => 'name','required' => true,
'data' => $userData->getLocale()
))
Run Code Online (Sandbox Code Playgroud)
会导致
<option value="3">English</option>
Run Code Online (Sandbox Code Playgroud)
我想拥有
<option value="en">English</option>
Run Code Online (Sandbox Code Playgroud)
我可以通过财产或在看起来像的权利内处理这个问题
/**
* @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;
Run Code Online (Sandbox Code Playgroud)
我认为数据转换器是最好的方法.
http://symfony.com/doc/current/cookbook/form/data_transformers.html
首先,创建DataTransformer,它将处理从"Language"实体到其"locale"字符串(必须是唯一的)的转换.
在您的情况下,变压器应如下所示:
<?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();
}
}
Run Code Online (Sandbox Code Playgroud)
要使用它,请创建一个自定义表单类型,它将扩展"实体"表单类型.
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';
}
}
Run Code Online (Sandbox Code Playgroud)
将此新表单类型声明为服务:
your_bundle.form.type.language_entity:
class: YourBundle\Form\LanguageType
tags:
- { name: form.type, alias: language_entity }
arguments: [@doctrine.orm.entity_manager]
Run Code Online (Sandbox Code Playgroud)
现在,您可以像经典实体类型一样使用它(但是这个将使用locale而不是id来生成下拉列表.
->add('locale', 'language_entity ', array(
'class' => 'PrUserBundle:Language',
'property' => 'name','required' => true
))
Run Code Online (Sandbox Code Playgroud)
我希望这能帮到您.
最好的祝福