-1

我正在尝试输出一个选择(选择)列表,其值来自相关实体。在 Flight 实体中,与 Airport 实体存在多对一的关系。Airport 实体具有多个属性,例如城市、国家/地区、codeIata。现在,这是创建类型的方式:

$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>

因此,我在我的 Airport 实体中创建了一个名为 getLongName() 的新方法,它为我完成了这项工作。然后我用 longName 替换了codeIata属性值。

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

4

1 回答 1

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(),但我不喜欢在全球范围内说它是AirportIATA 加上它的名称的对象的表示。

如果您使用的是 Symfony 2.1,也许有更好的解决方案(阅读:闭包)来实现这一点。

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

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

于 2012-09-21T18:34:49.633 回答