1: <?php
2: namespace TIC\DormBundle\Traits;
3:
4: use Symfony\Component\HttpFoundation\Request;
5: use Symfony\Component\HttpFoundation\Response;
6:
7: /** @TODO: pouvoir utiliser un autre trait fournissant la méthode renderAction */
8: use TIC\TwigBundle\Traits\ControllerViewable;
9:
10: /**
11: * Méthodes utiles pour disposer des actions CRUD.
12: */
13: trait ControllerCrudable
14: {
15: use ControllerItemable; // EntityManager avec méthodes getRepo, getItem, saveItem & deleteItem
16: use ControllerViewable; // Méthode pour le rendu des vues Twig renderAction
17:
18: /**
19: * List items (Index).
20: *
21: * @param array $filters
22: * @param string $orders
23: * @param array $params Liste de paramètres à passer à la vue
24: * @return Response
25: */
26: protected function crudList(?array $filters = [], ?string $orders = null, array $params = []): Response
27: {
28: return $this->renderAction('list', array(
29: 'items' => $this->getRepo()->listAll($filters, $orders),
30: ) + $params);
31: }
32:
33: /**
34: * Show item (Read).
35: *
36: * @param mixed $id
37: * @param array $params Liste de paramètres à passer à la vue
38: * @return Response
39: */
40: protected function crudShow(mixed $id, array $params = []): Response
41: {
42: return $this->renderAction('show', array(
43: 'item' => $this->getItem($id),
44: ) + $params);
45: }
46:
47: /**
48: * Edit item (Create / Update).
49: * Note: la clé $params['view'] permet de spécifier le template à utiliser ('form' par défaut)
50: *
51: * @param Request $request
52: * @param mixed $id
53: * @param array $options Liste d'options pour initialiser le FormType
54: * @param array $params Liste de paramètres à passer à la vue
55: * @return Response
56: */
57: protected function crudForm(Request $request, mixed $id = null, array $options = [], array $params = []): Response
58: {
59: // nouvel élément (avec valeurs par défaut) ou récupération de l'élément édité
60: $item = $this->getItem($id);
61: // génération du formulaire
62: $form = $this->getForm($item, $request, $options);
63:
64: // validation du formulaire
65: if ($form->isSubmitted() && $form->isValid()) {
66: // enregistrement avec message et redirection
67: return $this->saveItem($item, true);
68: }
69:
70: // affichage du formulaire
71: $page = isset($params['view']) ? $params['view'] : 'form';
72: return $this->renderAction($page, array(
73: 'form' => $form,
74: 'item' => $item,
75: ) + $params);
76: }
77:
78: /**
79: * Delete item.
80: *
81: * @param Request $request
82: * @param mixed $id
83: * @return Response
84: */
85: protected function crudDelete(?Request $request, mixed $id): Response
86: {
87: // récupération de l'élément à supprimer
88: $item = $this->getItem($id);
89:
90: // vérification du token CSRF (sinon redirection vers la fiche)
91: if (false === $this->checkCSRF('delete'.$id, $request))
92: return $this->alert('danger', "error.csrf.invalid_token", $item);
93:
94: // suppression avec message et redirection
95: return $this->deleteItem($item, true);
96: }
97:
98: /**
99: * Toggle item property boolean value.
100: *
101: * @param Request $request
102: * @param mixed $id
103: * @param string $field Nom de la propriété de l'élément à modifier
104: * @param mixed $state Valeur à affecter à la propriété (convertie en booléen)
105: * @return Response
106: */
107: protected function crudToggle(Request $request, mixed $id, string $field, string $state = null): Response
108: {
109: // récupération de l'élément à modifier
110: $item = $this->getItem($id);
111:
112: // modification de la propriété, enregistrement avec message et redirection par défaut (referer)
113: return $this->toggleItem($item, $field, $state);
114: }
115:
116: /**
117: * List items with pagination (AJAX).
118: * @TODO
119: */
120: /*
121: protected function crudPageAction(Request $request): JsonResponse
122: {
123: if (! $request->isXmlHttpRequest()) return $this->renderAction('list', array(
124: 'items' => array(),
125: 'nbItems' => $this->getRepo()->pageCount(),
126: 'selOpts' => $this->selOpts,
127: ));
128:
129: $length = max($request->get('length', 0), 0);
130: $start = max($request->get('start', 0), 0);
131: $order = $request->get('order', array());
132: $search = $request->get('search', array());
133: $columns = $request->get('columns', array());
134:
135: $output = array(
136: 'recordsTotal' => $this->getRepo()->pageCount(),
137: 'recordsFiltered' => $this->getRepo()->pageCount($search, $columns),
138: 'data' => array(),
139: );
140: foreach ($this->getRepo()->pageSearch($search, $columns, $order, $start, $length) as $item) {
141: $output['data'][] = explode("\n\n\n", $this->renderContent('list-line.data', array('item' => $item)));
142: }
143: return new JsonResponse($output);
144: }
145: */
146:
147: }
148: