2015-11-30 4 views
0

У меня есть родительский объект, называемый Publisher, и дочерний объект, называемый User с отношением ManyToMany.изменить только первый объект внутри встроенной коллекции

Внутри формы издателя, я хочу, чтобы создать/редактировать также первый пользователь, который я достичь так:

$builder 
    ->add('title') 
    ->add('users', 'collection', array(
    'type' => new UserType(), 
    'allow_add' => true, 
)) 

и в моем шаблоне веточку, я

  {{ form_row(edit_form.users.0.firstname) }}     
      {{ form_row(edit_form.users.0.lastname) }} 
      {{ form_row(edit_form.users.0.email) }} 

Это, очевидно, работает только до тех пор, пока только один пользователь назначается издателю, поскольку в противном случае symfony пытается проверить других пользователей, чьи данные отсутствуют.

Может ли кто-нибудь дать мне подсказку, как отредактировать только первый элемент пользователя в коллекции из формы издателя?

+0

Не могли бы вы добавить элемент параметров в свой сборщик коллекций пользователей, ref: http://symfony.com/doc/current/reference/forms/types/collection.html#options Вы можете установить его как 'mapped => false' и справиться с этим, как вам нравится в вашем контроллере. – Rooneyl

+1

Возможно, добавьте свойство Publisher :: firstUser и вообще не имеете дело с коллекцией. Я предполагаю, что вы явно индексируете свои пользовательские объекты, иначе понятие «первого пользователя» не имеет смысла. – Cerad

+0

@Cerad: Разве пользователи [0] не всегда являются первой записью таблицы join publisher_user? Я не хочу, чтобы пользователь, который был впервые прикреплен к издателю, как бы я это сделал? – user2534194

ответ

0

Вы можете установить поле users «вынесенное» после отображения firt пользователя:

{{ form_row(edit_form.users.0.firstname) }}     
{{ form_row(edit_form.users.0.lastname) }} 
{{ form_row(edit_form.users.0.email) }} 
{% do edit_form.users.setRendered %} 

С setRendered, Symfony2 не будет пытаться проверить следующие пользователи.

+0

Спасибо за ваш ответ. Я уже использовал setRendered, он присваивает другие поля, но, похоже, не отменяет проверку ... – user2534194

0

Я решил проблему, используя решение Cerad, представив геттер и сеттер для первого пользователя.

public function setFirstUser($user) 
    { 
    $this->users[0] = $user; 

    return $this; 
    } 

    public function getFirstUser() 
    { 
    return $this->users[0]; 
    } 

и в форме делает этот

$builder 
    ->add('title') 
    ->add('firstUser', new UserType()) 

и вызов полого firstUser в шаблоне веточки setRendered линия просто подавляет другие свойства объекта пользователя.

{{ form_row(edit_form.firstUser.firstname) }} 
{{ form_row(edit_form.firstUser.lastname) }} 
{{ form_row(edit_form.firstUser.email) }} 
{% do edit_form.firstUser.setRendered %} 

EDIT: из-за Cerads обратной связи о недетерминистическом упорядочении строк SQL я решил создать реальную собственность «adminUser», который является OneToOne отношения к первому пользователю, прикрепленного к объекту.

+0

Просто помните, что это не гарантирует, что $ users [0] всегда будет одним и тем же пользователем, если вы не используете индекс по свойству в своем отображения. – Cerad

+0

Не пользователь [0] всегда первая запись из таблицы joiner_user join? Я хочу, чтобы пользователь был впервые прикреплен к издателю. Как бы я это сделал? – user2534194

+0

Таблицы базы данных sql по своей сути не упорядочены. Нет такой вещи, как «первая» строка в таблице. Ошибочно предположить, что первая введенная запись всегда является первой найденной записью. Вы должны всегда сортировать или использовать индекс по модификатору, чтобы гарантировать, какая запись загружена в первую очередь. – Cerad

Смежные вопросы