1

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

有了给定示例中的 GenderType,我想“拉皮条”我的实体,我正在使用新的 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 本身的某种限制,因为它是无类型的..视线

4

1 回答 1

1

最好的方法是编写一个性别树枝扩展。

这样你就可以在任何地方显示,mMale不仅仅是在实体中。它还提供了数据和显示代码之间的清晰分离。fFemalePerson

像这样:

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 }}
于 2012-10-21T20:16:30.950 回答