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

This commit is contained in:
krasi georgiev 2016-11-02 16:21:09 +00:00
parent 8aa7c7c56d
commit 0a54c06712
6 changed files with 136 additions and 18 deletions

@ -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 = '<div class="uk-form-row">';
if(!empty($args['label'])) {
$html .= '<label for="'.$id.'" class="uk-form-label">'.$args['label'].'</label>';
}
$html .= '<div class="uk-form-controls">';
// without the hidden field it doesn't send any post value when the checkbox is not checked
$html .= "<input type='hidden' value='0' name='".$args['name']."'>";
$html .= '<input type="checkbox" id="'.$id.'" name="'.$args['name'].'" '.$class.' '.$placeholder.' value=1 '.($args['checked']?"checked":"").' />';
if(!empty($args['tip'])) {
$html .= '<p class="uk-form-help-block">'.$args['tip'].'</p>';
}
$html .= '</div>';
$html .= '</div>';
echo $html;
}
public static function formTextarea($args)
{

@ -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',

@ -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'];
}

@ -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()

@ -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)

@ -153,7 +153,7 @@ class Url
}
return 0;
}
public function setNotFound($error = true)
{
$this->notFound = $error;