From 0a54c067124e2378fa59d9932f1bbd968491c1f4 Mon Sep 17 00:00:00 2001 From: krasi georgiev Date: Wed, 2 Nov 2016 16:21:09 +0000 Subject: [PATCH] add a global option to mix posts with identical tags - usefull when used with the api to get diverse posts: TODO - add transaltion for the global advanced settings --- bl-kernel/admin/themes/default/init.php | 26 +++++++++ bl-kernel/admin/views/settings-advanced.php | 7 +++ bl-kernel/dbposts.class.php | 65 +++++++++++++++++++-- bl-kernel/dbsite.class.php | 17 ++++-- bl-kernel/functions.php | 37 +++++++++--- bl-kernel/url.class.php | 2 +- 6 files changed, 136 insertions(+), 18 deletions(-) diff --git a/bl-kernel/admin/themes/default/init.php b/bl-kernel/admin/themes/default/init.php index cdf84184..e3aa4d17 100644 --- a/bl-kernel/admin/themes/default/init.php +++ b/bl-kernel/admin/themes/default/init.php @@ -102,6 +102,32 @@ class HTML { $args['type'] = 'password'; self::formInputText($args); } + public static function formCheckbox($args) + { + $id = 'js'.$args['name']; + $class = empty($args['class']) ? '' : 'class="'.$args['class'].'"'; + $placeholder = empty($args['placeholder']) ? '' : 'placeholder="'.$args['placeholder'].'"'; + + $html = '
'; + + if(!empty($args['label'])) { + $html .= ''; + } + + $html .= '
'; + // without the hidden field it doesn't send any post value when the checkbox is not checked + $html .= ""; + $html .= ''; + + if(!empty($args['tip'])) { + $html .= '

'.$args['tip'].'

'; + } + + $html .= '
'; + $html .= '
'; + + echo $html; + } public static function formTextarea($args) { diff --git a/bl-kernel/admin/views/settings-advanced.php b/bl-kernel/admin/views/settings-advanced.php index 9c12461c..a3dc6b4e 100644 --- a/bl-kernel/admin/views/settings-advanced.php +++ b/bl-kernel/admin/views/settings-advanced.php @@ -19,6 +19,13 @@ HTML::formOpen(array('class'=>'uk-form-horizontal')); 'class'=>'uk-width-1-3 uk-form-medium', 'tip'=>$L->g('number-of-posts-to-show-per-page') )); + + HTML::formCheckbox(array( + 'name'=>'shuffleIdeticalTags', + 'label'=>$L->g('Shufle posts with identical tags'), + 'checked'=>$Site->shuffleIdeticalTags(), + 'class'=>'uk-width-1-3 uk-form-medium', + )); HTML::formSelect(array( 'name'=>'homepage', diff --git a/bl-kernel/dbposts.class.php b/bl-kernel/dbposts.class.php index 4306d481..02298fbf 100644 --- a/bl-kernel/dbposts.class.php +++ b/bl-kernel/dbposts.class.php @@ -19,7 +19,7 @@ class dbPosts extends dbJSON function __construct() { parent::__construct(PATH_DATABASES.'posts.php'); - } + } // Return the amount of posts // $total = TRUE, returns the total of posts @@ -103,9 +103,10 @@ class dbPosts extends dbJSON public function add($args) { + global $Site; $dataForDb = array(); // This data will be saved in the database $dataForFile = array(); // This data will be saved in the file - + // Current date, format of DB_DATE_FORMAT $currentDate = Date::current(DB_DATE_FORMAT); @@ -189,6 +190,10 @@ class dbPosts extends dbJSON // Sort posts before save $this->sortByDate(); + + if($Site->shuffleIdeticalTags()){ + $this->mixTags(); + } if( $this->save() === false ) { @@ -398,11 +403,63 @@ class dbPosts extends dbJSON else { uasort($this->db, array($this, 'sortLowToHigh')); } - + return true; } + + // Mix the posts so that neighbour posts have different Tags - + // helpfull if you want to show diverse content. Case studies for example + public function mixTags() + { + $previousValue = null; + $finalArray=array(); + $buffeArray=array(); - private function sortLowToHigh($a, $b) { + // Get array keys + $arrayKeys = array_keys($this->db); + // Fetch last array key + $lastArrayKey = array_pop($arrayKeys); + + foreach($this->db as $key=>$row){ + foreach($buffeArray as $bufferKey=>$bufferRow){ + // Get buffer array keys + $finalArrayKeys = array_keys($finalArray); + // Fetch last array key + $finalArraylastArrayKey = array_pop($finalArrayKeys); + + if($bufferRow['tags']!=$finalArray[$finalArraylastArrayKey]['tags']){ + $finalArray[$bufferKey]=$bufferRow; + unset($buffeArray[$bufferKey]); + } + } + + $finalArrayKeys = array_keys($finalArray); + // Fetch last array key + $finalArraylastArrayKey = array_pop($finalArrayKeys); + + if(empty($finalArray)){ + $finalArray[$key]=$row; + } + elseif($row['tags']==$finalArray[$finalArraylastArrayKey]['tags']){ + $buffeArray[$key]=$row; + } + else{ + $finalArray[$key]=$row; + } + + //reached the end so no other choice but to add the remaining buffer + if($key == $lastArrayKey) { + $finalArray=array_merge($finalArray,$buffeArray); + } + + $previousValue = $row; + } + + $this->db=$finalArray; + return true; + } + + private function sortLowToHigh($a, $b) { return $a['date']>$b['date']; } diff --git a/bl-kernel/dbsite.class.php b/bl-kernel/dbsite.class.php index 26138464..a5932c19 100644 --- a/bl-kernel/dbsite.class.php +++ b/bl-kernel/dbsite.class.php @@ -8,6 +8,7 @@ class dbSite extends dbJSON 'description'=> array('inFile'=>false, 'value'=>''), 'footer'=> array('inFile'=>false, 'value'=>'I wanna be a pirate!'), 'postsperpage'=> array('inFile'=>false, 'value'=>''), + 'shuffleIdeticalTags'=> array('inFile'=>false, 'value'=>''), 'language'=> array('inFile'=>false, 'value'=>'en'), 'locale'=> array('inFile'=>false, 'value'=>'en_US'), 'timezone'=> array('inFile'=>false, 'value'=>'America/Argentina/Buenos_Aires'), @@ -51,13 +52,13 @@ class dbSite extends dbJSON { foreach($args as $field=>$value) { - if( isset($this->dbFields[$field]) ) + if( isset($this->dbFields[$field]) ) { $this->db[$field] = Sanitize::html($value); - } - } - - if( $this->save() === false ) { + } + } + + if( $this->save() === false ) { Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to save the database file.'); return false; } @@ -238,6 +239,12 @@ class dbSite extends dbJSON { return $this->getField('postsperpage'); } + + // Returns if tags mix is enabled. + public function shuffleIdeticalTags() + { + return $this->getField('shuffleIdeticalTags'); + } // Returns the current language. public function language() diff --git a/bl-kernel/functions.php b/bl-kernel/functions.php index f8e486a1..564ed678 100644 --- a/bl-kernel/functions.php +++ b/bl-kernel/functions.php @@ -27,16 +27,16 @@ function buildPost($key) global $Parsedown; global $Site; - // Post object, content from FILE. + // Post object, content from FILE. $Post = new Post($key); - if( !$Post->isValid() ) { + if( !$Post->isValid() ) { Log::set(__METHOD__.LOG_SEP.'Error occurred when trying build the post from file with key: '.$key); return false; } // Post database, content from DATABASE JSON. $db = $dbPosts->getPostDB($key); - if( !$db ) { + if( !$db ) { Log::set(__METHOD__.LOG_SEP.'Error occurred when trying build the post from database with key: '.$key); return false; } @@ -45,8 +45,8 @@ function buildPost($key) foreach($db as $field=>$value) { $Post->setField($field, $value); } - - // Content in raw format + + // Content in raw format $contentRaw = $Post->content(); $Post->setField('contentRaw', $contentRaw, true); @@ -72,7 +72,7 @@ function buildPost($key) $username = $Post->username(); $Post->setField('user', $dbUsers->getUser($username)); - return $Post; + return $Post; } function buildPostsForPage($pageNumber=0, $amount=POSTS_PER_PAGE_ADMIN, $removeUnpublished=true, $tagKey=false) @@ -105,8 +105,29 @@ function buildPostsForPage($pageNumber=0, $amount=POSTS_PER_PAGE_ADMIN, $removeU array_push($posts, $Post); } } + return $posts; +} - return $posts; +function buildTagPosts($tag,$amount=3, $pageNumber=0){ + global $dbTags; + $posts=array(); + $tag=str_replace(" ", "-",$tag); + + $keys= $dbTags->getList($pageNumber, $amount, $tag); + foreach($keys as $key=>$value) { + $Post = buildPost($key); + + if($Post==false){ + break; + } + $posts['itms'][$key]=$Post->vars; + $posts['itms'][$key]['permalink']=$Post->permalink(); + } + + $posts['count']=$dbTags->countPostsByTag($tag); + $posts['page']=$pageNumber; + + return $posts; } // PAGE FUNCTIONS @@ -193,7 +214,7 @@ function buildAllPages() // Remove the error page unset($list['error']); - // Sorte pages + // Sort pages uasort($list, 'sortPages'); foreach($list as $key=>$db) diff --git a/bl-kernel/url.class.php b/bl-kernel/url.class.php index 56525fe4..4ac3af4f 100644 --- a/bl-kernel/url.class.php +++ b/bl-kernel/url.class.php @@ -153,7 +153,7 @@ class Url } return 0; } - + public function setNotFound($error = true) { $this->notFound = $error;