Symfony2 - одна форма для всех сущностей в таблице
Я постараюсь описать мою проблему как можно проще.
У меня есть приложение, в котором у пользователя может быть одно запланированное событие в день в течение всего месяца. (одно событие в день * 31 (количество дней в марте) = 31 событие)
class Schedule extends Day
{
use Timestampable;
use Bleamable;
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* FOSUserBundle...
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user", referencedColumnName="id")
*/
protected $user;
/**
* @ORM\Column(type="date", nullable=false)
*/
protected $day;
/**
* @ORM\ManyToOne(targetEntity="EventType")
* @ORM\JoinColumn(name="event_type", referencedColumnName="id")
*/
protected $eventType;
(...)
}
Я создал два типа форм для этого, один для редактирования расписания:
class ScheduleType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('user')
->add('day')
->add('eventType', TextType::class, [
'label' => false,
])
;
}
}
И один с формой коллекции:
class ScheduleMultiType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('schedule', CollectionType::class, [
'type' => new ScheduleType(), 'allow_add' => true
])
->add('submit', 'submit')
;
}
Класс контроллера:
public function MonthlyEditAction($year, $month)
{
$date = new \DateTime(sprintf('%d-%02d-01', $year, $month));
//array of days
$dates = $this->get('app.calendar_manager')->getDaysPeriod($date);
$scheduleEnt = $this->getDoctrine()->getRepository('AppBundle:Schedule')
->getSchedule([
'start' => new \DateTime('2016-03-01')
'end' => new \DateTime('2016-03-31')
]);
$userList = $this->getDoctrine()->getRepository('AppBundle:User')
->findAll();
$test['schedule'] = $scheduleEnt;
$form = $this->createForm(new ScheduleMultiType(), $test, array(
'action' => $this->generateUrl('admin_holiday_create'),
'method' => 'POST',
));
return array(
'form' => $form->createView(),
'calendarDate' => $date,
'days' => $dates,
'userList' => $userList
);
}
и в ветке:
{% for useraa in userList %}
<tr>
{% for asd in form.schedule %}
{% if asd.user.vars.value == useraa.id %}
{% for day in days %}
{% if day.date|date('d') == asd.day.vars.value.day %}
<td>
{{ scheduleMacro.monthly_td_inputBox(day,asd) }}
</td>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</tr>
{% endfor %}
Я хочу отобразить всех пользователей с их графиками, как это:
user | 1 | 2 | 3 | ... | 31 |
u1 | 8-16 | 15-23 | 8-16 | ... | 8-16 |
u2 | 9-17 | 16-00 | 7-15 | ... | 8-16 |
u3 | 6-14 | 13-22 | 6-14 | ... | 8-16 |
u4 | 5-13 | 13-22 | 9-17 | ... | 2-10 |
Теперь моя проблема:
Я знаю, что это уродливое решение (ветка, циклы для всех пользователей и расписаний), но я действительно не знаю, как этого добиться "правильным" способом...
Во-вторых, теперь это слишком. Как ускорить? Проблема из-за расписания объектов. Если я загружаю меньше данных, это быстрее, но мне нужно загружать целый месяц для всех пользователей...