更改Symfony 2.6表单中选项的字符串表示形式

时间:2015-12-31 13:54:28

标签: php forms symfony symfony-2.6

我正在使用构建表单类型来使用表单字段订阅者来呈现某些表单字段。

订阅者返回给定字段的表单选项。其中一个选项是"选择":

    $formOptions = [
        ...
        'choices' => $choices,
    ];

$choices是实体。
因此,它们将通过__toString()个对象以表格形式呈现。

__toString()方法看起来像:

public function __toString()
{
    return $this->getName();
}

然而,我想要"选择"表示为$name . $id(名称与对象ID连接)。
同时,我不想修改对象的__toString()方法,因为我想要一个不同的字符串仅在此一个表单字段中表示,而不是在整个系统中表示。

我有哪些选项?
我对Symofny表单字段如何显示传递的选项有任何细微的控制吗?

3 个答案:

答案 0 :(得分:4)

从Symfony 2.7开始,您可以使用带有回调的choice_label选项动态创建您选择的标签:

$builder->add('name', 'choice', array(
    'choices' => ...,
    'choice_label' => function ($choice) {
        return $choice->name.$choice->id;
    },
));

此示例假定您的选择是具有公共$id$name属性的对象。

答案 1 :(得分:2)

你可以试试这样的东西吗? :

$formChoices = [];
foreach ($choices as $key => $entity) {
   $formChoices[$entity->getId()] = sprintf('%s %s', $entity->getName(), $entity->getId());
}

$formOptions = [
        ...
        'choices' => $formChoices,
    ];

答案 2 :(得分:1)

您可以根据entity field documentation 2.6

使用属性选项
$builder->add('users', 'entity', array(
    'class' => 'AcmeHelloBundle:User',
    'property' => 'customToString',
));

确保属性名称与方法名称

匹配
    /**
     * @return string 
     * Here you print the attributes you need
     */
    public function customToString()
    {
        return sprintf(
            '%s,
            $this->$name . $this->$id,


        );
    }