diff options
Diffstat (limited to 'application')
-rw-r--r-- | application/front/controllers/TagCloudController.php | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/application/front/controllers/TagCloudController.php b/application/front/controllers/TagCloudController.php index 93e3ae27..1ff7c2e6 100644 --- a/application/front/controllers/TagCloudController.php +++ b/application/front/controllers/TagCloudController.php | |||
@@ -10,12 +10,15 @@ use Slim\Http\Response; | |||
10 | /** | 10 | /** |
11 | * Class TagCloud | 11 | * Class TagCloud |
12 | * | 12 | * |
13 | * Slim controller used to render the tag cloud page. | 13 | * Slim controller used to render the tag cloud and tag list pages. |
14 | * | 14 | * |
15 | * @package Front\Controller | 15 | * @package Front\Controller |
16 | */ | 16 | */ |
17 | class TagCloudController extends ShaarliController | 17 | class TagCloudController extends ShaarliController |
18 | { | 18 | { |
19 | protected const TYPE_CLOUD = 'cloud'; | ||
20 | protected const TYPE_LIST = 'list'; | ||
21 | |||
19 | /** | 22 | /** |
20 | * Display the tag cloud through the template engine. | 23 | * Display the tag cloud through the template engine. |
21 | * This controller a few filters: | 24 | * This controller a few filters: |
@@ -24,26 +27,53 @@ class TagCloudController extends ShaarliController | |||
24 | */ | 27 | */ |
25 | public function cloud(Request $request, Response $response): Response | 28 | public function cloud(Request $request, Response $response): Response |
26 | { | 29 | { |
30 | return $this->processRequest(static::TYPE_CLOUD, $request, $response); | ||
31 | } | ||
32 | |||
33 | /** | ||
34 | * Display the tag list through the template engine. | ||
35 | * This controller a few filters: | ||
36 | * - Visibility stored in the session for logged in users | ||
37 | * - `searchtags` query parameter: will return tags associated with filter in at least one bookmark | ||
38 | * - `sort` query parameters: | ||
39 | * + `usage` (default): most used tags first | ||
40 | * + `alpha`: alphabetical order | ||
41 | */ | ||
42 | public function list(Request $request, Response $response): Response | ||
43 | { | ||
44 | return $this->processRequest(static::TYPE_LIST, $request, $response); | ||
45 | } | ||
46 | |||
47 | /** | ||
48 | * Process the request for both tag cloud and tag list endpoints. | ||
49 | */ | ||
50 | protected function processRequest(string $type, Request $request, Response $response): Response | ||
51 | { | ||
27 | if ($this->container->loginManager->isLoggedIn() === true) { | 52 | if ($this->container->loginManager->isLoggedIn() === true) { |
28 | $visibility = $this->container->sessionManager->getSessionParameter('visibility'); | 53 | $visibility = $this->container->sessionManager->getSessionParameter('visibility'); |
29 | } | 54 | } |
30 | 55 | ||
56 | $sort = $request->getQueryParam('sort'); | ||
31 | $searchTags = $request->getQueryParam('searchtags'); | 57 | $searchTags = $request->getQueryParam('searchtags'); |
32 | $filteringTags = $searchTags !== null ? explode(' ', $searchTags) : []; | 58 | $filteringTags = $searchTags !== null ? explode(' ', $searchTags) : []; |
33 | 59 | ||
34 | $tags = $this->container->bookmarkService->bookmarksCountPerTag($filteringTags, $visibility ?? null); | 60 | $tags = $this->container->bookmarkService->bookmarksCountPerTag($filteringTags, $visibility ?? null); |
35 | 61 | ||
36 | // TODO: the sorting should be handled by bookmarkService instead of the controller | 62 | if (static::TYPE_CLOUD === $type || 'alpha' === $sort) { |
37 | alphabetical_sort($tags, false, true); | 63 | // TODO: the sorting should be handled by bookmarkService instead of the controller |
64 | alphabetical_sort($tags, false, true); | ||
65 | } | ||
38 | 66 | ||
39 | $tagList = $this->formatTagsForCloud($tags); | 67 | if (static::TYPE_CLOUD === $type) { |
68 | $tags = $this->formatTagsForCloud($tags); | ||
69 | } | ||
40 | 70 | ||
41 | $searchTags = implode(' ', escape($filteringTags)); | 71 | $searchTags = implode(' ', escape($filteringTags)); |
42 | $data = [ | 72 | $data = [ |
43 | 'search_tags' => $searchTags, | 73 | 'search_tags' => $searchTags, |
44 | 'tags' => $tagList, | 74 | 'tags' => $tags, |
45 | ]; | 75 | ]; |
46 | $data = $this->executeHooks($data); | 76 | $data = $this->executeHooks('tag' . $type, $data); |
47 | foreach ($data as $key => $value) { | 77 | foreach ($data as $key => $value) { |
48 | $this->assignView($key, $value); | 78 | $this->assignView($key, $value); |
49 | } | 79 | } |
@@ -51,12 +81,19 @@ class TagCloudController extends ShaarliController | |||
51 | $searchTags = !empty($searchTags) ? $searchTags .' - ' : ''; | 81 | $searchTags = !empty($searchTags) ? $searchTags .' - ' : ''; |
52 | $this->assignView( | 82 | $this->assignView( |
53 | 'pagetitle', | 83 | 'pagetitle', |
54 | $searchTags . t('Tag cloud') .' - '. $this->container->conf->get('general.title', 'Shaarli') | 84 | $searchTags . t('Tag '. $type) .' - '. $this->container->conf->get('general.title', 'Shaarli') |
55 | ); | 85 | ); |
56 | 86 | ||
57 | return $response->write($this->render('tag.cloud')); | 87 | return $response->write($this->render('tag.'. $type)); |
58 | } | 88 | } |
59 | 89 | ||
90 | /** | ||
91 | * Format the tags array for the tag cloud template. | ||
92 | * | ||
93 | * @param array<string, int> $tags List of tags as key with count as value | ||
94 | * | ||
95 | * @return mixed[] List of tags as key, with count and expected font size in a subarray | ||
96 | */ | ||
60 | protected function formatTagsForCloud(array $tags): array | 97 | protected function formatTagsForCloud(array $tags): array |
61 | { | 98 | { |
62 | // We sort tags alphabetically, then choose a font size according to count. | 99 | // We sort tags alphabetically, then choose a font size according to count. |
@@ -81,12 +118,12 @@ class TagCloudController extends ShaarliController | |||
81 | /** | 118 | /** |
82 | * @param mixed[] $data Template data | 119 | * @param mixed[] $data Template data |
83 | * | 120 | * |
84 | * @return mixed[] Template data after active plugins render_picwall hook execution. | 121 | * @return mixed[] Template data after active plugins hook execution. |
85 | */ | 122 | */ |
86 | protected function executeHooks(array $data): array | 123 | protected function executeHooks(string $template, array $data): array |
87 | { | 124 | { |
88 | $this->container->pluginManager->executeHooks( | 125 | $this->container->pluginManager->executeHooks( |
89 | 'render_tagcloud', | 126 | 'render_'. $template, |
90 | $data, | 127 | $data, |
91 | ['loggedin' => $this->container->loginManager->isLoggedIn()] | 128 | ['loggedin' => $this->container->loginManager->isLoggedIn()] |
92 | ); | 129 | ); |