Symfony2 many-to-many form
Недавно попалась задача: есть звенья и задачи - необходимо создавать наряды в котором каждому звену будут накидываться задачи. Каждый наряд хранит звено и осуществляется связь многие ко многим между нарядами и задачами, так как они могут быть использованы ещё раз.
Реализация конечно кривоватая но довольно таки простая в осуществлении.
Создадим экшен для нашей формы:
получаем списки звеньев и список услуг(они же задачи).
Далее вьювер:
И так у нас есть две колонки в первой список звеньев во второй список список задач\услуг. Далее для реализации необходимо подключение jquery, jquery ui и делаем связь через указанный класс connectedSortable. Теперь у нас есть возможность перемещать задачи из правой колонки в любое звено слева. Теперь когда всё размещено необходимо отправить данные в контроллер. Сначала пробегаемся по всем link_class и если они не пустые то собираем в массив содержащиеся в ней задачи\услуги и отправляем в контроллер ("tour_of_dury" - эпичное наименование наряда) ну можно повесить обработку на пришедший результат - у меня это просто переход на страницу с добавленными нарядами(наряды у меня различаться по дате так что переход на только что добавленные).
Теперь акшен добавления:
Всё просто пробегаемся по полученным данным и если они не пусты то создаём наряд, указываем звено и добавляем в него сервис\услуги.
У меня это выглядит так:
<?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; } ?>
Всё просто пробегаемся по полученным данным и если они не пусты то создаём наряд, указываем звено и добавляем в него сервис\услуги.
У меня это выглядит так:
Комментарии
Отправить комментарий