]>
Commit | Line | Data |
---|---|---|
1 | <?php | |
2 | ||
3 | declare(strict_types=1); | |
4 | ||
5 | namespace Shaarli\Front\Controller\Admin; | |
6 | ||
7 | use Shaarli\Bookmark\BookmarkFilter; | |
8 | use Shaarli\Render\TemplatePage; | |
9 | use Slim\Http\Request; | |
10 | use Slim\Http\Response; | |
11 | ||
12 | /** | |
13 | * Class ManageTagController | |
14 | * | |
15 | * Slim controller used to handle Shaarli manage tags page (rename and delete tags). | |
16 | */ | |
17 | class ManageTagController extends ShaarliAdminController | |
18 | { | |
19 | /** | |
20 | * GET /admin/tags - Displays the manage tags page | |
21 | */ | |
22 | public function index(Request $request, Response $response): Response | |
23 | { | |
24 | $fromTag = $request->getParam('fromtag') ?? ''; | |
25 | ||
26 | $this->assignView('fromtag', escape($fromTag)); | |
27 | $separator = escape($this->container->conf->get('general.tags_separator', ' ')); | |
28 | if ($separator === ' ') { | |
29 | $separator = ' '; | |
30 | $this->assignView('tags_separator_desc', t('whitespace')); | |
31 | } | |
32 | $this->assignView('tags_separator', $separator); | |
33 | $this->assignView( | |
34 | 'pagetitle', | |
35 | t('Manage tags') .' - '. $this->container->conf->get('general.title', 'Shaarli') | |
36 | ); | |
37 | ||
38 | return $response->write($this->render(TemplatePage::CHANGE_TAG)); | |
39 | } | |
40 | ||
41 | /** | |
42 | * POST /admin/tags - Update or delete provided tag | |
43 | */ | |
44 | public function save(Request $request, Response $response): Response | |
45 | { | |
46 | $this->checkToken($request); | |
47 | ||
48 | $isDelete = null !== $request->getParam('deletetag') && null === $request->getParam('renametag'); | |
49 | ||
50 | $fromTag = trim($request->getParam('fromtag') ?? ''); | |
51 | $toTag = trim($request->getParam('totag') ?? ''); | |
52 | ||
53 | if (0 === strlen($fromTag) || false === $isDelete && 0 === strlen($toTag)) { | |
54 | $this->saveWarningMessage(t('Invalid tags provided.')); | |
55 | ||
56 | return $this->redirect($response, '/admin/tags'); | |
57 | } | |
58 | ||
59 | // TODO: move this to bookmark service | |
60 | $count = 0; | |
61 | $bookmarks = $this->container->bookmarkService->search(['searchtags' => $fromTag], BookmarkFilter::$ALL, true); | |
62 | foreach ($bookmarks as $bookmark) { | |
63 | if (false === $isDelete) { | |
64 | $bookmark->renameTag($fromTag, $toTag); | |
65 | } else { | |
66 | $bookmark->deleteTag($fromTag); | |
67 | } | |
68 | ||
69 | $this->container->bookmarkService->set($bookmark, false); | |
70 | $this->container->history->updateLink($bookmark); | |
71 | $count++; | |
72 | } | |
73 | ||
74 | $this->container->bookmarkService->save(); | |
75 | ||
76 | if (true === $isDelete) { | |
77 | $alert = sprintf( | |
78 | t('The tag was removed from %d bookmark.', 'The tag was removed from %d bookmarks.', $count), | |
79 | $count | |
80 | ); | |
81 | } else { | |
82 | $alert = sprintf( | |
83 | t('The tag was renamed in %d bookmark.', 'The tag was renamed in %d bookmarks.', $count), | |
84 | $count | |
85 | ); | |
86 | } | |
87 | ||
88 | $this->saveSuccessMessage($alert); | |
89 | ||
90 | $redirect = true === $isDelete ? '/admin/tags' : '/?searchtags='. urlencode($toTag); | |
91 | ||
92 | return $this->redirect($response, $redirect); | |
93 | } | |
94 | ||
95 | /** | |
96 | * POST /admin/tags/change-separator - Change tag separator | |
97 | */ | |
98 | public function changeSeparator(Request $request, Response $response): Response | |
99 | { | |
100 | $this->checkToken($request); | |
101 | ||
102 | $reservedCharacters = ['-', '.', '*']; | |
103 | $newSeparator = $request->getParam('separator'); | |
104 | if ($newSeparator === null || mb_strlen($newSeparator) !== 1) { | |
105 | $this->saveErrorMessage(t('Tags separator must be a single character.')); | |
106 | } elseif (in_array($newSeparator, $reservedCharacters, true)) { | |
107 | $reservedCharacters = implode(' ', array_map(function (string $character) { | |
108 | return '<code>' . $character . '</code>'; | |
109 | }, $reservedCharacters)); | |
110 | $this->saveErrorMessage( | |
111 | t('These characters are reserved and can\'t be used as tags separator: ') . $reservedCharacters | |
112 | ); | |
113 | } else { | |
114 | $this->container->conf->set('general.tags_separator', $newSeparator, true, true); | |
115 | ||
116 | $this->saveSuccessMessage('Your tags separator setting has been updated!'); | |
117 | } | |
118 | ||
119 | return $this->redirect($response, '/admin/tags'); | |
120 | } | |
121 | } |