2017-01-07 9 views
1

У меня в моей форме атрибут «кровати», объект, связанный с другой «спальней». Я хотел бы, чтобы каждый вход добавлял класс с идентификатором связанного объекта «спальня».Как установить атрибут класса для ввода формы Symfony с атрибутом связанного объекта

$form->add('beds', EntityType::class, array(
    'class' => 'DamiasResaBundle:Bed', 
    'query_builder' => function (EntityRepository $er) { 
     return $er->createQueryBuilder('b') 
        ->orderBy('b.id', 'ASC'); 
    }, 
    'choice_label' => 'id', 
    'label' => 'lits ', 
    'multiple' => true, 
    'expanded' =>true, 
    'attr' => array(
     'class' => function ($bed) { 
      return $bed->getBedroom()->getId(); 
     } 
    ), 
)) 

У меня есть две проблемы:

  1. 'атр' => Array ('класс' => 'тест) возвращает класс attribut в DIV, содержащий вход, а не класс attribut в вход.
  2. Этот предыдущий код не работает и возвращает:

An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class Closure could not be converted to string") in form_div_layout.html.twig at line 358.

Спасибо за вашу помощь

ответ

1

Я вижу, что вы используете флажки. Ваш код выглядит нормально, и поскольку вы используете query_builder, значения должны быть сущностью Bed. Обратите внимание, что attr не упоминается в EntityType documentation, и я думаю, вам нужно использовать choice_attr.

Можете ли вы попробовать это. Я не уверен, если это будет работать или нет:

$form->add('beds', EntityType::class, array(
    'class' => 'DamiasResaBundle:Bed', 
    'query_builder' => function (EntityRepository $er) { 
     return $er->createQueryBuilder('b') 
        ->orderBy('b.id', 'ASC'); 
    }, 
    'choice_label' => 'id', 
    'label' => 'lits ', 
    'multiple' => true, 
    'expanded' =>true, 
    'choice_attr' => function ($val) { 
      return ['class' => $val->getId()]; 
    }, 
)) 

Сообщите нам о результатах.

+0

Спасибо, ваш матч решение! –

+0

Рад, что у вас это работает! –

0
  1. Вы должны customize form rendering
  2. Предыдущий код не работает, потому что вы пытаетесь передать объект Closure вместо строкового значения. В качестве атрибутов поля используется массив attr, поэтому он должен содержать только строковые значения (или объекты с методом __toString()).
0

Для EntityType он предпочел бы выглядеть следующим образом:

$form->add('beds', EntityType::class, array(
    'class' => 'DamiasResaBundle:Bed', 
    'query_builder' => function (EntityRepository $er) { 
     return $er->createQueryBuilder('b') 
        ->orderBy('b.id', 'ASC'); 
    }, 
    'choice_label' => 'id', 
    'label' => 'lits ', 
    'multiple' => true, 
    'expanded' =>true, 
    'choice_attr' => function (Bed $bed, $key, $index) { 
      return ['class' => $bed->getBedroom()->getId();]; 
    }, 
))