Merge pull request #560 from ArthurHoaro/nb-private-shaare

Private links counter in the header
This commit is contained in:
Arthur 2016-05-14 11:11:11 +02:00
commit 3fdcc7bd47
5 changed files with 177 additions and 138 deletions

View File

@ -77,3 +77,19 @@ function html_extract_charset($html)
return false;
}
/**
* Count private links in given linklist.
*
* @param array $links Linklist.
*
* @return int Number of private links.
*/
function count_private($links)
{
$cpt = 0;
foreach ($links as $link) {
$cpt = $link['private'] == true ? $cpt + 1 : $cpt;
}
return $cpt;
}

145
application/PageBuilder.php Normal file
View File

@ -0,0 +1,145 @@
<?php
/**
* This class is in charge of building the final page.
* (This is basically a wrapper around RainTPL which pre-fills some fields.)
* $p = new PageBuilder();
* $p->assign('myfield','myvalue');
* $p->renderPage('mytemplate');
*/
class PageBuilder
{
/**
* @var RainTPL RainTPL instance.
*/
private $tpl;
/**
* PageBuilder constructor.
* $tpl is initialized at false for lazy loading.
*/
function __construct()
{
$this->tpl = false;
}
/**
* Initialize all default tpl tags.
*/
private function initialize()
{
$this->tpl = new RainTPL();
try {
$version = ApplicationUtils::checkUpdate(
shaarli_version,
$GLOBALS['config']['UPDATECHECK_FILENAME'],
$GLOBALS['config']['UPDATECHECK_INTERVAL'],
$GLOBALS['config']['ENABLE_UPDATECHECK'],
isLoggedIn(),
$GLOBALS['config']['UPDATECHECK_BRANCH']
);
$this->tpl->assign('newVersion', escape($version));
$this->tpl->assign('versionError', '');
} catch (Exception $exc) {
logm($GLOBALS['config']['LOG_FILE'], $_SERVER['REMOTE_ADDR'], $exc->getMessage());
$this->tpl->assign('newVersion', '');
$this->tpl->assign('versionError', escape($exc->getMessage()));
}
$this->tpl->assign('feedurl', escape(index_url($_SERVER)));
$searchcrits = ''; // Search criteria
if (!empty($_GET['searchtags'])) {
$searchcrits .= '&searchtags=' . urlencode($_GET['searchtags']);
}
if (!empty($_GET['searchterm'])) {
$searchcrits .= '&searchterm=' . urlencode($_GET['searchterm']);
}
$this->tpl->assign('searchcrits', $searchcrits);
$this->tpl->assign('source', index_url($_SERVER));
$this->tpl->assign('version', shaarli_version);
$this->tpl->assign('scripturl', index_url($_SERVER));
$this->tpl->assign('pagetitle', 'Shaarli');
$this->tpl->assign('privateonly', !empty($_SESSION['privateonly'])); // Show only private links?
if (!empty($GLOBALS['title'])) {
$this->tpl->assign('pagetitle', $GLOBALS['title']);
}
if (!empty($GLOBALS['titleLink'])) {
$this->tpl->assign('titleLink', $GLOBALS['titleLink']);
}
if (!empty($GLOBALS['pagetitle'])) {
$this->tpl->assign('pagetitle', $GLOBALS['pagetitle']);
}
$this->tpl->assign('shaarlititle', empty($GLOBALS['title']) ? 'Shaarli': $GLOBALS['title']);
if (!empty($GLOBALS['plugin_errors'])) {
$this->tpl->assign('plugin_errors', $GLOBALS['plugin_errors']);
}
}
/**
* The following assign() method is basically the same as RainTPL (except lazy loading)
*
* @param string $placeholder Template placeholder.
* @param mixed $value Value to assign.
*/
public function assign($placeholder, $value)
{
// Lazy initialization
if ($this->tpl === false) {
$this->initialize();
}
$this->tpl->assign($placeholder, $value);
}
/**
* Assign an array of data to the template builder.
*
* @param array $data Data to assign.
*
* @return false if invalid data.
*/
public function assignAll($data)
{
// Lazy initialization
if ($this->tpl === false) {
$this->initialize();
}
if (empty($data) || !is_array($data)){
return false;
}
foreach ($data as $key => $value) {
$this->assign($key, $value);
}
}
/**
* Render a specific page (using a template file).
* e.g. $pb->renderPage('picwall');
*
* @param string $page Template filename (without extension).
*/
public function renderPage($page)
{
// Lazy initialization
if ($this->tpl===false) {
$this->initialize();
}
$this->tpl->draw($page);
}
/**
* Render a 404 page (uses the template : tpl/404.tpl)
* usage : $PAGE->render404('The link was deleted')
*
* @param string $message A messate to display what is not found
*/
public function render404($message = 'The page you are trying to reach does not exist or has been deleted.')
{
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
$this->tpl->assign('error_message', $message);
$this->renderPage('404');
}
}

142
index.php
View File

@ -162,6 +162,7 @@ require_once 'application/LinkDB.php';
require_once 'application/LinkFilter.php';
require_once 'application/LinkUtils.php';
require_once 'application/NetscapeBookmarkUtils.php';
require_once 'application/PageBuilder.php';
require_once 'application/TimeZone.php';
require_once 'application/Url.php';
require_once 'application/Utils.php';
@ -562,128 +563,6 @@ function tokenOk($token)
return false; // Wrong token, or already used.
}
// ------------------------------------------------------------------------------------------
/* This class is in charge of building the final page.
(This is basically a wrapper around RainTPL which pre-fills some fields.)
p = new pageBuilder;
p.assign('myfield','myvalue');
p.renderPage('mytemplate');
*/
class pageBuilder
{
private $tpl; // RainTPL template
function __construct()
{
$this->tpl = false;
}
/**
* Initialize all default tpl tags.
*/
private function initialize()
{
$this->tpl = new RainTPL;
try {
$version = ApplicationUtils::checkUpdate(
shaarli_version,
$GLOBALS['config']['UPDATECHECK_FILENAME'],
$GLOBALS['config']['UPDATECHECK_INTERVAL'],
$GLOBALS['config']['ENABLE_UPDATECHECK'],
isLoggedIn(),
$GLOBALS['config']['UPDATECHECK_BRANCH']
);
$this->tpl->assign('newVersion', escape($version));
$this->tpl->assign('versionError', '');
} catch (Exception $exc) {
logm($GLOBALS['config']['LOG_FILE'], $_SERVER['REMOTE_ADDR'], $exc->getMessage());
$this->tpl->assign('newVersion', '');
$this->tpl->assign('versionError', escape($exc->getMessage()));
}
$this->tpl->assign('feedurl', escape(index_url($_SERVER)));
$searchcrits = ''; // Search criteria
if (!empty($_GET['searchtags'])) {
$searchcrits .= '&searchtags=' . urlencode($_GET['searchtags']);
}
if (!empty($_GET['searchterm'])) {
$searchcrits .= '&searchterm=' . urlencode($_GET['searchterm']);
}
$this->tpl->assign('searchcrits', $searchcrits);
$this->tpl->assign('source', index_url($_SERVER));
$this->tpl->assign('version', shaarli_version);
$this->tpl->assign('scripturl', index_url($_SERVER));
$this->tpl->assign('pagetitle', 'Shaarli');
$this->tpl->assign('privateonly', !empty($_SESSION['privateonly'])); // Show only private links?
if (!empty($GLOBALS['title'])) {
$this->tpl->assign('pagetitle', $GLOBALS['title']);
}
if (!empty($GLOBALS['titleLink'])) {
$this->tpl->assign('titleLink', $GLOBALS['titleLink']);
}
if (!empty($GLOBALS['pagetitle'])) {
$this->tpl->assign('pagetitle', $GLOBALS['pagetitle']);
}
$this->tpl->assign('shaarlititle', empty($GLOBALS['title']) ? 'Shaarli': $GLOBALS['title']);
if (!empty($GLOBALS['plugin_errors'])) {
$this->tpl->assign('plugin_errors', $GLOBALS['plugin_errors']);
}
}
// The following assign() method is basically the same as RainTPL (except that it's lazy)
public function assign($what,$where)
{
if ($this->tpl===false) $this->initialize(); // Lazy initialization
$this->tpl->assign($what,$where);
}
/**
* Assign an array of data to the template builder.
*
* @param array $data Data to assign.
*
* @return false if invalid data.
*/
public function assignAll($data)
{
// Lazy initialization
if ($this->tpl === false) {
$this->initialize();
}
if (empty($data) || !is_array($data)){
return false;
}
foreach ($data as $key => $value) {
$this->assign($key, $value);
}
}
// Render a specific page (using a template).
// e.g. pb.renderPage('picwall')
public function renderPage($page)
{
if ($this->tpl===false) $this->initialize(); // Lazy initialization
$this->tpl->draw($page);
}
/**
* Render a 404 page (uses the template : tpl/404.tpl)
*
* usage : $PAGE->render404('The link was deleted')
* @param string $message A messate to display what is not found
*/
public function render404($message='The page you are trying to reach does not exist or has been deleted.') {
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
$this->tpl->assign('error_message', $message);
$this->renderPage('404');
}
}
// ------------------------------------------------------------------------------------------
// Daily RSS feed: 1 RSS entry per day giving all the links on that day.
// Gives the last 7 days (which have links).
@ -857,7 +736,6 @@ function showDaily($pageBuilder, $LINKSDB)
$dayDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $day.'_000000');
$data = array(
'linksToDisplay' => $linksToDisplay,
'linkcount' => count($LINKSDB),
'cols' => $columns,
'day' => $dayDate->getTimestamp(),
'previousday' => $previousday,
@ -912,7 +790,9 @@ function renderPage()
die($e->getMessage());
}
$PAGE = new pageBuilder;
$PAGE = new PageBuilder();
$PAGE->assign('linkcount', count($LINKSDB));
$PAGE->assign('privateLinkcount', count_private($LINKSDB));
// Determine which page will be rendered.
$query = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : '';
@ -979,7 +859,6 @@ function renderPage()
}
$data = array(
'linkcount' => count($LINKSDB),
'linksToDisplay' => $linksToDisplay,
);
$pluginManager->executeHooks('render_picwall', $data, array('loggedin' => isLoggedIn()));
@ -1029,7 +908,6 @@ function renderPage()
}
$data = array(
'linkcount' => count($LINKSDB),
'tags' => $tagList,
);
$pluginManager->executeHooks('render_tagcloud', $data, array('loggedin' => isLoggedIn()));
@ -1217,7 +1095,6 @@ function renderPage()
if ($targetPage == Router::$PAGE_TOOLS)
{
$data = array(
'linkcount' => count($LINKSDB),
'pageabsaddr' => index_url($_SERVER),
);
$pluginManager->executeHooks('render_tools', $data);
@ -1262,7 +1139,6 @@ function renderPage()
}
else // show the change password form.
{
$PAGE->assign('linkcount',count($LINKSDB));
$PAGE->assign('token',getToken());
$PAGE->renderPage('changepassword');
exit;
@ -1310,7 +1186,6 @@ function renderPage()
}
else // Show the configuration form.
{
$PAGE->assign('linkcount',count($LINKSDB));
$PAGE->assign('token',getToken());
$PAGE->assign('title', empty($GLOBALS['title']) ? '' : $GLOBALS['title'] );
$PAGE->assign('redirector', empty($GLOBALS['redirector']) ? '' : $GLOBALS['redirector'] );
@ -1326,7 +1201,6 @@ function renderPage()
if ($targetPage == Router::$PAGE_CHANGETAG)
{
if (empty($_POST['fromtag']) || (empty($_POST['totag']) && isset($_POST['renametag']))) {
$PAGE->assign('linkcount', count($LINKSDB));
$PAGE->assign('token', getToken());
$PAGE->assign('tags', $LINKSDB->allTags());
$PAGE->renderPage('changetag');
@ -1375,7 +1249,6 @@ function renderPage()
// -------- User wants to add a link without using the bookmarklet: Show form.
if ($targetPage == Router::$PAGE_ADDLINK)
{
$PAGE->assign('linkcount',count($LINKSDB));
$PAGE->renderPage('addlink');
exit;
}
@ -1501,7 +1374,6 @@ function renderPage()
$link = $LINKSDB[$_GET['edit_link']]; // Read database
if (!$link) { header('Location: ?'); exit; } // Link not found in database.
$data = array(
'linkcount' => count($LINKSDB),
'link' => $link,
'link_is_new' => false,
'token' => getToken(),
@ -1569,7 +1441,6 @@ function renderPage()
}
$data = array(
'linkcount' => count($LINKSDB),
'link' => $link,
'link_is_new' => $link_is_new,
'token' => getToken(), // XSRF protection.
@ -1591,7 +1462,6 @@ function renderPage()
// Export links as a Netscape Bookmarks file
if (empty($_GET['selection'])) {
$PAGE->assign('linkcount',count($LINKSDB));
$PAGE->renderPage('export');
exit;
}
@ -1650,7 +1520,6 @@ function renderPage()
// -------- Show upload/import dialog:
if ($targetPage == Router::$PAGE_IMPORT)
{
$PAGE->assign('linkcount',count($LINKSDB));
$PAGE->assign('token',getToken());
$PAGE->assign('maxfilesize',getMaxFileSize());
$PAGE->renderPage('import');
@ -1882,7 +1751,6 @@ function buildLinkList($PAGE,$LINKSDB)
// Fill all template fields.
$data = array(
'linkcount' => count($LINKSDB),
'previous_page_url' => $previous_page_url,
'next_page_url' => $next_page_url,
'page_current' => $page,
@ -2157,7 +2025,7 @@ function install()
$timezone_html = '<tr><td><b>Timezone:</b></td><td>'.$timezone_form.'</td></tr>';
}
$PAGE = new pageBuilder;
$PAGE = new PageBuilder();
$PAGE->assign('timezone_html',$timezone_html);
$PAGE->assign('timezone_js',$timezone_js);
$PAGE->renderPage('install');

View File

@ -84,4 +84,13 @@ class LinkUtilsTest extends PHPUnit_Framework_TestCase
$html = '<html><meta>stuff</meta><meta charset=""/></html>';
$this->assertFalse(html_extract_charset($html));
}
/**
* Test count_private.
*/
public function testCountPrivateLinks()
{
$refDB = new ReferenceLinkDB();
$this->assertEquals($refDB->countPrivateLinks(), count_private($refDB->getLinks()));
}
}

View File

@ -2,7 +2,8 @@
<div id="logo" title="Share your links !" onclick="document.location='?';"></div>
<div id="linkcount" class="nomobile">
{if="!empty($linkcount)"}{$linkcount} links{/if}
{if="!empty($linkcount)"}{$linkcount} links{/if}<br>
{if="!empty($privateLinkcount)"}{$privateLinkcount} private links{/if}
</div>
<div id="menu">