Как создать встраиваемые формы со многих сторон в symfony2

у меня есть схема базы данных спортивных турниров, как это

введите описание изображения здесь

здесь doman имеет one to many родство с tournament, у меня есть domain форма, которая собирает информацию о домене и сохраняет его в базе данных, у меня есть таблица турниров и доменов, как это

tournament table
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| domain_id   | int(11)      | YES  | MUL | NULL    |                |
| description | longtext     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+Domain Table
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| subdomain | varchar(255) | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

у меня есть tournamentType который собирает детали турнира, но при представлении, очевидно, будет null значение для domain_id, как установить значение домена для всех tournaments который будет создан, чтобы сказать domain_id = 1,

я мог бы сделать это в контроллере, используя сеттеры, но это было бы грязно, есть ли способ установить one сторона от many сторона в Symfony вложенных форм,

редактировать: сейчас я делаю это внутри контроллера

$tournament->setDomain($em->getRepository("CricketBundle\Model\Entity\Domain")->findOneById(1));
$em->persist($tournament);
$em->flush();

и внутри сеттер турнирного объекта

   public function setDomain(\CricketBundle\Model\Entity\Domain $domain = null)
{
$domain->addTournament($this);
$this->domain = $domain;
return $this;
}

все работает отлично, я просто не хочу использовать сеттер внутри контроллера, я хочу переместить его куда-нибудь еще

1

Решение

Вы всегда можете просто установить идентификатор домена по умолчанию для своей турнирной таблицы в базе данных и позволить базе данных обработать его для вас.

Другим вариантом будет использование доктрины слушатель сущностей на вашем турнирном объекте на prePersist событие, которое происходит только до того, как эта сущность вставляется в базу данных в первый раз, а не при обновлении. Symfony имеет некоторую документацию о том, как это сделать. Более ранние версии Doctrine не поддерживали прослушиватели для одной сущности и требовали от вас прослушивания событий для всего менеджера сущностей, а затем проверяли, была ли это нужная сущность, которую вы хотели, но я собираюсь предположить, что вы включены последние версии.

Итак, сначала вы должны определить прослушиватель вашего объекта Tournament как службу в любом загружаемом файле конфигурации:

services:
listener.tournament_entity:
class:  CricketBundle\EventListener\TournamentListener
tags:
- { name: doctrine.orm.entity_listener }

Тогда вы создадите свой TournamentListener:

<?php

namespace CricketBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use CricketBundle\Model\Entity\Tournament;

class TournamentListener
{
public function prePersist(Tournament $tournament, LifecycleEventArgs $eventArgs)
{
$em = $eventArgs->getEntityManager();
$domain = $em->getRepository('CricketBundle\Model\Entity\Domain')->find(1);
$tournament->setDomain($domain);
}
}
2

Другие решения

В вашей форме tournamentType Код формы, необходимо добавить / заменить следующий код:

$builder->add('domain', 'entity', array(
'class' => "YourBundle:DomainClass",
'empty_data' => '1')
);

Этот код инициализирует ваше поле для первого домена.

Если вы хотите, чтобы ваше поле было скрыто в форме, вы должны изменить тип поля на hidden,

1

По вопросам рекламы [email protected]