我一直在关注创建文档中提供的自定义表单类型的文档: 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
答案 0 :(得分:1)
最好的方法是编写性别分支扩展名。
这样,您可以将m
Male
和f
显示为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 }}