Process tag cloud page through Slim controller
This commit is contained in:
parent
03340c18ea
commit
c266a89d0f
9 changed files with 107 additions and 49 deletions
|
@ -87,7 +87,7 @@ function endsWith($haystack, $needle, $case = true)
|
||||||
*
|
*
|
||||||
* @param mixed $input Data to escape: a single string or an array of strings.
|
* @param mixed $input Data to escape: a single string or an array of strings.
|
||||||
*
|
*
|
||||||
* @return string escaped.
|
* @return string|array escaped.
|
||||||
*/
|
*/
|
||||||
function escape($input)
|
function escape($input)
|
||||||
{
|
{
|
||||||
|
|
89
application/front/controllers/TagCloudController.php
Normal file
89
application/front/controllers/TagCloudController.php
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Shaarli\Front\Controller;
|
||||||
|
|
||||||
|
use Slim\Http\Request;
|
||||||
|
use Slim\Http\Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class TagCloud
|
||||||
|
*
|
||||||
|
* Slim controller used to render the tag cloud page.
|
||||||
|
*
|
||||||
|
* @package Front\Controller
|
||||||
|
*/
|
||||||
|
class TagCloudController extends ShaarliController
|
||||||
|
{
|
||||||
|
public function index(Request $request, Response $response): Response
|
||||||
|
{
|
||||||
|
if ($this->container->loginManager->isLoggedIn() === true) {
|
||||||
|
$visibility = $this->container->sessionManager->getSessionParameter('visibility');
|
||||||
|
}
|
||||||
|
|
||||||
|
$searchTags = $request->getQueryParam('searchtags');
|
||||||
|
$filteringTags = $searchTags !== null ? explode(' ', $searchTags) : [];
|
||||||
|
|
||||||
|
$tags = $this->container->bookmarkService->bookmarksCountPerTag($filteringTags, $visibility ?? null);
|
||||||
|
|
||||||
|
// We sort tags alphabetically, then choose a font size according to count.
|
||||||
|
// First, find max value.
|
||||||
|
$maxCount = 0;
|
||||||
|
foreach ($tags as $count) {
|
||||||
|
$maxCount = max($maxCount, $count);
|
||||||
|
}
|
||||||
|
|
||||||
|
alphabetical_sort($tags, false, true);
|
||||||
|
|
||||||
|
$logMaxCount = $maxCount > 1 ? log($maxCount, 30) : 1;
|
||||||
|
$tagList = [];
|
||||||
|
foreach ($tags as $key => $value) {
|
||||||
|
if (in_array($key, $filteringTags)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Tag font size scaling:
|
||||||
|
// default 15 and 30 logarithm bases affect scaling,
|
||||||
|
// 2.2 and 0.8 are arbitrary font sizes in em.
|
||||||
|
$size = log($value, 15) / $logMaxCount * 2.2 + 0.8;
|
||||||
|
$tagList[$key] = [
|
||||||
|
'count' => $value,
|
||||||
|
'size' => number_format($size, 2, '.', ''),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$searchTags = implode(' ', escape($filteringTags));
|
||||||
|
$data = [
|
||||||
|
'search_tags' => $searchTags,
|
||||||
|
'tags' => $tagList,
|
||||||
|
];
|
||||||
|
$data = $this->executeHooks($data);
|
||||||
|
foreach ($data as $key => $value) {
|
||||||
|
$this->assignView($key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
$searchTags = !empty($searchTags) ? $searchTags .' - ' : '';
|
||||||
|
$this->assignView(
|
||||||
|
'pagetitle',
|
||||||
|
$searchTags. t('Tag cloud') .' - '. $this->container->conf->get('general.title', 'Shaarli')
|
||||||
|
);
|
||||||
|
|
||||||
|
return $response->write($this->render('tag.cloud'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed[] $data Template data
|
||||||
|
*
|
||||||
|
* @return mixed[] Template data after active plugins render_picwall hook execution.
|
||||||
|
*/
|
||||||
|
protected function executeHooks(array $data): array
|
||||||
|
{
|
||||||
|
$this->container->pluginManager->executeHooks(
|
||||||
|
'render_tagcloud',
|
||||||
|
$data,
|
||||||
|
['loggedin' => $this->container->loginManager->isLoggedIn()]
|
||||||
|
);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
|
@ -202,4 +202,14 @@ public function getSession(): array
|
||||||
{
|
{
|
||||||
return $this->session;
|
return $this->session;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $default value which will be returned if the $key is undefined
|
||||||
|
*
|
||||||
|
* @return mixed Content stored in session
|
||||||
|
*/
|
||||||
|
public function getSessionParameter(string $key, $default = null)
|
||||||
|
{
|
||||||
|
return $this->session[$key] ?? $default;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ http://<replace_domain>/?do=import
|
||||||
http://<replace_domain>/login
|
http://<replace_domain>/login
|
||||||
http://<replace_domain>/picture-wall
|
http://<replace_domain>/picture-wall
|
||||||
http://<replace_domain>/?do=pluginadmin
|
http://<replace_domain>/?do=pluginadmin
|
||||||
http://<replace_domain>/?do=tagcloud
|
http://<replace_domain>/tag-cloud
|
||||||
http://<replace_domain>/?do=taglist
|
http://<replace_domain>/?do=taglist
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
45
index.php
45
index.php
|
@ -616,49 +616,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
|
||||||
|
|
||||||
// -------- Tag cloud
|
// -------- Tag cloud
|
||||||
if ($targetPage == Router::$PAGE_TAGCLOUD) {
|
if ($targetPage == Router::$PAGE_TAGCLOUD) {
|
||||||
$visibility = ! empty($_SESSION['visibility']) ? $_SESSION['visibility'] : '';
|
header('Location: ./tag-cloud');
|
||||||
$filteringTags = isset($_GET['searchtags']) ? explode(' ', $_GET['searchtags']) : [];
|
|
||||||
$tags = $bookmarkService->bookmarksCountPerTag($filteringTags, $visibility);
|
|
||||||
|
|
||||||
// We sort tags alphabetically, then choose a font size according to count.
|
|
||||||
// First, find max value.
|
|
||||||
$maxcount = 0;
|
|
||||||
foreach ($tags as $value) {
|
|
||||||
$maxcount = max($maxcount, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
alphabetical_sort($tags, false, true);
|
|
||||||
|
|
||||||
$logMaxCount = $maxcount > 1 ? log($maxcount, 30) : 1;
|
|
||||||
$tagList = array();
|
|
||||||
foreach ($tags as $key => $value) {
|
|
||||||
if (in_array($key, $filteringTags)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Tag font size scaling:
|
|
||||||
// default 15 and 30 logarithm bases affect scaling,
|
|
||||||
// 2.2 and 0.8 are arbitrary font sizes in em.
|
|
||||||
$size = log($value, 15) / $logMaxCount * 2.2 + 0.8;
|
|
||||||
$tagList[$key] = array(
|
|
||||||
'count' => $value,
|
|
||||||
'size' => number_format($size, 2, '.', ''),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$searchTags = implode(' ', escape($filteringTags));
|
|
||||||
$data = array(
|
|
||||||
'search_tags' => $searchTags,
|
|
||||||
'tags' => $tagList,
|
|
||||||
);
|
|
||||||
$pluginManager->executeHooks('render_tagcloud', $data, array('loggedin' => $loginManager->isLoggedIn()));
|
|
||||||
|
|
||||||
foreach ($data as $key => $value) {
|
|
||||||
$PAGE->assign($key, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
$searchTags = ! empty($searchTags) ? $searchTags .' - ' : '';
|
|
||||||
$PAGE->assign('pagetitle', $searchTags. t('Tag cloud') .' - '. $conf->get('general.title', 'Shaarli'));
|
|
||||||
$PAGE->renderPage('tag.cloud');
|
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1916,6 +1874,7 @@ function install($conf, $sessionManager, $loginManager)
|
||||||
$this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login');
|
$this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login');
|
||||||
$this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout');
|
$this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout');
|
||||||
$this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall');
|
$this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall');
|
||||||
|
$this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:index')->setName('tagcloud');
|
||||||
$this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag');
|
$this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag');
|
||||||
})->add('\Shaarli\Front\ShaarliMiddleware');
|
})->add('\Shaarli\Front\ShaarliMiddleware');
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
</li>
|
</li>
|
||||||
{/if}
|
{/if}
|
||||||
<li class="pure-menu-item" id="shaarli-menu-tags">
|
<li class="pure-menu-item" id="shaarli-menu-tags">
|
||||||
<a href="./?do=tagcloud" class="pure-menu-link">{'Tag cloud'|t}</a>
|
<a href="./tag-cloud" class="pure-menu-link">{'Tag cloud'|t}</a>
|
||||||
</li>
|
</li>
|
||||||
{if="$thumbnails_enabled"}
|
{if="$thumbnails_enabled"}
|
||||||
<li class="pure-menu-item" id="shaarli-menu-picwall">
|
<li class="pure-menu-item" id="shaarli-menu-picwall">
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<h2 class="window-title">{'Tag cloud'|t} - {$countTags} {'tags'|t}</h2>
|
<h2 class="window-title">{'Tag cloud'|t} - {$countTags} {'tags'|t}</h2>
|
||||||
{if="!empty($search_tags)"}
|
{if="!empty($search_tags)"}
|
||||||
<p class="center">
|
<p class="center">
|
||||||
<a href="?searchtags={$search_tags|urlencode}" class="pure-button pure-button-shaarli">
|
<a href="./?searchtags={$search_tags|urlencode}" class="pure-button pure-button-shaarli">
|
||||||
{'List all links with those tags'|t}
|
{'List all links with those tags'|t}
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="pure-g">
|
<div class="pure-g">
|
||||||
<div class="pure-u-1 pure-alert pure-alert-success tag-sort">
|
<div class="pure-u-1 pure-alert pure-alert-success tag-sort">
|
||||||
{'Sort by:'|t}
|
{'Sort by:'|t}
|
||||||
<a href="./?do=tagcloud">{'Cloud'|t}</a> ·
|
<a href="./tag-cloud">{'Cloud'|t}</a> ·
|
||||||
<a href="./?do=taglist&sort=usage">{'Most used'|t}</a> ·
|
<a href="./?do=taglist&sort=usage">{'Most used'|t}</a> ·
|
||||||
<a href="./?do=taglist&sort=alpha">{'Alphabetical'|t}</a>
|
<a href="./?do=taglist&sort=alpha">{'Alphabetical'|t}</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
{if="$showatom"}
|
{if="$showatom"}
|
||||||
<li><a href="{$feedurl}?do=atom{$searchcrits}" class="nomobile">ATOM Feed</a></li>
|
<li><a href="{$feedurl}?do=atom{$searchcrits}" class="nomobile">ATOM Feed</a></li>
|
||||||
{/if}
|
{/if}
|
||||||
<li><a href="./?do=tagcloud">Tag cloud</a></li>
|
<li><a href="./tag-cloud">Tag cloud</a></li>
|
||||||
<li><a href="./picture-wall{function="ltrim($searchcrits, '&')"}">Picture wall</a></li>
|
<li><a href="./picture-wall{function="ltrim($searchcrits, '&')"}">Picture wall</a></li>
|
||||||
<li><a href="./?do=daily">Daily</a></li>
|
<li><a href="./?do=daily">Daily</a></li>
|
||||||
{loop="$plugins_header.buttons_toolbar"}
|
{loop="$plugins_header.buttons_toolbar"}
|
||||||
|
|
Loading…
Reference in a new issue