2020-05-30 15:51:14 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
namespace Shaarli\Front\Controller\Admin;
|
|
|
|
|
|
|
|
use Shaarli\Bookmark\BookmarkFilter;
|
2020-07-06 08:04:35 +02:00
|
|
|
use Shaarli\Render\TemplatePage;
|
2020-05-30 15:51:14 +02:00
|
|
|
use Slim\Http\Request;
|
|
|
|
use Slim\Http\Response;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Class ManageTagController
|
|
|
|
*
|
|
|
|
* Slim controller used to handle Shaarli manage tags page (rename and delete tags).
|
|
|
|
*/
|
|
|
|
class ManageTagController extends ShaarliAdminController
|
|
|
|
{
|
|
|
|
/**
|
2020-06-13 13:08:01 +02:00
|
|
|
* GET /admin/tags - Displays the manage tags page
|
2020-05-30 15:51:14 +02:00
|
|
|
*/
|
|
|
|
public function index(Request $request, Response $response): Response
|
|
|
|
{
|
|
|
|
$fromTag = $request->getParam('fromtag') ?? '';
|
|
|
|
|
|
|
|
$this->assignView('fromtag', escape($fromTag));
|
2020-10-22 16:21:03 +02:00
|
|
|
$separator = escape($this->container->conf->get('general.tags_separator', ' '));
|
|
|
|
if ($separator === ' ') {
|
|
|
|
$separator = ' ';
|
|
|
|
$this->assignView('tags_separator_desc', t('whitespace'));
|
|
|
|
}
|
|
|
|
$this->assignView('tags_separator', $separator);
|
2020-05-30 15:51:14 +02:00
|
|
|
$this->assignView(
|
|
|
|
'pagetitle',
|
2020-09-22 20:25:47 +02:00
|
|
|
t('Manage tags') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
|
2020-05-30 15:51:14 +02:00
|
|
|
);
|
|
|
|
|
2020-07-06 08:04:35 +02:00
|
|
|
return $response->write($this->render(TemplatePage::CHANGE_TAG));
|
2020-05-30 15:51:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-06-13 13:08:01 +02:00
|
|
|
* POST /admin/tags - Update or delete provided tag
|
2020-05-30 15:51:14 +02:00
|
|
|
*/
|
|
|
|
public function save(Request $request, Response $response): Response
|
|
|
|
{
|
|
|
|
$this->checkToken($request);
|
|
|
|
|
|
|
|
$isDelete = null !== $request->getParam('deletetag') && null === $request->getParam('renametag');
|
|
|
|
|
2020-10-06 17:30:18 +02:00
|
|
|
$fromTag = trim($request->getParam('fromtag') ?? '');
|
|
|
|
$toTag = trim($request->getParam('totag') ?? '');
|
2020-05-30 15:51:14 +02:00
|
|
|
|
|
|
|
if (0 === strlen($fromTag) || false === $isDelete && 0 === strlen($toTag)) {
|
|
|
|
$this->saveWarningMessage(t('Invalid tags provided.'));
|
|
|
|
|
2020-06-13 13:08:01 +02:00
|
|
|
return $this->redirect($response, '/admin/tags');
|
2020-05-30 15:51:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: move this to bookmark service
|
|
|
|
$count = 0;
|
|
|
|
$bookmarks = $this->container->bookmarkService->search(['searchtags' => $fromTag], BookmarkFilter::$ALL, true);
|
|
|
|
foreach ($bookmarks as $bookmark) {
|
|
|
|
if (false === $isDelete) {
|
|
|
|
$bookmark->renameTag($fromTag, $toTag);
|
|
|
|
} else {
|
|
|
|
$bookmark->deleteTag($fromTag);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->container->bookmarkService->set($bookmark, false);
|
|
|
|
$this->container->history->updateLink($bookmark);
|
|
|
|
$count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->container->bookmarkService->save();
|
|
|
|
|
|
|
|
if (true === $isDelete) {
|
|
|
|
$alert = sprintf(
|
|
|
|
t('The tag was removed from %d bookmark.', 'The tag was removed from %d bookmarks.', $count),
|
|
|
|
$count
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
$alert = sprintf(
|
|
|
|
t('The tag was renamed in %d bookmark.', 'The tag was renamed in %d bookmarks.', $count),
|
|
|
|
$count
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->saveSuccessMessage($alert);
|
|
|
|
|
2020-09-22 20:25:47 +02:00
|
|
|
$redirect = true === $isDelete ? '/admin/tags' : '/?searchtags=' . urlencode($toTag);
|
2020-05-30 15:51:14 +02:00
|
|
|
|
2020-06-13 13:08:01 +02:00
|
|
|
return $this->redirect($response, $redirect);
|
2020-05-30 15:51:14 +02:00
|
|
|
}
|
2020-10-22 16:21:03 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* POST /admin/tags/change-separator - Change tag separator
|
|
|
|
*/
|
|
|
|
public function changeSeparator(Request $request, Response $response): Response
|
|
|
|
{
|
|
|
|
$this->checkToken($request);
|
|
|
|
|
|
|
|
$reservedCharacters = ['-', '.', '*'];
|
|
|
|
$newSeparator = $request->getParam('separator');
|
|
|
|
if ($newSeparator === null || mb_strlen($newSeparator) !== 1) {
|
|
|
|
$this->saveErrorMessage(t('Tags separator must be a single character.'));
|
|
|
|
} elseif (in_array($newSeparator, $reservedCharacters, true)) {
|
|
|
|
$reservedCharacters = implode(' ', array_map(function (string $character) {
|
|
|
|
return '<code>' . $character . '</code>';
|
|
|
|
}, $reservedCharacters));
|
|
|
|
$this->saveErrorMessage(
|
|
|
|
t('These characters are reserved and can\'t be used as tags separator: ') . $reservedCharacters
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
$this->container->conf->set('general.tags_separator', $newSeparator, true, true);
|
|
|
|
|
|
|
|
$this->saveSuccessMessage('Your tags separator setting has been updated!');
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->redirect($response, '/admin/tags');
|
|
|
|
}
|
2020-05-30 15:51:14 +02:00
|
|
|
}
|