]>
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 | $searchResult = $this->container->bookmarkService->search( | |
61 | ['searchtags' => $fromTag], | |
62 | BookmarkFilter::$ALL, | |
63 | true | |
64 | ); | |
65 | foreach ($searchResult->getBookmarks() as $bookmark) { | |
66 | if (false === $isDelete) { | |
67 | $bookmark->renameTag($fromTag, $toTag); | |
68 | } else { | |
69 | $bookmark->deleteTag($fromTag); | |
70 | } | |
71 | ||
72 | $this->container->bookmarkService->set($bookmark, false); | |
73 | $this->container->history->updateLink($bookmark); | |
74 | } | |
75 | ||
76 | $this->container->bookmarkService->save(); | |
77 | ||
78 | $count = $searchResult->getResultCount(); | |
79 | if (true === $isDelete) { | |
80 | $alert = sprintf( | |
81 | t('The tag was removed from %d bookmark.', 'The tag was removed from %d bookmarks.', $count), | |
82 | $count | |
83 | ); | |
84 | } else { | |
85 | $alert = sprintf( | |
86 | t('The tag was renamed in %d bookmark.', 'The tag was renamed in %d bookmarks.', $count), | |
87 | $count | |
88 | ); | |
89 | } | |
90 | ||
91 | $this->saveSuccessMessage($alert); | |
92 | ||
93 | $redirect = true === $isDelete ? '/admin/tags' : '/?searchtags=' . urlencode($toTag); | |
94 | ||
95 | return $this->redirect($response, $redirect); | |
96 | } | |
97 | ||
98 | /** | |
99 | * POST /admin/tags/change-separator - Change tag separator | |
100 | */ | |
101 | public function changeSeparator(Request $request, Response $response): Response | |
102 | { | |
103 | $this->checkToken($request); | |
104 | ||
105 | $reservedCharacters = ['-', '.', '*']; | |
106 | $newSeparator = $request->getParam('separator'); | |
107 | if ($newSeparator === null || mb_strlen($newSeparator) !== 1) { | |
108 | $this->saveErrorMessage(t('Tags separator must be a single character.')); | |
109 | } elseif (in_array($newSeparator, $reservedCharacters, true)) { | |
110 | $reservedCharacters = implode(' ', array_map(function (string $character) { | |
111 | return '<code>' . $character . '</code>'; | |
112 | }, $reservedCharacters)); | |
113 | $this->saveErrorMessage( | |
114 | t('These characters are reserved and can\'t be used as tags separator: ') . $reservedCharacters | |
115 | ); | |
116 | } else { | |
117 | $this->container->conf->set('general.tags_separator', $newSeparator, true, true); | |
118 | ||
119 | $this->saveSuccessMessage('Your tags separator setting has been updated!'); | |
120 | } | |
121 | ||
122 | return $this->redirect($response, '/admin/tags'); | |
123 | } | |
124 | } |