【问题标题】:The proper way to customize values in a choice field type?在选择字段类型中自定义值的正确方法?
【发布时间】:2012-09-21 18:24:54
【问题描述】:

我正在尝试输出一个选择(选择)列表,其中的值来自相关实体。在 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 类来执行此操作,还是有更简单的方法?

【问题讨论】:

    标签: symfony symfony-forms


    【解决方案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() 方法。

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2017-08-08
      • 2020-10-12
      • 2013-09-13
      相关资源
      最近更新 更多