Добавление одной записи за раз в отношении многих ко многим - PullRequest
1 голос
/ 11 декабря 2011

В моем проекте Symfony2 есть две сущности: «Пользователь» и «Команда».Пользователь может иметь много команд, а команда может иметь много пользователей.

Теперь я добавляю игроков в команду через окно выбора (со всеми пользователями в нем из базы данных), где пользователь может выбрать много пользователей и нажать «Сохранить», чтобы вставить его в базу данных.

Я хотел бы иметь два текстовых поля вместо поля выбора, потому что мне не нравится, чтобы вошедший в систему пользователь мог видеть всех доступных пользователей (особенно, когда это поле станет очень длинным)

Как я могу это сделать?Итак, 2 текстовых поля (с автозаполнением jquery, который я добавлю) и кнопка сохранения, чтобы добавить двух пользователей в команду.

Thx.

Редактировать:

<?php

namespace Tennisconnect\DashboardBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class TeamType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('player_one', 'text', array('property_path' => false))
            ->add('player_two', 'text', array('property_path' => false))
        ;  
    }

    public function getName()
    {
        return 'team';
    }

    public function getDefaultOptions(array $options)
    {
        return array('data_class' => 'Tennisconnect\DashboardBundle\Entity\Team');
    }
}

Тип вызова:

<?php

namespace Tennisconnect\DashboardBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ChallengeType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('teams', 'collection', array(
                'type' => new TeamType(),
                'allow_add' => true
            ))
            ->add('place')
            ->add('date');
    }

    public function getName()
    {
        return 'challenge';
    }

    public function getDefaultOptions(array $options)
    {
        return array('data_class' => 'Tennisconnect\DashboardBundle\Entity\Challenge');
    }
}

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Вот как я получил данные из коллекции:

foreach($form->get('teams') as $team_form) 
{
    $player_one = $team_form->get('player_one')->getData();
    $player_two = $team_form->get('player_two')->getData();
}
1 голос
/ 11 декабря 2011

Удалите связанное с пользователем поле и добавьте два несвязанных поля к вашему TeamType, например.

$builder->add('new_member_1', 'text', array('property_path' => false))
        ->add('new_member_2', 'text', array('property_path' => false));

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

// ... controller action
// first bind request
$form->bindRequest($request);
if ($form->isValid()) {
   // fetch first username
   $username = $form->get('new_member_1')->getData();
   $user = $this->getDoctrine()->getRepository('YourBundle:User')->findOneByUsername($username);
   $team->addUser($user);
   // same for second user
}

Это минималистичный пример. Поэтому вам нужно добавить некоторую проверку, обработку ошибок и т. Д., Но она показывает, как это может работать для вас.

Edit:

Если у вас есть вложенные типы форм, вы можете пройтись по элементам, пройдя по пути к вашему ребенку.

$form->get('outer_type')->get('team_type')->get('new_member_1')->getData();
...