From 03eb19ac60d54442332077fa35a9b0d4e33df365 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 10 May 2016 23:48:51 +0200 Subject: [PATCH 1/2] Extract PageBuilder class from index.php --- application/PageBuilder.php | 145 ++++++++++++++++++++++++++++++++++++ index.php | 125 +------------------------------ 2 files changed, 147 insertions(+), 123 deletions(-) create mode 100644 application/PageBuilder.php diff --git a/application/PageBuilder.php b/application/PageBuilder.php new file mode 100644 index 00000000..82580787 --- /dev/null +++ b/application/PageBuilder.php @@ -0,0 +1,145 @@ +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'); + } +} diff --git a/index.php b/index.php index 408aeae9..01c23195 100644 --- a/index.php +++ b/index.php @@ -162,6 +162,7 @@ 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). @@ -912,7 +791,7 @@ function renderPage() die($e->getMessage()); } - $PAGE = new pageBuilder; + $PAGE = new PageBuilder(); // Determine which page will be rendered. $query = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : ''; From 141a86c503af8e314381b3ee39ba4287fdfac63e Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 11 May 2016 00:05:22 +0200 Subject: [PATCH 2/2] Add private link counter --- application/LinkUtils.php | 16 ++++++++++++++++ index.php | 17 +++-------------- tests/LinkUtilsTest.php | 9 +++++++++ tpl/page.header.html | 3 ++- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/application/LinkUtils.php b/application/LinkUtils.php index 2df76ba8..da04ca97 100644 --- a/application/LinkUtils.php +++ b/application/LinkUtils.php @@ -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; +} diff --git a/index.php b/index.php index 01c23195..90fdac81 100644 --- a/index.php +++ b/index.php @@ -736,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, @@ -792,6 +791,8 @@ function renderPage() } $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'] : ''; @@ -855,7 +856,6 @@ function renderPage() } $data = array( - 'linkcount' => count($LINKSDB), 'linksToDisplay' => $linksToDisplay, ); $pluginManager->executeHooks('render_picwall', $data, array('loggedin' => isLoggedIn())); @@ -905,7 +905,6 @@ function renderPage() } $data = array( - 'linkcount' => count($LINKSDB), 'tags' => $tagList, ); $pluginManager->executeHooks('render_tagcloud', $data, array('loggedin' => isLoggedIn())); @@ -1099,7 +1098,6 @@ function renderPage() if ($targetPage == Router::$PAGE_TOOLS) { $data = array( - 'linkcount' => count($LINKSDB), 'pageabsaddr' => index_url($_SERVER), ); $pluginManager->executeHooks('render_tools', $data); @@ -1144,7 +1142,6 @@ function renderPage() } else // show the change password form. { - $PAGE->assign('linkcount',count($LINKSDB)); $PAGE->assign('token',getToken()); $PAGE->renderPage('changepassword'); exit; @@ -1192,7 +1189,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'] ); @@ -1208,7 +1204,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'); @@ -1257,7 +1252,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; } @@ -1383,7 +1377,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(), @@ -1451,7 +1444,6 @@ function renderPage() } $data = array( - 'linkcount' => count($LINKSDB), 'link' => $link, 'link_is_new' => $link_is_new, 'token' => getToken(), // XSRF protection. @@ -1473,7 +1465,6 @@ function renderPage() // Export links as a Netscape Bookmarks file if (empty($_GET['selection'])) { - $PAGE->assign('linkcount',count($LINKSDB)); $PAGE->renderPage('export'); exit; } @@ -1532,7 +1523,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'); @@ -1764,7 +1754,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, @@ -2039,7 +2028,7 @@ function install() $timezone_html = 'Timezone:'.$timezone_form.''; } - $PAGE = new pageBuilder; + $PAGE = new PageBuilder(); $PAGE->assign('timezone_html',$timezone_html); $PAGE->assign('timezone_js',$timezone_js); $PAGE->renderPage('install'); diff --git a/tests/LinkUtilsTest.php b/tests/LinkUtilsTest.php index 609a80cb..d1b022fd 100644 --- a/tests/LinkUtilsTest.php +++ b/tests/LinkUtilsTest.php @@ -84,4 +84,13 @@ public function testHtmlExtractNonExistentCharset() $html = 'stuff'; $this->assertFalse(html_extract_charset($html)); } + + /** + * Test count_private. + */ + public function testCountPrivateLinks() + { + $refDB = new ReferenceLinkDB(); + $this->assertEquals($refDB->countPrivateLinks(), count_private($refDB->getLinks())); + } } diff --git a/tpl/page.header.html b/tpl/page.header.html index 52429f23..3a09ecd9 100644 --- a/tpl/page.header.html +++ b/tpl/page.header.html @@ -2,7 +2,8 @@
- {if="!empty($linkcount)"}{$linkcount} links{/if} + {if="!empty($linkcount)"}{$linkcount} links{/if}
+ {if="!empty($privateLinkcount)"}{$privateLinkcount} private links{/if}