diff options
Diffstat (limited to 'application/front/controllers')
-rw-r--r-- | application/front/controllers/TagController.php | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/application/front/controllers/TagController.php b/application/front/controllers/TagController.php index 598275b0..a1d5ad5b 100644 --- a/application/front/controllers/TagController.php +++ b/application/front/controllers/TagController.php | |||
@@ -35,7 +35,7 @@ class TagController extends ShaarliController | |||
35 | return $response->withRedirect('./'); | 35 | return $response->withRedirect('./'); |
36 | } | 36 | } |
37 | 37 | ||
38 | $currentUrl = parse_url($this->container->environment['HTTP_REFERER']); | 38 | $currentUrl = parse_url($referer); |
39 | parse_str($currentUrl['query'] ?? '', $params); | 39 | parse_str($currentUrl['query'] ?? '', $params); |
40 | 40 | ||
41 | if (null === $newTag) { | 41 | if (null === $newTag) { |
@@ -71,4 +71,50 @@ class TagController extends ShaarliController | |||
71 | 71 | ||
72 | return $response->withRedirect(($currentUrl['path'] ?? './') .'?'. http_build_query($params)); | 72 | return $response->withRedirect(($currentUrl['path'] ?? './') .'?'. http_build_query($params)); |
73 | } | 73 | } |
74 | |||
75 | /** | ||
76 | * Remove a tag from the current search through an HTTP redirection. | ||
77 | * | ||
78 | * @param array $args Should contain `tag` key as tag to remove from current search | ||
79 | */ | ||
80 | public function removeTag(Request $request, Response $response, array $args): Response | ||
81 | { | ||
82 | $referer = $this->container->environment['HTTP_REFERER'] ?? null; | ||
83 | |||
84 | // If the referrer is not provided, we can update the search, so we failback on the bookmark list | ||
85 | if (empty($referer)) { | ||
86 | return $response->withRedirect('./'); | ||
87 | } | ||
88 | |||
89 | $tagToRemove = $args['tag'] ?? null; | ||
90 | $currentUrl = parse_url($referer); | ||
91 | parse_str($currentUrl['query'] ?? '', $params); | ||
92 | |||
93 | if (null === $tagToRemove) { | ||
94 | return $response->withRedirect(($currentUrl['path'] ?? './') .'?'. http_build_query($params)); | ||
95 | } | ||
96 | |||
97 | // Prevent redirection loop | ||
98 | if (isset($params['removetag'])) { | ||
99 | unset($params['removetag']); | ||
100 | } | ||
101 | |||
102 | if (isset($params['searchtags'])) { | ||
103 | $tags = explode(' ', $params['searchtags']); | ||
104 | // Remove value from array $tags. | ||
105 | $tags = array_diff($tags, [$tagToRemove]); | ||
106 | $params['searchtags'] = implode(' ', $tags); | ||
107 | |||
108 | if (empty($params['searchtags'])) { | ||
109 | unset($params['searchtags']); | ||
110 | } | ||
111 | |||
112 | // We also remove page (keeping the same page has no sense, since the results are different) | ||
113 | unset($params['page']); | ||
114 | } | ||
115 | |||
116 | $queryParams = count($params) > 0 ? '?' . http_build_query($params) : ''; | ||
117 | |||
118 | return $response->withRedirect(($currentUrl['path'] ?? './') . $queryParams); | ||
119 | } | ||
74 | } | 120 | } |