具有自定义表单类型的Doctrine实体

时间:2012-10-21 17:17:12

标签: forms symfony doctrine-orm entity

我一直在关注创建文档中提供的自定义表单类型的文档: http://symfony.com/doc/master/cookbook/form/create_custom_field_type.html#using-the-field-type

拥有给定示例中的GenderType,我想“pimp”我的实体,我正在使用新的FormType。

class Person {

    const GENDER_MALE = "m";
    const GENDER_FEMALE = "f";

    private $gender;

    ....
    /* generated getter/setter  */

    .....

    public function getGenderAsText() 
    {
          return $this->getGender() == self::GENDER_MALE?"male":"female";
    }


} 

我的问题,也许有人提出了一个很好的建议..如何结合GenderType的优雅,选择像我的模型一样挑选形状的魅力,以便在模板中使用等等。?

更新

Alex指出,如何使用自编的性别分支扩展显示特定字段。

当你特别在场上调用扩展时,这就像一个魅力     {{item.gender | gender}}

我有一堆对象,使用公共字段的继承 - 但是有一堆数据对于每个类都是唯一的。 我写了一些逻辑来提取所有属性,将它们交给模板,TwigExtension处理渲染:

public function dynamicContractFilter($value)
{
    // handle DateTime
    if ($value instanceof \DateTime) {
        return $value->format('d.m.Y');
    }
    ....
    } elseif (is_bool($value)) {
        return $value ? 'yes' : 'no';
    } else {
        return $value;  // plain string
    }

}

我无法确定它是简单的字符串/整数还是“GenderTypedField”..

我想这是PHP本身的某种限制,因为它没有类型.. sight

1 个答案:

答案 0 :(得分:1)

最好的方法是编写性别分支扩展名。

这样,您可以将m Malef显示为Female,而不仅仅是Person实体。它还可以清楚地区分数据和显示代码。

像这样:

namespace Acme\DemoBundle\Twig;

class GenderExtension extends \Twig_Extension
{
    const
        MALE   = 'Male',
        FEMALE = 'Female';

    public function getFilters()
    {
        return array(
            'gender' => new \Twig_Filter_Method($this, 'gender'),
        );
    }

    public function gender($token)
    {
        if ('m' === $token)
            return self::MALE;

        if ('f' === $token)
            return self::FEMALE;

        throw new \InvalidArgumentException('Invalid argument, expecting either "m" or "f".');
    }

    public function getName()
    {
        return 'acme_gender_extension';
    }
}

然后您将在模板中使用:

{{ person.gender | gender }}