#forms #symfony #transformation
#формы #symfony #преобразование
Вопрос:
Вот некоторая форма, которую я создаю :
$form_roles = $this->createFormBuilder($defaultData)
->add('roles', 'entity', array(
'class' => 'MyBundle:Role',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('r')
->orderBy('r.description', 'ASC');
},
'choice_label' => 'description',
'label' => 'My roles'
))
->getForm();
Поле описания, отображаемое в объекте роли, недостаточно хорошо, чтобы отображать его пользователям приложения. Итак, я хотел преобразовать его.
Я уже использовал transformers в классе AbstractType при создании querybuilder с каждым свойством, которое я хочу видеть, но никогда в типе объекта.
Итак, я создал класс RoleTransformer следующим образом :
class RoleTransformer implements DataTransformerInterface {
public function transform($entity) {
$substitution_value = null;
switch ($entity->getDescription()) {
case 'ROLE_INPUT':
$substitution_value = "the value I want to see for this role";
break;
case 'ROLE_VALIDATION':
$substitution_value = "the value I want to see for this role";
break;
case 'ROLE_ADMIN':
$substitution_value = "the value I want to see for this role";
break;
default:
$substitution_value = "the value I want to see for this role";
}
return $substitution_value;
}
public function reverseTransform($substitution_value) {
return substitution_value; //the form is not submitted, I have no interest in reverse transformation I think.
}
}
В контроллере, где я создаю форму, я добавляю это :
$role_transformer = new RoleTransfomer() // не уверен, нужно ли мне что-то передавать или это делается фреймворком
и я добавляю в конструктор форм (перед -> getForm()):
->addModelTransformer($role_transformer)
Я думал, что у меня будет объект роли, переданный методу transform, но это массив, и, к сожалению, он пуст.
Я думаю, что я слишком далек от решения, кто-нибудь может мне помочь?
Спасибо.
Ответ №1:
Почему бы не взять эту логику и не ввести ее непосредственно в choice_label с помощью анонимной функции, как описано здесь:
http://symfony.com/doc/current/reference/forms/types/choice.html#choice-label
'choice_label' => function ($value, $key, $index) {
switch ($value) { // This may actually be key depending on how you have it setup
case 'ROLE_INPUT':
$substitution_value = "the value I want to see for this role";
break;
case 'ROLE_VALIDATION':
$substitution_value = "the value I want to see for this role";
break;
case 'ROLE_ADMIN':
$substitution_value = "the value I want to see for this role";
break;
default:
$substitution_value = "the value I want to see for this role";
}
return $substitution_value;
},