]> git.immae.eu Git - github/shaarli/Shaarli.git/blame - application/front/controller/admin/ManageTagController.php
Merge pull request #1697 from ArthurHoaro/feature/pagination
[github/shaarli/Shaarli.git] / application / front / controller / admin / ManageTagController.php
CommitLineData
8eac2e54
A
1<?php
2
3declare(strict_types=1);
4
5namespace Shaarli\Front\Controller\Admin;
6
7use Shaarli\Bookmark\BookmarkFilter;
1a8ac737 8use Shaarli\Render\TemplatePage;
8eac2e54
A
9use Slim\Http\Request;
10use Slim\Http\Response;
11
12/**
13 * Class ManageTagController
14 *
15 * Slim controller used to handle Shaarli manage tags page (rename and delete tags).
16 */
17class ManageTagController extends ShaarliAdminController
18{
19 /**
9c75f877 20 * GET /admin/tags - Displays the manage tags page
8eac2e54
A
21 */
22 public function index(Request $request, Response $response): Response
23 {
24 $fromTag = $request->getParam('fromtag') ?? '';
25
26 $this->assignView('fromtag', escape($fromTag));
b3bd8c3e
A
27 $separator = escape($this->container->conf->get('general.tags_separator', ' '));
28 if ($separator === ' ') {
29 $separator = '&nbsp;';
30 $this->assignView('tags_separator_desc', t('whitespace'));
31 }
32 $this->assignView('tags_separator', $separator);
8eac2e54
A
33 $this->assignView(
34 'pagetitle',
53054b2b 35 t('Manage tags') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
8eac2e54
A
36 );
37
1a8ac737 38 return $response->write($this->render(TemplatePage::CHANGE_TAG));
8eac2e54
A
39 }
40
41 /**
9c75f877 42 * POST /admin/tags - Update or delete provided tag
8eac2e54
A
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
72fbbcd6
A
50 $fromTag = trim($request->getParam('fromtag') ?? '');
51 $toTag = trim($request->getParam('totag') ?? '');
8eac2e54
A
52
53 if (0 === strlen($fromTag) || false === $isDelete && 0 === strlen($toTag)) {
54 $this->saveWarningMessage(t('Invalid tags provided.'));
55
9c75f877 56 return $this->redirect($response, '/admin/tags');
8eac2e54
A
57 }
58
59 // TODO: move this to bookmark service
9b8c0a45
A
60 $searchResult = $this->container->bookmarkService->search(
61 ['searchtags' => $fromTag],
62 BookmarkFilter::$ALL,
63 true
64 );
65 foreach ($searchResult->getBookmarks() as $bookmark) {
8eac2e54
A
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);
8eac2e54
A
74 }
75
76 $this->container->bookmarkService->save();
77
9b8c0a45 78 $count = $searchResult->getResultCount();
8eac2e54
A
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
53054b2b 93 $redirect = true === $isDelete ? '/admin/tags' : '/?searchtags=' . urlencode($toTag);
8eac2e54 94
9c75f877 95 return $this->redirect($response, $redirect);
8eac2e54 96 }
b3bd8c3e
A
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 }
8eac2e54 124}