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 |

Теперь моя проблема:

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

Во-вторых, теперь это слишком. Как ускорить? Проблема из-за расписания объектов. Если я загружаю меньше данных, это быстрее, но мне нужно загружать целый месяц для всех пользователей...

0 ответов

Другие вопросы по тегам