]> git.agnieray.net Git - galette.git/blob - galette/lib/Galette/Controllers/Crud/DynamicFieldsController.php
99d5aac726617e14240afb443d5c99b782b58ae5
[galette.git] / galette / lib / Galette / Controllers / Crud / DynamicFieldsController.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Galette dynamic fields controller
7 *
8 * PHP version 5
9 *
10 * Copyright © 2020 The Galette Team
11 *
12 * This file is part of Galette (http://galette.tuxfamily.org).
13 *
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
26 *
27 * @category Controllers
28 * @package Galette
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2020 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @link http://galette.tuxfamily.org
34 * @since Available since 0.9.4dev - 2020-05-02
35 */
36
37 namespace Galette\Controllers\Crud;
38
39 use Galette\Controllers\CrudController;
40 use Slim\Http\Request;
41 use Slim\Http\Response;
42 use Galette\DynamicFields\DynamicField;
43 use Analog\Analog;
44
45 /**
46 * Galette dynamic fields controller
47 *
48 * @category Controllers
49 * @name DynamicFieldsController
50 * @package Galette
51 * @author Johan Cwiklinski <johan@x-tnd.be>
52 * @copyright 2020 The Galette Team
53 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
54 * @link http://galette.tuxfamily.org
55 * @since Available since 0.9.4dev - 2020-05-02
56 */
57
58 class DynamicFieldsController extends CrudController
59 {
60 // CRUD - Create
61
62 /**
63 * Add page
64 *
65 * @param Request $request PSR Request
66 * @param Response $response PSR Response
67 * @param array $args Request arguments
68 *
69 * @return Response
70 */
71 public function add(Request $request, Response $response, array $args = []): Response
72 {
73 $form_name = $args['form'];
74
75 $df = null;
76 if ($this->session->dynamicfieldtype) {
77 $df = $this->session->dynamicfieldtype;
78 $this->session->dynamicfieldtype = null;
79 }
80
81 $params = [
82 'page_title' => _T("Add field"),
83 'form_name' => $form_name,
84 'action' => 'add',
85 'perm_names' => DynamicField::getPermsNames(),
86 'mode' => ($request->isXhr() ? 'ajax' : ''),
87 'field_type_names' => DynamicField::getFieldsTypesNames()
88 ];
89
90 // display page
91 $this->view->render(
92 $response,
93 'editer_champ.tpl',
94 $params
95 );
96 return $response;
97 }
98
99 /**
100 * Add action
101 *
102 * @param Request $request PSR Request
103 * @param Response $response PSR Response
104 * @param array $args Request arguments
105 *
106 * @return Response
107 */
108 public function doAdd(Request $request, Response $response, array $args = []): Response
109 {
110 $post = $request->getParsedBody();
111
112 $error_detected = [];
113 $warning_detected = [];
114
115 $df = DynamicField::getFieldType($this->zdb, $post['field_type']);
116
117 try {
118 $df->store($post);
119 $error_detected = $df->getErrors();
120 $warning_detected = $df->getWarnings();
121 } catch (\Exception $e) {
122 $msg = 'An error occurred adding new dynamic field.';
123 Analog::log(
124 $msg . ' | ' .
125 $e->getMessage(),
126 Analog::ERROR
127 );
128 if (GALETTE_MODE == 'DEV') {
129 throw $e;
130 }
131 $error_detected[] = _T('An error occurred adding dynamic field :(');
132 }
133
134 //flash messages
135 if (count($error_detected) > 0) {
136 foreach ($error_detected as $error) {
137 $this->flash->addMessage(
138 'error_detected',
139 $error
140 );
141 }
142 } else {
143 $this->flash->addMessage(
144 'success_detected',
145 _T('Dynamic field has been successfully stored!')
146 );
147 }
148
149 if (count($warning_detected) > 0) {
150 foreach ($warning_detected as $warning) {
151 $this->flash->addMessage(
152 'warning_detected',
153 $warning
154 );
155 }
156 }
157
158 //handle redirections
159 if (count($error_detected) > 0) {
160 //something went wrong :'(
161 $this->session->dynamicfieldtype = $df;
162 return $response
163 ->withStatus(301)
164 ->withHeader(
165 'Location',
166 $this->router->pathFor(
167 'addDynamicField',
168 $args
169 )
170 );
171 } else {
172 if (!$df instanceof \Galette\DynamicFields\Separator) {
173 return $response
174 ->withStatus(301)
175 ->withHeader(
176 'Location',
177 $this->router->pathFor(
178 'editDynamicField',
179 [
180 'form' => $args['form'],
181 'id' => $df->getId()
182 ]
183 )
184 );
185 }
186
187 return $response
188 ->withStatus(301)
189 ->withHeader(
190 'Location',
191 $this->router->pathFor(
192 'configureDynamicFields',
193 ['form' => $args['form']]
194 )
195 );
196 }
197 }
198
199 // /CRUD - Create
200 // CRUD - Read
201
202 /**
203 * List page
204 *
205 * @param Request $request PSR Request
206 * @param Response $response PSR Response
207 * @param array $args Request arguments
208 *
209 * @return Response
210 */
211 public function list(Request $request, Response $response, array $args = []): Response
212 {
213 $form_name = $args['form'] ?? 'adh';
214 if (isset($_POST['form']) && trim($_POST['form']) != '') {
215 $form_name = $_POST['form'];
216 }
217 $fields = new \Galette\Repository\DynamicFieldsSet($this->zdb, $this->login);
218 $fields_list = $fields->getList($form_name, $this->login);
219
220 $field_type_names = DynamicField::getFieldsTypesNames();
221
222 $params = [
223 'fields_list' => $fields_list,
224 'form_name' => $form_name,
225 'form_title' => DynamicField::getFormTitle($form_name),
226 'page_title' => _T("Dynamic fields configuration")
227 ];
228
229 $tpl = 'configurer_fiches.tpl';
230 //Render directly template if we called from ajax,
231 //render in a full page otherwise
232 if (
233 $request->isXhr()
234 || isset($request->getQueryParams()['ajax'])
235 && $request->getQueryParams()['ajax'] == 'true'
236 ) {
237 $tpl = 'configurer_fiche_content.tpl';
238 } else {
239 $all_forms = DynamicField::getFormsNames();
240 $params['all_forms'] = $all_forms;
241 }
242
243 // display page
244 $this->view->render(
245 $response,
246 $tpl,
247 $params
248 );
249 return $response;
250 }
251
252 /**
253 * Filtering
254 *
255 * @param Request $request PSR Request
256 * @param Response $response PSR Response
257 *
258 * @return Response
259 */
260 public function filter(Request $request, Response $response): Response
261 {
262 //no filtering
263 }
264
265 // /CRUD - Read
266 // CRUD - Update
267
268 /**
269 * Edit page
270 *
271 * @param Request $request PSR Request
272 * @param Response $response PSR Response
273 * @param array $args Request arguments
274 *
275 * @return Response
276 */
277 public function edit(Request $request, Response $response, array $args = []): Response
278 {
279 $id_dynf = (int)$args['id'];
280 $form_name = $args['form'];
281
282 $df = null;
283 if ($this->session->dynamicfieldtype) {
284 $df = $this->session->dynamicfieldtype;
285 $this->session->dynamicfieldtype = null;
286 } else {
287 $df = DynamicField::loadFieldType($this->zdb, $id_dynf);
288 if ($df === false) {
289 $this->flash->addMessage(
290 'error_detected',
291 _T("Unable to retrieve field information.")
292 );
293 return $response
294 ->withStatus(301)
295 ->withHeader('Location', $this->router->pathFor('configureDynamicFields'));
296 }
297 }
298
299 $params = [
300 'page_title' => _T("Edit field"),
301 'action' => 'edit',
302 'form_name' => $form_name,
303 'perm_names' => DynamicField::getPermsNames(),
304 'mode' => ($request->isXhr() ? 'ajax' : ''),
305 'df' => $df
306 ];
307
308 // display page
309 $this->view->render(
310 $response,
311 'editer_champ.tpl',
312 $params
313 );
314 return $response;
315 }
316
317 /**
318 * Edit action
319 *
320 * @param Request $request PSR Request
321 * @param Response $response PSR Response
322 * @param array $args Request arguments
323 *
324 * @return Response
325 */
326 public function doEdit(Request $request, Response $response, array $args = []): Response
327 {
328 $post = $request->getParsedBody();
329
330 $error_detected = [];
331 $warning_detected = [];
332
333 $field_id = (int)$args['id'];
334 $df = DynamicField::loadFieldType($this->zdb, $field_id);
335
336 try {
337 $df->store($post);
338 $error_detected = $df->getErrors();
339 $warning_detected = $df->getWarnings();
340 } catch (\Exception $e) {
341 $msg = 'An error occurred storing dynamic field ' . $df->getId() . '.';
342 Analog::log(
343 $msg . ' | ' .
344 $e->getMessage(),
345 Analog::ERROR
346 );
347 if (GALETTE_MODE == 'DEV') {
348 throw $e;
349 }
350 $error_detected[] = _T('An error occurred editing dynamic field :(');
351 }
352
353 //flash messages
354 if (count($error_detected) > 0) {
355 foreach ($error_detected as $error) {
356 $this->flash->addMessage(
357 'error_detected',
358 $error
359 );
360 }
361 } else {
362 $this->flash->addMessage(
363 'success_detected',
364 _T('Dynamic field has been successfully stored!')
365 );
366 }
367
368 if (count($warning_detected) > 0) {
369 foreach ($warning_detected as $warning) {
370 $this->flash->addMessage(
371 'warning_detected',
372 $warning
373 );
374 }
375 }
376
377 //handle redirections
378 if (count($error_detected) > 0) {
379 //something went wrong :'(
380 $this->session->dynamicfieldtype = $df;
381 return $response
382 ->withStatus(301)
383 ->withHeader(
384 'Location',
385 $this->router->pathFor(
386 'editDynamicField',
387 $args
388 )
389 );
390 } else {
391 return $response
392 ->withStatus(301)
393 ->withHeader(
394 'Location',
395 $this->router->pathFor(
396 'configureDynamicFields',
397 ['form' => $args['form']]
398 )
399 );
400 }
401 }
402
403 // /CRUD - Update
404 // CRUD - Delete
405
406 /**
407 * Get redirection URI
408 *
409 * @param array $args Route arguments
410 *
411 * @return string
412 */
413 public function redirectUri(array $args = [])
414 {
415 return $this->router->pathFor('configureDynamicFields');
416 }
417
418 /**
419 * Get form URI
420 *
421 * @param array $args Route arguments
422 *
423 * @return string
424 */
425 public function formUri(array $args = [])
426 {
427 return $this->router->pathFor(
428 'doRemoveDynamicField',
429 ['id' => $args['id'], 'form' => $args['form']]
430 );
431 }
432
433 /**
434 * Get confirmation removal page title
435 *
436 * @param array $args Route arguments
437 *
438 * @return string
439 */
440 public function confirmRemoveTitle(array $args = [])
441 {
442 $field = DynamicField::loadFieldType($this->zdb, (int)$args['id']);
443 if ($field === false) {
444 $this->flash->addMessage(
445 'error_detected',
446 _T("Requested field does not exists!")
447 );
448 return $response
449 ->withStatus(301)
450 ->withHeader('Location', $this->router->pathFor('configureDynamicFields', ['form' => $args['form']]));
451 }
452
453 return sprintf(
454 _T('Remove dynamic field %1$s'),
455 $field->getName()
456 );
457 }
458
459 /**
460 * Remove object
461 *
462 * @param array $args Route arguments
463 * @param array $post POST values
464 *
465 * @return boolean
466 */
467 protected function doDelete(array $args, array $post)
468 {
469 $field_id = (int)$post['id'];
470 $field = DynamicField::loadFieldType($this->zdb, $field_id);
471 return $field->remove();
472 }
473
474 // /CRUD - Delete
475 // /CRUD
476
477 /**
478 * Move field
479 *
480 * @param Request $request PSR Request
481 * @param Response $response PSR Response
482 * @param array $args Request arguments
483 *
484 * @return Response
485 */
486 public function move(Request $request, Response $response, array $args = []): Response
487 {
488 $field_id = (int)$args['id'];
489 $form_name = $args['form'];
490
491 $field = DynamicField::loadFieldType($this->zdb, $field_id);
492 if ($field->move($args['direction'])) {
493 $this->flash->addMessage(
494 'success_detected',
495 _T("Field has been successfully moved")
496 );
497 } else {
498 $this->flash->addMessage(
499 'error_detected',
500 _T("An error occurred moving field :(")
501 );
502 }
503
504 return $response
505 ->withStatus(301)
506 ->withHeader('Location', $this->router->pathFor('configureDynamicFields', ['form' => $form_name]));
507 }
508 }