gpt4 book ai didi

forms - Symfony 2从实体中选择表单属性

转载 作者:行者123 更新时间:2023-12-04 15:26:45 26 4
gpt4 key购买 nike

如何处理从实体添加 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;

最佳答案

我认为数据转换器是实现这一目标的最佳方法。

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

首先,您创建 DataTransformer,它将处理从“语言”实体到“区域设置”字符串(必须是唯一的)的转换。

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

<?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();
}
}

要使用此功能,请创建一个自定义表单类型,该类型将扩展“实体”表单类型。

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]

现在,您可以像经典实体类型一样使用它(但是这个类型将使用区域设置而不是 id 来生成下拉菜单。

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

希望这对您有帮助。

致以诚挚的问候

关于forms - Symfony 2从实体中选择表单属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25327262/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com