Categories implementation
This commit is contained in:
parent
1138633e1f
commit
96d3efaa65
|
@ -15,21 +15,24 @@ function addPost($args)
|
||||||
// Add the page, if the $key is FALSE the creation of the post failure.
|
// Add the page, if the $key is FALSE the creation of the post failure.
|
||||||
$key = $dbPosts->add($args);
|
$key = $dbPosts->add($args);
|
||||||
|
|
||||||
if($key)
|
if($key) {
|
||||||
{
|
|
||||||
// Reindex tags, this function is in 70.posts.php
|
// Reindex tags, this function is in 70.posts.php
|
||||||
reIndexTagsPosts();
|
reIndexTagsPosts();
|
||||||
|
|
||||||
// Call the plugins after post created.
|
// Re index categories
|
||||||
|
reIndexCategoriesPosts();
|
||||||
|
|
||||||
|
// Call the plugins after post creation
|
||||||
Theme::plugins('afterPostCreate');
|
Theme::plugins('afterPostCreate');
|
||||||
|
|
||||||
// Alert for the user
|
// Alert for the user
|
||||||
Alert::set($Language->g('Post added successfully'));
|
Alert::set($Language->g('Post added successfully'));
|
||||||
Redirect::page('admin', 'manage-posts');
|
Redirect::page('admin', 'manage-posts');
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to create the post.');
|
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to create the post.');
|
||||||
|
Log::set(__METHOD__.LOG_SEP.'Cleaning database...');
|
||||||
|
$dbPosts->delete($key);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -51,6 +51,16 @@ echo '<div class="bl-publish-sidebar uk-width-2-10">';
|
||||||
echo '<li><h2 class="sidebar-button" data-view="sidebar-general-view"><i class="uk-icon-angle-down"></i> '.$L->g('General').'</h2></li>';
|
echo '<li><h2 class="sidebar-button" data-view="sidebar-general-view"><i class="uk-icon-angle-down"></i> '.$L->g('General').'</h2></li>';
|
||||||
echo '<li id="sidebar-general-view" class="sidebar-view">';
|
echo '<li id="sidebar-general-view" class="sidebar-view">';
|
||||||
|
|
||||||
|
// Category
|
||||||
|
HTML::formSelect(array(
|
||||||
|
'name'=>'category',
|
||||||
|
'label'=>$L->g('Category'),
|
||||||
|
'class'=>'uk-width-1-1 uk-form-medium',
|
||||||
|
'options'=>$dbCategories->getAll(),
|
||||||
|
'selected'=>'',
|
||||||
|
'tip'=>''
|
||||||
|
));
|
||||||
|
|
||||||
// Description input
|
// Description input
|
||||||
HTML::formTextarea(array(
|
HTML::formTextarea(array(
|
||||||
'name'=>'description',
|
'name'=>'description',
|
||||||
|
|
|
@ -144,6 +144,7 @@ include(PATH_KERNEL.'dbusers.class.php');
|
||||||
include(PATH_KERNEL.'dbtags.class.php');
|
include(PATH_KERNEL.'dbtags.class.php');
|
||||||
include(PATH_KERNEL.'dblanguage.class.php');
|
include(PATH_KERNEL.'dblanguage.class.php');
|
||||||
include(PATH_KERNEL.'dbsite.class.php');
|
include(PATH_KERNEL.'dbsite.class.php');
|
||||||
|
include(PATH_KERNEL.'dbcategories.class.php');
|
||||||
include(PATH_KERNEL.'post.class.php');
|
include(PATH_KERNEL.'post.class.php');
|
||||||
include(PATH_KERNEL.'page.class.php');
|
include(PATH_KERNEL.'page.class.php');
|
||||||
include(PATH_KERNEL.'user.class.php');
|
include(PATH_KERNEL.'user.class.php');
|
||||||
|
@ -183,6 +184,7 @@ $dbPosts = new dbPosts();
|
||||||
$dbPages = new dbPages();
|
$dbPages = new dbPages();
|
||||||
$dbUsers = new dbUsers();
|
$dbUsers = new dbUsers();
|
||||||
$dbTags = new dbTags();
|
$dbTags = new dbTags();
|
||||||
|
$dbCategories = new dbCategories();
|
||||||
$Site = new dbSite();
|
$Site = new dbSite();
|
||||||
$Url = new Url();
|
$Url = new Url();
|
||||||
$Parsedown = new ParsedownExtra();
|
$Parsedown = new ParsedownExtra();
|
||||||
|
|
|
@ -5,25 +5,15 @@ Database structure
|
||||||
- To re index the list of posts and pages need to be sorted
|
- To re index the list of posts and pages need to be sorted
|
||||||
|
|
||||||
{
|
{
|
||||||
"postsIndex": {
|
|
||||||
"videos": {
|
"videos": {
|
||||||
"name": "Videos",
|
"name": "Videos",
|
||||||
"list": [ "first-post", "second-post" ]
|
"posts": [ "first-post", "second-post" ],
|
||||||
|
"pages": [ "my-page", "second-page" ]
|
||||||
},
|
},
|
||||||
"pets": {
|
"pets": {
|
||||||
"name": "Pets",
|
"name": "Pets",
|
||||||
"list": [ "second-post", "another-post" ]
|
"posts": [ "second-post", "bull-terrier" ],
|
||||||
}
|
"pages": [ ]
|
||||||
},
|
|
||||||
"pagesIndex": {
|
|
||||||
"videos": {
|
|
||||||
"name": "Videos",
|
|
||||||
"list": [ "first-post", "second-post" ]
|
|
||||||
},
|
|
||||||
"music": {
|
|
||||||
"name": "Music",
|
|
||||||
"list": [ "second-post", "another-post" ]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,25 +21,22 @@ Database structure
|
||||||
|
|
||||||
class dbCategories extends dbJSON
|
class dbCategories extends dbJSON
|
||||||
{
|
{
|
||||||
public $dbFields = array(
|
public $dbFields = array();
|
||||||
'postsIndex'=>array('inFile'=>false, 'value'=>array()),
|
|
||||||
'pagesIndex'=>array('inFile'=>false, 'value'=>array())
|
|
||||||
);
|
|
||||||
|
|
||||||
function __construct()
|
function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct(PATH_DATABASES.'categories.php');
|
parent::__construct(PATH_DATABASES.'categories.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getByCategory($type='postsIndex', $categorySlug, $amountPerPage, $pageNumber)
|
private function getByCategory($type='posts', $categoryKey, $amountPerPage, $pageNumber)
|
||||||
{
|
{
|
||||||
// Check if the category exists
|
// Check if the category exists
|
||||||
if( !isset($this->db[$type][$categorySlug]) ) {
|
if( !isset($this->db[$categoryKey]) ) {
|
||||||
Log::set(__METHOD__.LOG_SEP.'Error getting '.$type.' by the category: '.$categorySlug);
|
Log::set(__METHOD__.LOG_SEP.'Error getting '.$type.' by the category: '.$categoryKey);
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
$list = $this->db[$type][$categorySlug]['list'];
|
$list = $this->db[$categoryKey][$type];
|
||||||
|
|
||||||
$init = (int) $amountPerPage * $pageNumber;
|
$init = (int) $amountPerPage * $pageNumber;
|
||||||
$end = (int) min( ($init + $amountPerPage - 1), count($list) - 1 );
|
$end = (int) min( ($init + $amountPerPage - 1), count($list) - 1 );
|
||||||
|
@ -64,60 +51,63 @@ class dbCategories extends dbJSON
|
||||||
return array_slice($tmp, $init, $amountPerPage, true);
|
return array_slice($tmp, $init, $amountPerPage, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPagesByCategory($categorySlug, $amountPerPage, $pageNumber)
|
public function getPagesByCategory($categoryKey, $amountPerPage, $pageNumber)
|
||||||
{
|
{
|
||||||
return $this->getByCategory('pagesIndex', $categorySlug, $amountPerPage, $pageNumber);
|
return $this->getByCategory('pages', $categoryKey, $amountPerPage, $pageNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPostsByCategory($categorySlug, $amountPerPage, $pageNumber)
|
public function getPostsByCategory($categoryKey, $amountPerPage, $pageNumber)
|
||||||
{
|
{
|
||||||
return $this->getByCategory('postsIndex', $categorySlug, $amountPerPage, $pageNumber);
|
return $this->getByCategory('posts', $categoryKey, $amountPerPage, $pageNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function countByCategory($type='postsIndex', $categorySlug)
|
private function countByCategory($type='posts', $categoryKey)
|
||||||
{
|
{
|
||||||
if( isset($this->db[$type][$categorySlug]) ) {
|
if( isset($this->db[$categoryKey][$type]) ) {
|
||||||
return count($this->db[$type][$categorySlug]['list']);
|
return count($this->db[$categoryKey][$type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function countPostsByCategory($categorySlug)
|
public function countPostsByCategory($categoryKey)
|
||||||
{
|
{
|
||||||
return $this->countByCategory('postsIndex', $categorySlug);
|
return $this->countByCategory('posts', $categoryKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function countPagesByCategory($categorySlug)
|
public function countPagesByCategory($categoryKey)
|
||||||
{
|
{
|
||||||
return $this->countByCategory('pagesIndex', $categorySlug);
|
return $this->countByCategory('pages', $categoryKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Regenerate the posts index for each tag.
|
public function getAll()
|
||||||
|
{
|
||||||
|
$tmp = array();
|
||||||
|
foreach($this->db as $key=>$data) {
|
||||||
|
$tmp[$key] = $data['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort low to high, by value.
|
||||||
|
natcasesort($tmp);
|
||||||
|
|
||||||
|
return $tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-generate posts index
|
||||||
// (array) $db, the $db must be sorted by date and the posts published only.
|
// (array) $db, the $db must be sorted by date and the posts published only.
|
||||||
public function reindexPosts($db)
|
public function reIndexPosts($db)
|
||||||
{
|
{
|
||||||
$tagsIndex = array();
|
$index = array();
|
||||||
|
|
||||||
// Foreach post
|
// Foreach post in the database
|
||||||
foreach($db as $postKey=>$values)
|
foreach($db as $postKey=>$postData) {
|
||||||
{
|
if(!empty($postData['category'])) {
|
||||||
$tags = $values['tags'];
|
$categoryKey = $postData['category'];
|
||||||
|
array_push($index, $postKey);
|
||||||
// Foreach tag from post
|
|
||||||
foreach($tags as $tagKey=>$tagName)
|
|
||||||
{
|
|
||||||
if( isset($tagsIndex[$tagKey]) ) {
|
|
||||||
array_push($tagsIndex[$tagKey]['posts'], $postKey);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$tagsIndex[$tagKey]['name'] = $tagName;
|
|
||||||
$tagsIndex[$tagKey]['posts'] = array($postKey);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->db['postsIndex'] = $tagsIndex;
|
$this->db[$categoryKey]['posts'] = $index;
|
||||||
|
|
||||||
if( $this->save() === false ) {
|
if( $this->save() === false ) {
|
||||||
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to save the database file.');
|
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to save the database file.');
|
||||||
|
@ -127,4 +117,27 @@ class dbCategories extends dbJSON
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Re-generate pages index
|
||||||
|
// (array) $db, the $db must be sorted by date and the posts published only.
|
||||||
|
public function reIndexPages($db)
|
||||||
|
{
|
||||||
|
$index = array();
|
||||||
|
|
||||||
|
// Foreach post in the database
|
||||||
|
foreach($db as $pageKey=>$pageData) {
|
||||||
|
$categoryKey = $pageData['category'];
|
||||||
|
array_push($index, $pageKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db[$categoryKey]['pages'] = $index;
|
||||||
|
|
||||||
|
if( $this->save() === false ) {
|
||||||
|
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to save the database file.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -13,7 +13,8 @@ class dbPosts extends dbJSON
|
||||||
'date'=> array('inFile'=>false, 'value'=>''),
|
'date'=> array('inFile'=>false, 'value'=>''),
|
||||||
'dateModified'=> array('inFile'=>false, 'value'=>''),
|
'dateModified'=> array('inFile'=>false, 'value'=>''),
|
||||||
'coverImage'=> array('inFile'=>false, 'value'=>''),
|
'coverImage'=> array('inFile'=>false, 'value'=>''),
|
||||||
'md5file'=> array('inFile'=>false, 'value'=>'')
|
'md5file'=> array('inFile'=>false, 'value'=>''),
|
||||||
|
'category'=> array('inFile'=>false, 'value'=>'')
|
||||||
);
|
);
|
||||||
|
|
||||||
function __construct()
|
function __construct()
|
||||||
|
@ -21,7 +22,7 @@ class dbPosts extends dbJSON
|
||||||
parent::__construct(PATH_DATABASES.'posts.php');
|
parent::__construct(PATH_DATABASES.'posts.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the amount of posts
|
// Returns the amount of posts
|
||||||
// $total = TRUE, returns the total of posts
|
// $total = TRUE, returns the total of posts
|
||||||
// $total = FALSE, return the amount of published posts
|
// $total = FALSE, return the amount of published posts
|
||||||
public function numberPost($total=false)
|
public function numberPost($total=false)
|
||||||
|
@ -42,13 +43,14 @@ class dbPosts extends dbJSON
|
||||||
return $i;
|
return $i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the database
|
// Returns the complete database
|
||||||
public function getDB()
|
public function getDB()
|
||||||
{
|
{
|
||||||
return $this->db;
|
return $this->db;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return an array with the post's database, FALSE otherwise.
|
// Return an array with the post database, FALSE otherwise.
|
||||||
|
// Filtered by post key
|
||||||
public function getPostDB($key)
|
public function getPostDB($key)
|
||||||
{
|
{
|
||||||
if($this->postExists($key)) {
|
if($this->postExists($key)) {
|
||||||
|
@ -129,7 +131,7 @@ class dbPosts extends dbJSON
|
||||||
$args['status'] = 'scheduled';
|
$args['status'] = 'scheduled';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify arguments with the database fields.
|
// Verify arguments with the database fields
|
||||||
foreach($this->dbFields as $field=>$options)
|
foreach($this->dbFields as $field=>$options)
|
||||||
{
|
{
|
||||||
// If the field is in the arguments
|
// If the field is in the arguments
|
||||||
|
@ -139,8 +141,9 @@ class dbPosts extends dbJSON
|
||||||
$tmpValue = $this->generateTags($args['tags']);
|
$tmpValue = $this->generateTags($args['tags']);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Sanitize if will be saved on database.
|
// Where the argument will be stored, database or file
|
||||||
if( !$options['inFile'] ) {
|
if( !$options['inFile'] ) {
|
||||||
|
// Sanitize if going to be stored on database
|
||||||
$tmpValue = Sanitize::html($args[$field]);
|
$tmpValue = Sanitize::html($args[$field]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -148,18 +151,16 @@ class dbPosts extends dbJSON
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
// Set a default value if not in the arguments
|
// Set a default value if not in the arguments
|
||||||
else
|
|
||||||
{
|
|
||||||
$tmpValue = $options['value'];
|
$tmpValue = $options['value'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check where the field will be written, in the file or in the database
|
// Check where the field will be stored in the file or in the database
|
||||||
if($options['inFile']) {
|
if($options['inFile']) {
|
||||||
$dataForFile[$field] = Text::firstCharUp($field).': '.$tmpValue;
|
$dataForFile[$field] = Text::firstCharUp($field).': '.$tmpValue;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
// Set type
|
// Set type
|
||||||
settype($tmpValue, gettype($options['value']));
|
settype($tmpValue, gettype($options['value']));
|
||||||
|
|
||||||
|
@ -168,7 +169,7 @@ class dbPosts extends dbJSON
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make the directory.
|
// Create the directory
|
||||||
if( Filesystem::mkdir(PATH_POSTS.$key) === false ) {
|
if( Filesystem::mkdir(PATH_POSTS.$key) === false ) {
|
||||||
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to create the directory '.PATH_POSTS.$key);
|
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to create the directory '.PATH_POSTS.$key);
|
||||||
return false;
|
return false;
|
||||||
|
@ -184,19 +185,14 @@ class dbPosts extends dbJSON
|
||||||
// Calculate the checksum of the file
|
// Calculate the checksum of the file
|
||||||
$dataForDb['md5file'] = md5_file(PATH_POSTS.$key.DS.FILENAME);
|
$dataForDb['md5file'] = md5_file(PATH_POSTS.$key.DS.FILENAME);
|
||||||
|
|
||||||
// Save the database
|
// Insert in the database
|
||||||
$this->db[$key] = $dataForDb;
|
$this->db[$key] = $dataForDb;
|
||||||
|
|
||||||
// Sort posts before save
|
// Sort database posts before save
|
||||||
$this->sortByDate();
|
$this->sortByDate();
|
||||||
|
|
||||||
|
// Save database file
|
||||||
if( $this->save() === false ) {
|
if( $this->save() === false ) {
|
||||||
|
|
||||||
// Trying to rollback
|
|
||||||
Log::set(__METHOD__.LOG_SEP.'Rollback...');
|
|
||||||
Filesystem::rmfile(PATH_POSTS.$key.DS.FILENAME);
|
|
||||||
Filesystem::rmdir(PATH_POSTS.$key);
|
|
||||||
|
|
||||||
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to save the database file.');
|
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to save the database file.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,23 @@ function reIndexTagsPosts()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function reIndexCategoriesPosts()
|
||||||
|
{
|
||||||
|
global $dbPosts;
|
||||||
|
global $dbCategories;
|
||||||
|
|
||||||
|
// Remove unpublished.
|
||||||
|
$dbPosts->removeUnpublished();
|
||||||
|
|
||||||
|
// Regenerate the tags index for posts.
|
||||||
|
$dbCategories->reindexPosts( $dbPosts->db );
|
||||||
|
|
||||||
|
// Restore the database, before remove the unpublished.
|
||||||
|
$dbPosts->restoreDB();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
function buildPost($key)
|
function buildPost($key)
|
||||||
{
|
{
|
||||||
global $dbPosts;
|
global $dbPosts;
|
||||||
|
|
Loading…
Reference in New Issue