在选择字段类型中自定义值的正确方法是什么?

时间:2012-09-21 18:24:55

标签: symfony symfony-forms

我正在尝试输出一个选择(选择)列表,其值来自相关实体。在Flight实体中,与机场实体存在多对一关系。机场实体有几个属性,例如city,country,codeIata。现在,这就是Type的创建方式:

$builder->add('origin', 'entity', array('label' => 'Origin Airport', 'class' => 'FlightcaseBookingBundle:Airport', 'property' => 'codeIata'));

这很好用,它会输出一个元素,其中 Airport-> codeIata 作为选项标签, Airport-> id 作为值,如此:

<option value="1234">CDG</option>

但我真正想要的是选项列表选项,用于显示2个字段的串联,即IATA代码,然后是机场名称,例如

<option value="1234">CDG - Paris Charles de Gaulle</option>

然后我在我的机场实体中创建了一个名为getLongName()的新方法,它为我做了这个。然后我用 longName 替换了 codeIata 的属性值。

这基本上做了我想要的。但对我来说,这似乎是hacky,而且不可取,因为实体类严格意味着定义对象本身。最重要的是,我不能以这种方式向getLongName方法发送任何参数(比如$ maxlength左右)。那么操作元素中显示的内容的正确方法是什么?我需要创建一个Transformer类来执行此操作,还是有更简单的方法?

1 个答案:

答案 0 :(得分:1)

假设您使用的是Symfony 2.0.x,AFAIK唯一的解决方案是实施新方法:

class Airport
{
    public function getChoiceLabel()
    {
        return sprintf('%s - %s', $this->codeIata, $this->name);
    }
}

然后使用实体表单类型:

$builder->add('origin', 'entity', array(
    'label' => 'Origin Airport',
    'class' => 'FlightcaseBookingBundle:Airport',
    'property' => 'choice_label'
));

另一种方法是实施__toString(),但我不喜欢在全球范围内表示Airport对象的表示形式是IATA及其名称。

如果您正在使用Symfony 2.1,可能有更好的解决方案(阅读:闭包)来实现这一目标。

编辑:我查看了Symfony 2.1的文档,似乎还不可能:

  

这是应该用于显示实体的属性   作为HTML元素中的文本。如果留空,则实体对象将是   强制转换为字符串,因此必须有__toString()方法。