]> git.agnieray.net Git - galette.git/blob - galette/lib/Galette/Controllers/Crud/SavedSearchesController.php
5c56fe806bcd959605448681661f224fa06718d8
[galette.git] / galette / lib / Galette / Controllers / Crud / SavedSearchesController.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Galette saved searches 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 * @version SVN: $Id$
34 * @link http://galette.tuxfamily.org
35 * @since Available since 0.9.4dev - 2020-05-03
36 */
37
38 namespace Galette\Controllers\Crud;
39
40 use Galette\Controllers\CrudController;
41
42 use Slim\Http\Request;
43 use Slim\Http\Response;
44 use Galette\Entity\SavedSearch;
45 use Galette\Filters\AdvancedMembersList;
46 use Galette\Filters\MembersList;
47 use Galette\Filters\SavedSearchesList;
48 use Galette\Repository\SavedSearches;
49 use Analog\Analog;
50
51 /**
52 * Galette saved searches controller
53 *
54 * @category Controllers
55 * @name SavedSearchesController
56 * @package Galette
57 * @author Johan Cwiklinski <johan@x-tnd.be>
58 * @copyright 2020 The Galette Team
59 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
60 * @link http://galette.tuxfamily.org
61 * @since Available since 0.9.4dev - 2020-05-03
62 */
63
64 class SavedSearchesController extends CrudController
65 {
66 // CRUD - Create
67
68 /**
69 * Add page
70 *
71 * @param Request $request PSR Request
72 * @param Response $response PSR Response
73 * @param array $args Request arguments
74 *
75 * @return Response
76 */
77 public function add(Request $request, Response $response, array $args = []) :Response
78 {
79 //no new page (included on list), just to satisfy inheritance
80 }
81
82 /**
83 * Add action
84 *
85 * @param Request $request PSR Request
86 * @param Response $response PSR Response
87 * @param array $args Request arguments
88 *
89 * @return Response
90 */
91 public function doAdd(Request $request, Response $response, array $args = []) :Response
92 {
93 if ($request->isPost()) {
94 $post = $request->getParsedBody();
95 } else {
96 $post = $request->getQueryParams();
97 }
98
99 $name = null;
100 if (isset($post['search_title'])) {
101 $name = $post['search_title'];
102 unset($post['search_title']);
103 }
104
105 //when using advanced search, no parameters are sent
106 if (isset($post['advanced_search'])) {
107 $post = [];
108 $filters = $this->session->filter_members;
109 foreach ($filters->search_fields as $field) {
110 $post[$field] = $filters->$field;
111 }
112 }
113
114 //reformat, add required infos
115 $post = [
116 'parameters' => $post,
117 'form' => 'Adherent',
118 'name' => $name
119 ];
120
121 $sco = new SavedSearch($this->zdb, $this->login);
122 if ($check = $sco->check($post)) {
123 if (!$res = $sco->store()) {
124 if ($res === false) {
125 $this->flash->addMessage(
126 'error_detected',
127 _T("An SQL error has occurred while storing search.")
128 );
129 } else {
130 $this->flash->addMessage(
131 'warning_detected',
132 _T("This search is already saved.")
133 );
134 }
135 } else {
136 $this->flash->addMessage(
137 'success_detected',
138 _T("Search has been saved.")
139 );
140 }
141 } else {
142 //report errors
143 foreach ($sco->getErrors() as $error) {
144 $this->flash->addMessage(
145 'error_detected',
146 $error
147 );
148 }
149 }
150
151 if ($request->isGet()) {
152 return $response
153 ->withStatus(301)
154 ->withHeader('Location', $this->router->pathFor('members'));
155 } else {
156 //called from ajax, return json
157 return $response->withJson(['success' => $check]);
158 }
159 }
160
161 // /CRUD - Create
162 // CRUD - Read
163
164 /**
165 * List page
166 *
167 * @param Request $request PSR Request
168 * @param Response $response PSR Response
169 * @param array $args Request arguments
170 *
171 * @return Response
172 */
173 public function list(Request $request, Response $response, array $args = []) :Response
174 {
175 $option = null;
176 if (isset($args['option'])) {
177 $option = $args['option'];
178 }
179 $value = null;
180 if (isset($args['value'])) {
181 $value = $args['value'];
182 }
183
184 if (isset($this->session->filter_savedsearch)) {
185 $filters = $this->session->filter_savedsearch;
186 } else {
187 $filters = new SavedSearchesList();
188 }
189
190 if ($option !== null) {
191 switch ($option) {
192 case 'page':
193 $filters->current_page = (int)$value;
194 break;
195 case 'order':
196 $filters->orderby = $value;
197 break;
198 }
199 }
200
201 $searches = new SavedSearches($this->zdb, $this->login, $filters);
202 $list = $searches->getList(true);
203
204 //assign pagination variables to the template and add pagination links
205 $filters->setSmartyPagination($this->router, $this->view->getSmarty(), false);
206
207 $this->session->filter_savedsearch = $filters;
208
209 // display page
210 $this->view->render(
211 $response,
212 'saved_searches.tpl',
213 array(
214 'page_title' => _T("Saved searches"),
215 'searches' => $list,
216 'nb' => $searches->getCount(),
217 'filters' => $filters
218 )
219 );
220 return $response;
221 }
222
223 /**
224 * Filtering
225 *
226 * @param Request $request PSR Request
227 * @param Response $response PSR Response
228 *
229 * @return Response
230 */
231 public function filter(Request $request, Response $response) :Response
232 {
233 //no filters
234 }
235
236 // /CRUD - Read
237 // CRUD - Update
238
239 /**
240 * Edit page
241 *
242 * @param Request $request PSR Request
243 * @param Response $response PSR Response
244 * @param array $args Request arguments
245 *
246 * @return Response
247 */
248 public function edit(Request $request, Response $response, array $args = []) :Response
249 {
250 //no edition
251 }
252
253 /**
254 * Edit action
255 *
256 * @param Request $request PSR Request
257 * @param Response $response PSR Response
258 * @param array $args Request arguments
259 *
260 * @return Response
261 */
262 public function doEdit(Request $request, Response $response, array $args = []) :Response
263 {
264 //no edition
265 }
266
267 // /CRUD - Update
268 // CRUD - Delete
269
270 /**
271 * Get redirection URI
272 *
273 * @param array $args Route arguments
274 *
275 * @return string
276 */
277 public function redirectUri(array $args = [])
278 {
279 return $this->router->pathFor('searches');
280 }
281
282 /**
283 * Get form URI
284 *
285 * @param array $args Route arguments
286 *
287 * @return string
288 */
289 public function formUri(array $args = [])
290 {
291 return $this->router->pathFor(
292 'doRemoveSearch',
293 ['id' => $args['id'] ?? null]
294 );
295 }
296
297 /**
298 * Get confirmation removal page title
299 *
300 * @param array $args Route arguments
301 *
302 * @return string
303 */
304 public function confirmRemoveTitle(array $args = [])
305 {
306 if (isset($args['id'])) {
307 return _T('Remove saved search');
308 } else {
309 //batch saved search removal
310 $filters = $this->session->filter_savedsearch;
311 return str_replace(
312 '%count',
313 count($filters->selected),
314 _T('You are about to remove %count searches.')
315 );
316 }
317 }
318
319 /**
320 * Remove object
321 *
322 * @param array $args Route arguments
323 * @param array $post POST values
324 *
325 * @return boolean
326 */
327 protected function doDelete(array $args, array $post)
328 {
329 if (isset($this->session->filter_savedsearch)) {
330 $filters = $this->session->filter_savedsearch;
331 } else {
332 $filters = new SavedSearchesList();
333 }
334 $searches = new SavedSearches($this->zdb, $this->login, $filters);
335
336 if (!is_array($post['id'])) {
337 $ids = (array)$post['id'];
338 } else {
339 $ids = $post['id'];
340 }
341
342 $del = $searches->remove($ids, $this->history);
343 return $del;
344 }
345
346 // CRUD - Delete
347
348 /**
349 * Load saved search
350 *
351 * @param Request $request PSR Request
352 * @param Response $response PSR Response
353 * @param array $args Request arguments
354 *
355 * @return Response
356 */
357 public function load(Request $request, Response $response, array $args = []) :Response
358 {
359 try {
360 $sco = new SavedSearch($this->zdb, $this->login, (int)$args['id']);
361 $this->flash->addMessage(
362 'success_detected',
363 _T("Saved search loaded")
364 );
365 } catch (\Exception $e) {
366 $this->flash->addMessage(
367 'error_detected',
368 _T("An SQL error has occurred while loading search.")
369 );
370 }
371 $parameters = (array)$sco->parameters;
372
373 $filters = null;
374 if (isset($parameters['free_search'])) {
375 $filters = new AdvancedMembersList();
376 } else {
377 $filters = new MembersList();
378 }
379
380 foreach ($parameters as $key => $value) {
381 $filters->$key = $value;
382 }
383 $this->session->filter_members = $filters;
384
385 return $response
386 ->withStatus(301)
387 ->withHeader('Location', $this->router->pathFor('members'));
388 }
389 }