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; } ?>
Всё просто пробегаемся по полученным данным и если они не пусты то создаём наряд, указываем звено и добавляем в него сервис\услуги.
У меня это выглядит так:


Комментарии
Отправить комментарий