Intereting Posts
Как создать ссылку с диалоговым окном подтверждения с помощью Yii? Лучшая практика для обработки форм Должен ли токен доступа в oAuth генерировать каждый раз, когда пользователь входит в систему? установить несколько проектов Laravel 4 в подкаталоги PHP Показать исходный код вместо файла .html Простой HTML DOM Parser – пропустить определенный элемент Получите все файлы всех подпапок и всего скрытого файла с помощью glob отправка дополнительных значений в PHP-скрипт с использованием загрузки углового файла mod_rewrite – добавить путь к переменной REQUEST_FILENAME PHPExcel throws Fatal error: разрешенный размер памяти 134217728 байт исчерпан (пытался выделить 71 байт) Построение SQL-запроса на основе флажков PHP DateInterval не возвращает последний день месяца PHP Array – удаление пустых значений CURLOPT_NOBODY все еще загружает тело – используя полосу пропускания Компиляция PHP с поддержкой GD и libjpeg

Многие-ко-многим и образуют Symfony2

Что у меня есть

У меня есть таблица базы данных usuario (пользователь) и таблица perfil (профиль), связанная с таблицей perfiles_usuario (profiles_users). Отношение «многие ко многим». Теперь я могу успешно получить профили от пользователя, выполнив: $ perfiles = $ usuario-> getPerfiles ();

/** * * @return Perfil[] */ function getPerfiles() { $perfiles = $this->getPerfilesCollection()->toArray(); return $perfiles; } 

То, что я пытаюсь сделать

Я пытаюсь создать форму, где вы можете добавить один или несколько существующих профилей из таблицы perfil (profile). Я хотел бы иметь несколько полей выбора и выбирать профили для пользователя.

Что я пытался сделать

Мой строитель форм

 class UsuarioType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('username', 'text', array('required' => false)) ->add('perfiles', 'entity', array( 'class' => 'UsuarioBundle:Perfil', 'em' => 'dynamic_em', 'query_builder' => function(EntityRepository $er){ return $er->createQueryBuilder('c')->orderBy('c.nombre', 'ASC'); }, 'required' => false )) ; } 

Мой взгляд

 <div class="clearfix"> {{ form_widget(formulario.perfiles, { 'attr': { 'class': 'select-perfiles', 'multiple':'' } }) }} </div> 

Моя ошибка:

 Catchable Fatal Error: Argument 1 passed to Centro\UsuarioBundle\Entity\Usuario::setPerfiles() must be of the type array, object given, called in C:\....\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php on line 345 and defined in C:\....\src\Centro\UsuarioBundle\Entity\Usuario.php line 450 

Usuario.php line 450

 public function setPerfiles(array $perfiles) // line 450 { # Borra los perfiles que tiene el usuario $this->getPerfilesCollection()->clear(); # Asigna los perfiles pasados por parámetro foreach ($perfiles as $perfil) { $this->addPerfil($perfil); } return $this; } 

Я думаю, что проблема в моем пользователе createAction:

 $usuario = new Usuario(); $formulario = $this->crearCrearForm($usuario); $formulario->handleRequest($request); <--------- ... at this line 

И это данные формы

 .... centro_extranetbundle_usuario[username]:test centro_extranetbundle_usuario[perfiles]:9 centro_extranetbundle_usuario[perfiles]:4 

Первая проблема: экземпляр параметра setPerfiles должен быть из набора типов (Doctrine Interface). Вторая проблема: perfiles – это коллекция, поэтому вам нужен тип коллекции в форме и FormType для Perfiles.

Спасибо! вот решение

 /** * Devuelve una coleccion con los perfiles del usuario * * @return ArrayCollection */ function getPerfiles() { $perfiles = $this->getPerfilesCollection(); # ->toArray(); I delete this return $perfiles; } 

Также я меняю

 /** * Establece los perfiles del usuario a partir de un ArrayCollection de * perfiles * * @param ArrayColection * * @return self */ public function setPerfiles(ArrayCollection $perfiles) { // # Borra los perfiles que tiene el usuario // $this->getPerfilesCollection()->clear(); // # Asigna los perfiles pasados por parámetro // foreach ($perfiles as $perfil) { // $this->addPerfil($perfil); // } // return $this; $this->getPerfilesCollection()->clear(); foreach($collection->toArray() as $perfil){ $this->addPerfil($perfil); } } 

В построителе форм я добавляю только эту строку: 'multiple' => true,

 ->add('perfiles', 'entity', array( 'class' => 'UsuarioBundle:Perfil', 'multiple' => true, <---------------------- 'em' => 'dynamic_em', 'query_builder' => function(EntityRepository $er){ return $er->createQueryBuilder('c')->orderBy('c.nombre', 'ASC'); }, 'required' => false ))