Symfony2 many-to-many form

Недавно попалась задача: есть звенья и задачи - необходимо создавать наряды в котором каждому звену будут накидываться задачи. Каждый наряд хранит звено и осуществляется связь многие ко многим  между нарядами и задачами, так как они могут быть использованы ещё раз.
Реализация конечно кривоватая но довольно таки простая в осуществлении.
Создадим экшен для нашей формы:

<?php

public function newlsAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();

    $link_list      = $em->getRepository('EnsClientsdbBundle:Link')->findAll();
    $service_list   = $em->getRepository('EnsClientsdbBundle:Service')->findAll();

    return $this->render('EnsClientsdbBundle:TourOfDuty:newls.html.twig', array(
        'link_list'     => $link_list,
        'service_list'  => $service_list,
    ));
}

?>

получаем списки звеньев и список услуг(они же задачи).
Далее вьювер:

...

{% block body -%}
    <h1>Создание наряда</h1>
        <table>
            <tr>
                <td class="createTourOfDuty_td" valign="top">
                    {% for link in link_list %}
                    <div class="link_list">
                        <div class="red_block">{{ link }}</div>
                        <ul id="l{{ link.id }}" class="link_class connectedSortable">
                        </ul>
                    </div>
                    {% endfor %}
                </td>
                <td class="createTourOfDuty_td"  valign="top">
                    <div>
                        <div class="red_block">Завявки</div>
                        <ul id="service_list" class="connectedSortable">
                            {% for service in service_list %}
                            <li id="s{{ service.id }}">{{ service }}</li>
                            {% endfor %}
                        </ul>
                    </div>
                </td>
            </tr>
        </table>

    <button id="newls_button">Создать</button>

    <script type="text/javascript">
        $( "{% for link in link_list %} #l{{ link.id }}, {% endfor %} #service_list" ).sortable({
            connectWith: ".connectedSortable"
        }).disableSelection();

        $("#newls_button").click(function() {
            var data = {};
            $(".link_class").each(function(index) {
                var li_list = $(this).find('li');
                if (li_list.length != 0) {
                    var data_li = [];
                    li_list.each(function(index){
                        data_li.push($(this).attr('id'));
                    })
                    data[$(this).attr('id')+'[]'] = data_li;
                }
            });
            $.post(
                    '{{ path("ens_tour_of_duty_createls") }}'
                    ,data
                    ,function(data) {
                        console.log(data);
                        window.location.href = "{{ path('ens_tour_of_duty', {'date':'now'|date('d-m-Y')} ) }}";
                    }
                );
            console.log(data);

        });
    </script>
{% endblock %}
...

И так у нас есть две колонки в первой список звеньев во второй список список задач\услуг. Далее для реализации необходимо подключение jquery, jquery ui и делаем связь через указанный класс connectedSortable. Теперь у нас есть возможность перемещать задачи из правой колонки в любое звено слева. Теперь когда всё размещено необходимо отправить данные в контроллер. Сначала пробегаемся по всем link_class и если они не пустые то собираем в массив содержащиеся в ней задачи\услуги и отправляем в контроллер ("tour_of_dury" - эпичное наименование наряда) ну можно повесить обработку на пришедший результат - у меня это просто переход на страницу с добавленными нарядами(наряды у меня различаться по дате так что переход на только что добавленные).
Теперь акшен добавления:

<?php
public function createlsAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    
    $link_list = $em->getRepository('EnsClientsdbBundle:Link')->findAll();

    foreach ($link_list as $key => $link) {
        if ($request->request->get('l'.$link->getId()) != "") {
            $tod = new TourOfDuty();
            $tod->setDate(new \DateTime('now'));
            $tod->setLink($link);
            
            $service_list_id = $request->request->get('l'.$link->getId());
            foreach ($service_list_id as $key => $service_id) {
                $service = $em->getRepository('EnsClientsdbBundle:Service')->find(substr($service_id, 1));
                $tod->addService($service);
            }
            $em->persist($tod);
            $em->flush();
        }
    }

    $response = new Response(json_encode("ok"));
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}
?>

Всё просто пробегаемся по полученным данным и если они не пусты то создаём наряд, указываем звено и добавляем в него сервис\услуги.
У меня это выглядит так:


Комментарии

Популярные сообщения из этого блога

Google Chrome - видео в отдельном окне

Bitrix: кнопка добавить в корзину

Google chrome размытое изображение