Я использую построение типа формы, использующего абонента поля формы для отображения некоторых полей формы.
Абонент возвращает параметры формы для данного поля. Один из вариантов - "выбор":
$formOptions = [
...
'choices' => $choices,
];
$choices
- сущности.
Следовательно, они будут отображаться в форме с помощью объектов __toString()
.
Метод __toString()
будет выглядеть примерно так:
public function __toString()
{
return $this->getName();
}
Однако я хочу, чтобы представление "выбора" было $name. $id
$name. $id
(имя, связанное с идентификатором объекта).
В то же время я не хочу изменять __toString()
потому что хочу другое строковое представление только в этом поле формы, а не во всей системе.
Какие у меня варианты?
У меня есть какой-либо подробный контроль над тем, как отображать поля формы Symofny?
Вы можете использовать опцию property в соответствии с документацией по объекту 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,
);
}
Начиная с Symfony 2.7 вы можете использовать опцию choice_label
с обратным вызовом для динамического создания ярлыков ваших вариантов:
$builder->add('name', 'choice', array(
'choices' => ...,
'choice_label' => function ($choice) {
return $choice->name.$choice->id;
},
));
В этом примере предполагается, что ваши варианты - объекты, которые имеют общедоступные свойства $id
и $name
.
Вы можете попробовать что-то вроде этого? :
$formChoices = [];
foreach ($choices as $key => $entity) {
$formChoices[$entity->getId()] = sprintf('%s %s', $entity->getName(), $entity->getId());
}
$formOptions = [
...
'choices' => $formChoices,
];