Rename MVC folders for consistency
Co-authored-by: LeOSW42 <673670+LeOSW42@users.noreply.github.com>
This commit is contained in:
1 parent
fd84530759
commit
10aa54fd57
15 files changed
+4
-2
No files matched your search
Executable
+415
@@ -0,0 +1,415 @@
|
||||
<?php
|
||||
|
||||
namespace Kabano;
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage a blog article object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
require_once($config['third_folder']."Md/MarkdownExtra.inc.php");
|
||||
require_once($config['includes_folder']."database.php");
|
||||
|
||||
class BlogArticle
|
||||
{
|
||||
public $content_id = NULL;
|
||||
public $locale_id = NULL;
|
||||
public $version_id = NULL;
|
||||
public $permalink = NULL;
|
||||
public $version = 0;
|
||||
public $locale = NULL;
|
||||
public $creation_date = NULL;
|
||||
public $update_date = NULL;
|
||||
public $author = NULL;
|
||||
public $is_public = NULL;
|
||||
public $is_archive = NULL;
|
||||
public $is_commentable = NULL;
|
||||
public $type = "blog";
|
||||
public $name = NULL;
|
||||
public $content = NULL;
|
||||
public $content_html = NULL;
|
||||
public $content_txt = NULL;
|
||||
public $author_name = NULL;
|
||||
|
||||
private function decodeJsonText($value) {
|
||||
if ($value === null || $value === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$decoded = json_decode($value, true);
|
||||
if (!is_array($decoded)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return isset($decoded['text']) ? $decoded['text'] : '';
|
||||
}
|
||||
|
||||
/*****
|
||||
** Checks if a page at this URL exists and return the ID
|
||||
*****/
|
||||
public function checkPermalink($permalink, $withArchive=0, $elementNb=0) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='blog'";
|
||||
if($withArchive==0) {
|
||||
$query .= " AND is_archive=FALSE AND is_public=TRUE";
|
||||
}
|
||||
$query .= " ORDER BY update_date DESC LIMIT 1 OFFSET $2";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($permalink, $elementNb))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if(pg_num_rows($result) == 1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Populate the object using its ID
|
||||
*****/
|
||||
public function populate($row) {
|
||||
if (!is_array($row)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$decodedContent = null;
|
||||
if (array_key_exists('content', $row)) {
|
||||
$decodedContent = $this->decodeJsonText($row['content']);
|
||||
}
|
||||
|
||||
if (array_key_exists('content_id', $row)) {
|
||||
$this->content_id = $row['content_id'];
|
||||
}
|
||||
if (array_key_exists('locale_id', $row)) {
|
||||
$this->locale_id = $row['locale_id'];
|
||||
}
|
||||
if (array_key_exists('version_id', $row)) {
|
||||
$this->version_id = $row['version_id'];
|
||||
}
|
||||
if (array_key_exists('permalink', $row)) {
|
||||
$this->permalink = $row['permalink'];
|
||||
}
|
||||
if (array_key_exists('version', $row)) {
|
||||
$this->version = $row['version'];
|
||||
}
|
||||
if (array_key_exists('locale', $row)) {
|
||||
$this->locale = $row['locale'];
|
||||
}
|
||||
if (array_key_exists('creation_date', $row)) {
|
||||
$this->creation_date = $row['creation_date'];
|
||||
}
|
||||
if (array_key_exists('update_date', $row)) {
|
||||
$this->update_date = $row['update_date'];
|
||||
}
|
||||
if (array_key_exists('author', $row)) {
|
||||
$this->author = $row['author'];
|
||||
}
|
||||
if (array_key_exists('is_public', $row)) {
|
||||
$this->is_public = $row['is_public'];
|
||||
}
|
||||
if (array_key_exists('is_archive', $row)) {
|
||||
$this->is_archive = $row['is_archive'];
|
||||
}
|
||||
if (array_key_exists('is_commentable', $row)) {
|
||||
$this->is_commentable = $row['is_commentable'];
|
||||
}
|
||||
if (array_key_exists('type', $row)) {
|
||||
$this->type = $row['type'];
|
||||
}
|
||||
if (array_key_exists('name', $row)) {
|
||||
$this->name = $row['name'];
|
||||
}
|
||||
if ($decodedContent !== null) {
|
||||
$this->content = $decodedContent;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Edit a page by archiving the current one and inserting a new one ID
|
||||
*****/
|
||||
public function update() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
if($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0)
|
||||
die("Cannot update entry without giving ID");
|
||||
|
||||
$this->version++;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
pg_query($con, "BEGIN");
|
||||
|
||||
$query = "UPDATE content_versions SET is_archive = TRUE WHERE locale_id = $1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->locale_id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$query = "INSERT INTO content_versions (version, update_date, is_archive, name, content, locale_id) VALUES
|
||||
($1, $2, FALSE, $3, $4, $5) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare2", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
|
||||
$jsonContent = json_encode(['text' => $this->content]);
|
||||
$result = pg_execute($con, "prepare2", array($this->version, date('r'), $this->name, $jsonContent, $this->locale_id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->version_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_contributors (content, contributor) VALUES
|
||||
($1, $2) ON CONFLICT (content, contributor) DO NOTHING";
|
||||
|
||||
pg_prepare($con, "prepare3", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare3", array($this->locale_id, $user->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$query = "UPDATE contents SET is_commentable = $1 WHERE id = $2";
|
||||
pg_prepare($con, "prepare4", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
pg_execute($con, "prepare4", array($this->is_commentable ? 't' : 'f', $this->content_id))
|
||||
or die ("Cannot prepare statement\n");
|
||||
|
||||
pg_query($con, "COMMIT");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tUPDATE \tEdit blog article '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'blog.articles.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Delete an article by archiving it
|
||||
*****/
|
||||
public function delete() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE contents SET is_public=FALSE WHERE permalink=$1 AND type='blog'";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->permalink))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tDELETE \tArchive blog article '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'blog.articles.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Restore a page from unpublishing it
|
||||
*****/
|
||||
public function restore() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE contents SET is_public=TRUE WHERE permalink=$1 AND type='blog'";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->permalink))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tRESTORE \tPublish blog article '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'blog.articles.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Create an article
|
||||
*****/
|
||||
public function insert() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
pg_query($con, "BEGIN");
|
||||
|
||||
$query = "INSERT INTO contents (permalink, creation_date, is_public, is_commentable, type) VALUES
|
||||
($1, $2, TRUE, $3, 'blog') RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->permalink, date('r'), $this->is_commentable))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->content_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_locales (content_id, locale, author) VALUES
|
||||
($1, $2, $3) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare2", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare2", array($this->content_id, $this->locale, $user->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->locale_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_versions (version, update_date, is_archive, name, content, locale_id) VALUES
|
||||
('0', $1, FALSE, $2, $3, $4) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare3", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
|
||||
$jsonContent = json_encode(['text' => $this->content]);
|
||||
$result = pg_execute($con, "prepare3", array(date('r'), $this->name, $jsonContent, $this->locale_id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->version_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_contributors (content, contributor) VALUES
|
||||
($1, $2)";
|
||||
|
||||
pg_prepare($con, "prepare4", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare4", array($this->locale_id, $user->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_query($con, "COMMIT");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tINSERT \tCreate new blog article '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'blog.articles.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Converts the Markdown content to HTML
|
||||
*****/
|
||||
public function md2html() {
|
||||
$this->content_html = \Michelf\MarkdownExtra::defaultTransform($this->content);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Converts the Markdown content to text
|
||||
*****/
|
||||
public function md2txt() {
|
||||
$this->md2html();
|
||||
$this->content_txt = strip_tags($this->content_html);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage a list of blog articles
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
class BlogArticles
|
||||
{
|
||||
public $objs = array();
|
||||
public $number = NULL;
|
||||
|
||||
/*****
|
||||
** Return the list of different articles
|
||||
*****/
|
||||
public function listArticles($first, $count, $archive=0) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE is_archive=FALSE ";
|
||||
if ($archive != 1)
|
||||
$query .= "AND is_public=TRUE ";
|
||||
$query .= "AND type='blog' ORDER BY update_date DESC";
|
||||
$query .= " LIMIT $1 OFFSET $2";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($count, $first))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
for($i = 0; $i < pg_num_rows($result); $i++) {
|
||||
$row = pg_fetch_assoc($result, $i);
|
||||
$this->objs[$i] = new BlogArticle;
|
||||
$this->objs[$i]->populate($row);
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Return the number of articles
|
||||
*****/
|
||||
public function number($archive=0) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE is_archive=FALSE ";
|
||||
if ($archive == 1)
|
||||
$query .= "AND is_public=TRUE ";
|
||||
$query .= "AND type='blog' ORDER BY update_date DESC";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array())
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
$this->number = pg_num_rows($result);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Return the list of archived version of a blog article
|
||||
*****/
|
||||
public function getHistory($url) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='blog' ORDER BY update_date DESC";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($url))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
$this->number = pg_num_rows($result);
|
||||
|
||||
for($i = 0; $i < $this->number; $i++) {
|
||||
$row = pg_fetch_assoc($result, $i);
|
||||
$this->objs[$i] = new BlogArticle;
|
||||
$this->objs[$i]->populate($row);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,226 @@
|
||||
<?php
|
||||
|
||||
namespace Kabano;
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage a comment object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
require_once($config['third_folder']."Md/MarkdownExtra.inc.php");
|
||||
require_once($config['includes_folder']."database.php");
|
||||
|
||||
class Comment
|
||||
{
|
||||
public $id = NULL;
|
||||
public $version = 0;
|
||||
public $creation_date = NULL;
|
||||
public $update_date = NULL;
|
||||
public $author = NULL;
|
||||
public $is_public = NULL;
|
||||
public $is_archive = NULL;
|
||||
public $content = NULL;
|
||||
public $comment = NULL;
|
||||
public $locale = NULL;
|
||||
public $comment_html = NULL;
|
||||
public $author_obj = NULL;
|
||||
|
||||
|
||||
/*****
|
||||
** Connect to correct account using ID and stores its ID
|
||||
*****/
|
||||
public function checkID($id) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT * FROM content_comments WHERE id=$1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if(pg_num_rows($result) == 1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Populate the object using its ID
|
||||
*****/
|
||||
public function populate($row) {
|
||||
if (!is_array($row)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (array_key_exists('id', $row)) {
|
||||
$this->id = $row['id'];
|
||||
}
|
||||
if (array_key_exists('version', $row)) {
|
||||
$this->version = $row['version'];
|
||||
}
|
||||
if (array_key_exists('creation_date', $row)) {
|
||||
$this->creation_date = $row['creation_date'];
|
||||
}
|
||||
if (array_key_exists('update_date', $row)) {
|
||||
$this->update_date = $row['update_date'];
|
||||
}
|
||||
if (array_key_exists('author', $row)) {
|
||||
$this->author = $row['author'];
|
||||
}
|
||||
if (array_key_exists('is_public', $row)) {
|
||||
$this->is_public = $row['is_public'];
|
||||
}
|
||||
if (array_key_exists('is_archive', $row)) {
|
||||
$this->is_archive = $row['is_archive'];
|
||||
}
|
||||
if (array_key_exists('content', $row)) {
|
||||
$this->content = $row['content'];
|
||||
}
|
||||
if (array_key_exists('comment', $row)) {
|
||||
$this->comment = $row['comment'];
|
||||
}
|
||||
if (array_key_exists('locale', $row)) {
|
||||
$this->locale = $row['locale'];
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Create a new comment
|
||||
*****/
|
||||
public function insert() {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "INSERT INTO content_comments (version, creation_date, update_date, author, is_public, is_archive, content, comment, locale) VALUES
|
||||
('0', $1, $2, $3, TRUE, FALSE, $4, $5, $6) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array(date('r'), date('r'), $this->author, $this->content, $this->comment, $this->locale))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
pg_close($con);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Archive a comment
|
||||
*****/
|
||||
public function delete() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE content_comments SET is_public = FALSE WHERE id = $1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tDELETE \tArchive comment ".$this->id."\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'blog.comments.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Restore a comment
|
||||
*****/
|
||||
public function restore() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE content_comments SET is_public = TRUE WHERE id = $1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tPUBLISH \tUn archive comment ".$this->id."\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'blog.comments.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Converts the Markdown comment to HTML
|
||||
*****/
|
||||
public function md2html() {
|
||||
$this->comment_html = \Michelf\MarkdownExtra::defaultTransform($this->comment);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Converts the Markdown comment to text
|
||||
*****/
|
||||
public function md2txt() {
|
||||
$this->md2html();
|
||||
$this->comment_txt = strip_tags($this->comment_html);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage a list of blog comments
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
class Comments
|
||||
{
|
||||
public $objs = array();
|
||||
public $number = NULL;
|
||||
|
||||
/*****
|
||||
** Return the list of different articles
|
||||
*****/
|
||||
public function listComments($id, $archive=0) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT * FROM content_comments WHERE content = $1 ";
|
||||
if ($archive == 0)
|
||||
$query .= "AND is_archive IS FALSE AND is_public IS TRUE ";
|
||||
$query .= "ORDER BY update_date DESC";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
$this->number = pg_num_rows($result);
|
||||
|
||||
for($i = 0; $i < pg_num_rows($result); $i++) {
|
||||
$row = pg_fetch_assoc($result, $i);
|
||||
$this->objs[$i] = new Comment;
|
||||
$this->objs[$i]->populate($row);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+106
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace Kabano;
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage Locale object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
require_once($config['includes_folder']."database.php");
|
||||
|
||||
class Locale
|
||||
{
|
||||
public $name = 0;
|
||||
public $display_name = NULL;
|
||||
public $flag_name = NULL;
|
||||
|
||||
/*****
|
||||
** populate object using name
|
||||
*****/
|
||||
public function checkName($name) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT * FROM locales WHERE name=$1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($name))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if(pg_num_rows($result) == 1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Populate the object using raw data from SQL
|
||||
*****/
|
||||
public function populate($row) {
|
||||
if (!is_array($row)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (array_key_exists('name', $row)) {
|
||||
$this->name = $row['name'];
|
||||
}
|
||||
if (array_key_exists('display_name', $row)) {
|
||||
$this->display_name = $row['display_name'];
|
||||
}
|
||||
if (array_key_exists('flag_name', $row)) {
|
||||
$this->flag_name = $row['flag_name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage Locales list object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
class Locales
|
||||
{
|
||||
public $number = 0;
|
||||
public $objs = array();
|
||||
|
||||
/*****
|
||||
** Get all locales
|
||||
*****/
|
||||
public function getAll() {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT * FROM locales";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array())
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
$this->number = pg_num_rows($result);
|
||||
|
||||
for($i = 0; $i < $this->number; $i++) {
|
||||
$locale = pg_fetch_assoc($result, $i);
|
||||
$this->objs[$i] = new Locale;
|
||||
$this->objs[$i]->populate($locale);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+515
@@ -0,0 +1,515 @@
|
||||
<?php
|
||||
|
||||
namespace Kabano;
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage a poi object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
require_once($config['third_folder']."Md/MarkdownExtra.inc.php");
|
||||
require_once($config['includes_folder']."poi_types.struct.php");
|
||||
require_once($config['includes_folder']."database.php");
|
||||
|
||||
class Poi
|
||||
{
|
||||
public $content_id = NULL;
|
||||
public $locale_id = NULL;
|
||||
public $source_id = NULL;
|
||||
public $version_id = NULL;
|
||||
public $permalink = NULL;
|
||||
public $version = 0;
|
||||
public $locale = 0;
|
||||
public $creation_date = NULL;
|
||||
public $update_date = NULL;
|
||||
public $author = NULL;
|
||||
public $is_public = NULL;
|
||||
public $is_archive = NULL; // Means destroyed for a POI
|
||||
public $is_commentable = NULL;
|
||||
public $type = "poi";
|
||||
public $poi_type = NULL;
|
||||
public $name = NULL;
|
||||
public $source = NULL;
|
||||
public $remote_source_id = NULL;
|
||||
public $parameters = NULL;
|
||||
|
||||
public $lat;
|
||||
public $lon;
|
||||
public $ele;
|
||||
public $author_name;
|
||||
|
||||
private function decodeJsonArray($value) {
|
||||
if ($value === null || $value === '') {
|
||||
return [];
|
||||
}
|
||||
|
||||
$decoded = json_decode($value, true);
|
||||
if (!is_array($decoded)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $decoded;
|
||||
}
|
||||
|
||||
/*****
|
||||
** Checks if a page at this URL exists and return the ID
|
||||
*****/
|
||||
public function checkPermalink($permalink, $withArchive=0, $elementNb=0) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT
|
||||
content_versions.id AS version_id,
|
||||
content_versions.version,
|
||||
content_versions.update_date,
|
||||
content_versions.is_archive,
|
||||
content_versions.name,
|
||||
content_versions.content AS parameters,
|
||||
|
||||
contents.id AS content_id,
|
||||
contents.permalink,
|
||||
contents.creation_date,
|
||||
contents.is_public,
|
||||
contents.is_commentable,
|
||||
contents.type,
|
||||
contents.poi_type,
|
||||
|
||||
content_locales.id AS locale_id,
|
||||
content_locales.locale,
|
||||
content_locales.author,
|
||||
|
||||
specs.source_id,
|
||||
specs.remote_source_id,
|
||||
ST_X(specs.geom) AS lon,
|
||||
ST_Y(specs.geom) AS lat,
|
||||
ST_Z(specs.geom) AS ele,
|
||||
|
||||
sources.display_name AS source
|
||||
|
||||
FROM contents
|
||||
INNER JOIN content_locales
|
||||
ON contents.id = content_locales.content_id
|
||||
INNER JOIN content_versions
|
||||
ON content_locales.id = content_versions.locale_id
|
||||
LEFT JOIN content_version_poi_specifications specs
|
||||
ON specs.content_version_id = content_versions.id
|
||||
LEFT JOIN sources
|
||||
ON sources.id = specs.source_id
|
||||
|
||||
WHERE contents.permalink = $1
|
||||
AND contents.type = 'poi'";
|
||||
|
||||
if ($withArchive == 0) {
|
||||
$query .= " AND content_versions.is_archive = FALSE AND contents.is_public = TRUE";
|
||||
}
|
||||
|
||||
$query .= " ORDER BY content_versions.update_date DESC LIMIT 1 OFFSET $2";
|
||||
|
||||
pg_prepare($con, "poi_check_permalink", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
|
||||
$result = pg_execute($con, "poi_check_permalink", [$permalink, $elementNb])
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if (pg_num_rows($result) == 1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****
|
||||
** Populate the object using its ID
|
||||
*****/
|
||||
public function populate($row) {
|
||||
if (!is_array($row)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$decodedParameters = null;
|
||||
if (array_key_exists('parameters', $row)) {
|
||||
$decodedParameters = $this->decodeJsonArray($row['parameters']);
|
||||
}
|
||||
|
||||
if (array_key_exists('content_id', $row)) {
|
||||
$this->content_id = $row['content_id'];
|
||||
}
|
||||
if (array_key_exists('locale_id', $row)) {
|
||||
$this->locale_id = $row['locale_id'];
|
||||
}
|
||||
if (array_key_exists('source_id', $row)) {
|
||||
$this->source_id = $row['source_id'];
|
||||
}
|
||||
if (array_key_exists('version_id', $row)) {
|
||||
$this->version_id = $row['version_id'];
|
||||
}
|
||||
if (array_key_exists('permalink', $row)) {
|
||||
$this->permalink = $row['permalink'];
|
||||
}
|
||||
if (array_key_exists('version', $row)) {
|
||||
$this->version = $row['version'];
|
||||
}
|
||||
if (array_key_exists('locale', $row)) {
|
||||
$this->locale = $row['locale'];
|
||||
}
|
||||
if (array_key_exists('creation_date', $row)) {
|
||||
$this->creation_date = $row['creation_date'];
|
||||
}
|
||||
if (array_key_exists('update_date', $row)) {
|
||||
$this->update_date = $row['update_date'];
|
||||
}
|
||||
if (array_key_exists('author', $row)) {
|
||||
$this->author = $row['author'];
|
||||
}
|
||||
if (array_key_exists('is_public', $row)) {
|
||||
$this->is_public = $row['is_public'];
|
||||
}
|
||||
if (array_key_exists('is_archive', $row)) {
|
||||
$this->is_archive = $row['is_archive'];
|
||||
}
|
||||
if (array_key_exists('is_commentable', $row)) {
|
||||
$this->is_commentable = $row['is_commentable'];
|
||||
}
|
||||
if (array_key_exists('type', $row)) {
|
||||
$this->type = $row['type'];
|
||||
}
|
||||
if (array_key_exists('poi_type', $row)) {
|
||||
$this->poi_type = $row['poi_type'];
|
||||
}
|
||||
if (array_key_exists('name', $row)) {
|
||||
$this->name = $row['name'];
|
||||
}
|
||||
if ($decodedParameters !== null) {
|
||||
$this->parameters = $decodedParameters;
|
||||
}
|
||||
if (array_key_exists('lon', $row)) {
|
||||
$this->lon = $row['lon'];
|
||||
}
|
||||
if (array_key_exists('lat', $row)) {
|
||||
$this->lat = $row['lat'];
|
||||
}
|
||||
if (array_key_exists('ele', $row)) {
|
||||
$this->ele = $row['ele'];
|
||||
}
|
||||
if (array_key_exists('source', $row)) {
|
||||
$this->source = $row['source'];
|
||||
}
|
||||
if (array_key_exists('remote_source_id', $row)) {
|
||||
$this->remote_source_id = $row['remote_source_id'];
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Create a new poi
|
||||
*****/
|
||||
public function insert() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
pg_query($con, "BEGIN");
|
||||
|
||||
$query = "INSERT INTO contents (is_commentable, is_public, permalink, creation_date, type, poi_type) VALUES
|
||||
($1, TRUE, $2, $3, $4, $5) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->is_commentable, $this->permalink, date('r'), $this->type, $this->poi_type))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->content_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_locales (content_id, locale, author) VALUES
|
||||
($1, $2, $3) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare2", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare2", array($this->content_id, $this->locale, $user->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->locale_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_versions (version, update_date, is_archive, name, content, locale_id) VALUES
|
||||
('0', $1, FALSE, $2, $3, $4) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare3", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
|
||||
$result = pg_execute($con, "prepare3", array(date('r'), $this->name, $this->parameters, $this->locale_id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->version_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_version_poi_specifications (content_version_id, geom, source_id, remote_source_id) VALUES
|
||||
($1, ST_SetSRID(ST_MakePoint($2, $3, $4), 4326), $5, $6)";
|
||||
|
||||
pg_prepare($con, "prepare4", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare4", array($this->version_id, $this->lon, $this->lat, $this->ele ,$this->source_id, $this->remote_source_id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$query = "INSERT INTO content_contributors (content, contributor) VALUES
|
||||
($1, $2)";
|
||||
|
||||
pg_prepare($con, "prepare5", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare5", array($this->locale_id, $user->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_query($con, "COMMIT");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tINSERT \tCreate new poi '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'poi.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Edit a POI by archiving the current version and inserting a new one
|
||||
*****/
|
||||
public function update() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
if ($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0)
|
||||
die("Cannot update entry without giving ID");
|
||||
|
||||
$this->version++;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
pg_query($con, "BEGIN");
|
||||
|
||||
// 1) Archive old versions
|
||||
$query = "UPDATE content_versions SET is_archive = TRUE WHERE locale_id = $1";
|
||||
pg_prepare($con, "poi_update_archive", $query);
|
||||
pg_execute($con, "poi_update_archive", array($this->locale_id));
|
||||
|
||||
// 2) Insert new version
|
||||
$query = "INSERT INTO content_versions (version, update_date, is_archive, name, content, locale_id) VALUES
|
||||
($1, $2, FALSE, $3, $4, $5) RETURNING id";
|
||||
|
||||
pg_prepare($con, "poi_update_newversion", $query);
|
||||
|
||||
$result = pg_execute($con, "poi_update_newversion", array($this->version, date('r'), $this->name, $this->parameters, $this->locale_id));
|
||||
|
||||
$this->version_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
// 3) Insert new geometry + source info for this new version
|
||||
$query = "INSERT INTO content_version_poi_specifications (content_version_id, geom, source_id, remote_source_id) VALUES
|
||||
($1, ST_SetSRID(ST_MakePoint($2, $3, $4), 4326), $5, $6)";
|
||||
|
||||
pg_prepare($con, "poi_insert_specs_update", $query);
|
||||
pg_execute($con, "poi_insert_specs_update", array( $this->version_id, $this->lon, $this->lat, $this->ele, $this->source, $this->remote_source_id ));
|
||||
|
||||
// 4) Update is_commentable
|
||||
$query = "UPDATE contents SET is_commentable = $1, poi_type = $2 WHERE id = $3";
|
||||
pg_prepare($con, "poi_update_commentable", $query);
|
||||
pg_execute($con, "poi_update_commentable", array( $this->is_commentable ? 't' : 'f', $this->poi_type, $this->content_id));
|
||||
|
||||
// 5) Add contributor
|
||||
$query = "INSERT INTO content_contributors (content, contributor)
|
||||
VALUES ($1, $2) ON CONFLICT (content, contributor) DO NOTHING";
|
||||
|
||||
pg_prepare($con, "poi_update_contrib", $query);
|
||||
pg_execute($con, "poi_update_contrib", array($this->content_id, $user->id));
|
||||
|
||||
pg_query($con, "COMMIT");
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tUPDATE \tEdit POI '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'poi.log'
|
||||
);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Archive a POI
|
||||
*****/
|
||||
public function delete() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE contents SET is_public = FALSE WHERE id = $1";
|
||||
|
||||
pg_prepare($con, "poi_delete", $query);
|
||||
pg_execute($con, "poi_delete", array($this->content_id));
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tDELETE \tArchive POI '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'poi.log'
|
||||
);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Restore a POI
|
||||
*****/
|
||||
public function restore() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE contents SET is_public = TRUE WHERE id = $1";
|
||||
|
||||
pg_prepare($con, "poi_restore", $query);
|
||||
pg_execute($con, "poi_restore", array($this->content_id));
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tRESTORE \tPublish POI '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'poi.log'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Pois
|
||||
{
|
||||
public $objs = [];
|
||||
public $number = 0;
|
||||
|
||||
public function listPois($archive=0) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT
|
||||
content_versions.id AS version_id,
|
||||
content_versions.version,
|
||||
content_versions.update_date,
|
||||
content_versions.is_archive,
|
||||
content_versions.name,
|
||||
content_versions.content AS parameters,
|
||||
|
||||
contents.id AS content_id,
|
||||
contents.permalink,
|
||||
contents.creation_date,
|
||||
contents.is_public,
|
||||
contents.is_commentable,
|
||||
contents.type,
|
||||
contents.poi_type,
|
||||
|
||||
content_locales.id AS locale_id,
|
||||
content_locales.locale,
|
||||
content_locales.author,
|
||||
|
||||
specs.source_id,
|
||||
specs.remote_source_id,
|
||||
ST_X(specs.geom) AS lon,
|
||||
ST_Y(specs.geom) AS lat,
|
||||
ST_Z(specs.geom) AS ele,
|
||||
|
||||
sources.display_name AS source
|
||||
|
||||
FROM contents
|
||||
INNER JOIN content_locales
|
||||
ON contents.id = content_locales.content_id
|
||||
INNER JOIN content_versions
|
||||
ON content_locales.id = content_versions.locale_id
|
||||
LEFT JOIN content_version_poi_specifications specs
|
||||
ON specs.content_version_id = content_versions.id
|
||||
LEFT JOIN sources
|
||||
ON sources.id = specs.source_id
|
||||
|
||||
WHERE contents.type = 'poi'
|
||||
AND content_versions.is_archive = FALSE";
|
||||
|
||||
if ($archive != 1)
|
||||
$query .= " AND contents.is_public=TRUE ";
|
||||
|
||||
$query .= " ORDER BY content_versions.update_date DESC";
|
||||
|
||||
pg_prepare($con, "pois_list", $query);
|
||||
$result = pg_execute($con, "pois_list", []);
|
||||
|
||||
pg_close($con);
|
||||
|
||||
for ($i = 0; $i < pg_num_rows($result); $i++) {
|
||||
$row = pg_fetch_assoc($result, $i);
|
||||
$this->objs[$i] = new Poi;
|
||||
$this->objs[$i]->populate($row);
|
||||
}
|
||||
}
|
||||
|
||||
public function getHistory($permalink) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT
|
||||
content_versions.id AS version_id,
|
||||
content_versions.version,
|
||||
content_versions.update_date,
|
||||
content_versions.is_archive,
|
||||
content_versions.name,
|
||||
content_versions.content AS parameters,
|
||||
|
||||
contents.id AS content_id,
|
||||
contents.permalink,
|
||||
contents.creation_date,
|
||||
contents.is_public,
|
||||
contents.is_commentable,
|
||||
contents.type,
|
||||
contents.poi_type,
|
||||
|
||||
content_locales.id AS locale_id,
|
||||
content_locales.locale,
|
||||
content_locales.author,
|
||||
|
||||
specs.source_id,
|
||||
specs.remote_source_id,
|
||||
ST_X(specs.geom) AS lon,
|
||||
ST_Y(specs.geom) AS lat,
|
||||
ST_Z(specs.geom) AS ele,
|
||||
|
||||
sources.display_name AS source
|
||||
|
||||
FROM contents
|
||||
INNER JOIN content_locales
|
||||
ON contents.id = content_locales.content_id
|
||||
INNER JOIN content_versions
|
||||
ON content_locales.id = content_versions.locale_id
|
||||
LEFT JOIN content_version_poi_specifications specs
|
||||
ON specs.content_version_id = content_versions.id
|
||||
LEFT JOIN sources
|
||||
ON sources.id = specs.source_id
|
||||
|
||||
WHERE contents.permalink = $1
|
||||
AND contents.type = 'poi'
|
||||
|
||||
ORDER BY content_versions.update_date DESC
|
||||
";
|
||||
|
||||
pg_prepare($con, "poi_history", $query);
|
||||
$result = pg_execute($con, "poi_history", array($permalink));
|
||||
|
||||
pg_close($con);
|
||||
|
||||
$this->number = pg_num_rows($result);
|
||||
|
||||
for ($i = 0; $i < $this->number; $i++) {
|
||||
$row = pg_fetch_assoc($result, $i);
|
||||
$this->objs[$i] = new Poi;
|
||||
$this->objs[$i]->populate($row);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+474
@@ -0,0 +1,474 @@
|
||||
<?php
|
||||
|
||||
namespace Kabano;
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage User object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
require_once($config['models_folder']."d.locales.php");
|
||||
require_once($config['includes_folder']."database.php");
|
||||
|
||||
// This array is related to the defined SQL enum, do not touch.
|
||||
$ranks = array(
|
||||
"administrator" => array(1000,"Administrateur", "red", "administrator"),
|
||||
"moderator" => array(800,"Modérateur", "orangered", "moderator"),
|
||||
"premium" => array(600,"Membre premium", "orange", "premium"),
|
||||
"registered" => array(400,"Utilisateur", "green", "registered"),
|
||||
"blocked" => array(200,"Membre archivé", "#aaa", "blocked"),
|
||||
"visitor" => array(0,"Visiteur", "black", "visitor")
|
||||
);
|
||||
|
||||
class User
|
||||
{
|
||||
public $id = 0;
|
||||
public $name = NULL;
|
||||
public $version = NULL;
|
||||
public $email = NULL;
|
||||
public $password = NULL;
|
||||
public $website = NULL;
|
||||
public $is_avatar_present = NULL;
|
||||
public $is_archive = NULL;
|
||||
public $rank = NULL;
|
||||
public $locale = NULL;
|
||||
public $timezone = NULL;
|
||||
public $visit_date = NULL;
|
||||
public $register_date = NULL;
|
||||
|
||||
public $date_format;
|
||||
public $datetime_format;
|
||||
public $datetimeshort_format;
|
||||
public $locale_obj;
|
||||
public $locale_loaded = false;
|
||||
|
||||
|
||||
/*****
|
||||
** Connect to correct account using ID and stores its ID
|
||||
*****/
|
||||
public function checkID($id) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT * FROM users WHERE id=$1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if(pg_num_rows($result) == 1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Connect to correct account using user/pass and stores its ID
|
||||
*****/
|
||||
public function login($login, $pass) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT * FROM users WHERE name=$1 AND password=$2";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($login, sha1($pass)))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if(pg_num_rows($result) == 1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Populate the object using raw data from SQL
|
||||
*****/
|
||||
public function populate($row) {
|
||||
if (!is_array($row)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (array_key_exists('id', $row)) {
|
||||
$this->id = $row['id'];
|
||||
}
|
||||
if (array_key_exists('name', $row)) {
|
||||
$this->name = $row['name'];
|
||||
}
|
||||
if (array_key_exists('version', $row)) {
|
||||
$this->version = $row['version'];
|
||||
}
|
||||
if (array_key_exists('email', $row)) {
|
||||
$this->email = $row['email'];
|
||||
}
|
||||
if (array_key_exists('password', $row)) {
|
||||
$this->password = $row['password'];
|
||||
}
|
||||
if (array_key_exists('website', $row)) {
|
||||
$this->website = $row['website'];
|
||||
}
|
||||
if (array_key_exists('is_avatar_present', $row)) {
|
||||
$this->is_avatar_present = $row['is_avatar_present'];
|
||||
}
|
||||
if (array_key_exists('is_archive', $row)) {
|
||||
$this->is_archive = $row['is_archive'];
|
||||
}
|
||||
if (array_key_exists('rank', $row)) {
|
||||
$this->rank = $row['rank'];
|
||||
}
|
||||
if (array_key_exists('locale', $row)) {
|
||||
$this->locale = $row['locale'];
|
||||
}
|
||||
if (array_key_exists('timezone', $row)) {
|
||||
$this->timezone = $row['timezone'];
|
||||
}
|
||||
if (array_key_exists('visit_date', $row)) {
|
||||
$this->visit_date = $row['visit_date'];
|
||||
}
|
||||
if (array_key_exists('register_date', $row)) {
|
||||
$this->register_date = $row['register_date'];
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Simple return only functions
|
||||
*****/
|
||||
public function get_rank() {
|
||||
global $ranks;
|
||||
|
||||
return '<span class="userrole" style="color: '.$ranks[$this->rank][2].';">'.$ranks[$this->rank][1].'</span>';
|
||||
}
|
||||
public function get_locale() {
|
||||
if( $this->locale_loaded) {
|
||||
return $this->locale_obj->display_name;
|
||||
}
|
||||
else {
|
||||
$this->locale_obj = new Locale;
|
||||
$this->locale_loaded = true;
|
||||
if( $this->locale_obj->checkName($this->locale) )
|
||||
return $this->locale_obj->display_name;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Returns true if user permissions are higher than $rank
|
||||
*****/
|
||||
public function rankIsHigher($rank) {
|
||||
global $ranks;
|
||||
|
||||
return $ranks[$this->rank][0] >= $ranks[$rank][0];
|
||||
}
|
||||
|
||||
/*****
|
||||
** Checks if the user's name is available or not
|
||||
*****/
|
||||
public function availableName() {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT * FROM users WHERE lower(name)=$1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array(strtolower($this->name)))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if(pg_num_rows($result) < 1) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
if(pg_num_rows($result)==1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Checks if the user's mail address exists in the database
|
||||
*****/
|
||||
public function availableMail() {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT * FROM users WHERE lower(email)=$1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array(strtolower($this->email)))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if(pg_num_rows($result) < 1) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
if(pg_num_rows($result)==1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Creates a new user giving a sha1 password
|
||||
*****/
|
||||
public function create($password) {
|
||||
global $config;
|
||||
|
||||
$regex = '/^(https?:\/\/)/';
|
||||
if (!preg_match($regex, $this->website) && $this->website!="")
|
||||
$this->website = "http://".$this->website;
|
||||
$this->visit_date = date('r');
|
||||
$this->register_date = date('r');
|
||||
$this->locale = "fr_FR";
|
||||
$this->timezone = "Europe/Paris";
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "INSERT INTO users (name, version, email, password, website, is_avatar_present, is_archive, rank, locale, timezone, visit_date, register_date) VALUES
|
||||
($1, '0', $2, $3, $4, FALSE, FALSE, 'registered', $5, $6, $7, $8)";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
pg_execute($con, "prepare1", array($this->name, $this->email, $password, $this->website, $this->locale, $this->timezone, $this->visit_date, $this->register_date))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Update the user profile
|
||||
*****/
|
||||
public function update() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$regex = '/^(https?:\/\/)/';
|
||||
if (!preg_match($regex, $this->website) && $this->website!="")
|
||||
$this->website = "http://".$this->website;
|
||||
$this->version++;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
if($this->password=='') {
|
||||
$query = "UPDATE users SET version = $1, name = $2, is_avatar_present = $3, locale = $4, rank = $5, email = $6, website = $7, timezone = $8 WHERE id = $9";
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
pg_execute($con, "prepare1", array($this->version, $this->name, $this->is_avatar_present, $this->locale, $this->rank, $this->email, $this->website, $this->timezone, $this->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
}
|
||||
else {
|
||||
$query = "UPDATE users SET name = $1, is_avatar_present = $2, locale = $3, rank = $4, email = $5, website = $6, password = $7, timezone = $8, version = $9 WHERE id = $10";
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
pg_execute($con, "prepare1", array($this->name, $this->is_avatar_present, $this->locale, $this->rank, $this->email, $this->website, $this->password, $this->timezone, $this->version, $this->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
}
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tUPDATE \tEdit user ".$this->name." (".$this->id.")\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'users.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Generates a random passwords, update the base and send the new password by mail.
|
||||
*****/
|
||||
public function sendPassword() {
|
||||
global $config;
|
||||
|
||||
$newPass = randomPassword();
|
||||
$this->password = sha1($newPass);
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE users SET password = $1 WHERE email = $2";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
pg_execute($con, "prepare1", array($this->password, $this->email))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
$this->availableMail(); // Retreive user data from email
|
||||
|
||||
$url = "http://".$_SERVER['SERVER_NAME'].$config['rel_root_folder'];
|
||||
|
||||
$message = "Bonjour ".$this->name.",<br>\r\n";
|
||||
$message .= "<br>\r\n";
|
||||
$message .= "Voici votre nouveau mot de passe <a href='".$url."'>Kabano</a> : <b>".$newPass."</b><br>\r\n";
|
||||
$message .= "<br>\r\n";
|
||||
$message .= "Cordialement,<br>\r\n";
|
||||
$message .= "<br>\r\n";
|
||||
$message .= "L'équipe Kabano.<br>\r\n";
|
||||
$message .= "<small style='color:#777;'><i>Fait avec ♥ en Ariège.</i></small><br>\r\n";
|
||||
|
||||
$headers = 'From: '. $config['bot_mail'] . "\r\n" .
|
||||
'Reply-To: '. $config['bot_mail'] . "\r\n" .
|
||||
'X-Mailer: PHP/' . phpversion() . "\r\n" .
|
||||
'MIME-Version: 1.0' . "\r\n" .
|
||||
'Content-type: text/html; charset=UTF-8' . "\r\n";
|
||||
|
||||
mail($this->email, 'Kabano - Nouveau mot de passe', $message, $headers);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Update the last login date
|
||||
*****/
|
||||
public function updateLoginDate() {
|
||||
global $config;
|
||||
|
||||
$this->visit_date = date('r');
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE users SET visit_date = $1 WHERE id = $2";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
pg_execute($con, "prepare1", array($this->visit_date, $this->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Sends an email to the user from an other user
|
||||
*****/
|
||||
public function sendMail($content, $from) {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$url = "http://".$_SERVER['SERVER_NAME'].$config['rel_root_folder'];
|
||||
|
||||
$message = "Bonjour ".$this->name.",<br>\r\n";
|
||||
$message .= "<br>\r\n";
|
||||
$message .= "Vous venez de recevoir un message de <b>".$from->name."</b> envoyé depuis <a href='".$url."'>Kabano</a>.<br>\r\n";
|
||||
$message .= "<br>\r\n";
|
||||
$message .= "<pre style='padding: 10px; background: #ccc;'>".strip_tags($content)."</pre><br>\r\n";
|
||||
$message .= "<br>\r\n";
|
||||
$message .= "Vous pouvez simplement répondre à cet email.<br>\r\n";
|
||||
$message .= "<br>\r\n";
|
||||
$message .= "L'équipe Kabano.<br>\r\n";
|
||||
$message .= "<small style='color:#777;'><i>Fait avec ♥ depuis Toulouse.</i></small><br>\r\n";
|
||||
|
||||
$headers = 'From: '. $from->email . "\r\n" .
|
||||
'Reply-To: '. $from->email . "\r\n" .
|
||||
'X-Mailer: PHP/' . phpversion() . "\r\n" .
|
||||
'MIME-Version: 1.0' . "\r\n" .
|
||||
'Content-type: text/html; charset=UTF-8' . "\r\n";
|
||||
|
||||
mail($this->email, 'Kabano - Nouveau message privé', $message, $headers);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tMAIL \tMail sent to ".$this->name." (".$this->id.")\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'users.log');
|
||||
}
|
||||
}
|
||||
|
||||
function randomPassword() {
|
||||
$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
|
||||
$pass = array(); //remember to declare $pass as an array
|
||||
$alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
|
||||
for ($i = 0; $i < 8; $i++) {
|
||||
$n = random_int(0, $alphaLength);
|
||||
$pass[] = $alphabet[$n];
|
||||
}
|
||||
return implode($pass); //turn the array into a string
|
||||
}
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage Users list object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
class Users
|
||||
{
|
||||
public $objs = array();
|
||||
public $number = NULL;
|
||||
|
||||
/*****
|
||||
** Get the users number and return the value
|
||||
*****/
|
||||
public function number() {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT id FROM users";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array())
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
$this->number = pg_num_rows($result);
|
||||
}
|
||||
|
||||
/*****
|
||||
** Get a list of users if according to the arguments
|
||||
*****/
|
||||
public function list_users($first, $count, $orderby = "id", $order = "ASC") {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$orders=array("id","name","lastlogin","registered","website","role");
|
||||
$key=array_search($orderby,$orders);
|
||||
$orderbysafe=$orders[$key];
|
||||
|
||||
if ($order == 'ASC')
|
||||
$query = "SELECT * FROM users ORDER BY $orderbysafe ASC LIMIT $1 OFFSET $2";
|
||||
else
|
||||
$query = "SELECT * FROM users ORDER BY $orderbysafe DESC LIMIT $1 OFFSET $2";
|
||||
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($count, $first))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
for($i = 0; $i < pg_num_rows($result); $i++) {
|
||||
$row = pg_fetch_assoc($result, $i);
|
||||
$this->objs[$i] = new User;
|
||||
$this->objs[$i]->populate($row);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+348
@@ -0,0 +1,348 @@
|
||||
<?php
|
||||
|
||||
namespace Kabano;
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage a wiki page object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
require_once($config['third_folder']."Md/MarkdownExtra.inc.php");
|
||||
require_once($config['includes_folder']."database.php");
|
||||
|
||||
class WikiPage
|
||||
{
|
||||
public $content_id = NULL;
|
||||
public $locale_id = NULL;
|
||||
public $version_id = NULL;
|
||||
public $permalink = NULL;
|
||||
public $version = 0;
|
||||
public $locale = NULL;
|
||||
public $creation_date = NULL;
|
||||
public $update_date = NULL;
|
||||
public $author = NULL;
|
||||
public $is_public = NULL;
|
||||
public $is_archive = NULL;
|
||||
public $is_commentable = NULL;
|
||||
public $type = "wiki";
|
||||
public $name = NULL;
|
||||
public $content = NULL;
|
||||
|
||||
public $content_html;
|
||||
|
||||
private function decodeJsonText($value) {
|
||||
if ($value === null || $value === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$decoded = json_decode($value, true);
|
||||
if (!is_array($decoded)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return isset($decoded['text']) ? $decoded['text'] : '';
|
||||
}
|
||||
|
||||
/*****
|
||||
** Checks if a page at this permalink exists and return the populated element
|
||||
*****/
|
||||
public function checkPermalink($permalink, $withArchive=0, $elementNb=0) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='wiki'";
|
||||
if($withArchive==0) {
|
||||
$query .= " AND is_archive=FALSE AND is_public=TRUE";
|
||||
}
|
||||
$query .= " ORDER BY update_date DESC LIMIT 1 OFFSET $2";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($permalink, $elementNb))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
if(pg_num_rows($result) == 1) {
|
||||
$row = pg_fetch_assoc($result);
|
||||
$this->populate($row);
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Populate the object using raw data from SQL
|
||||
*****/
|
||||
public function populate($row) {
|
||||
if (!is_array($row)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$decodedContent = null;
|
||||
if (array_key_exists('content', $row)) {
|
||||
$decodedContent = $this->decodeJsonText($row['content']);
|
||||
}
|
||||
|
||||
if (array_key_exists('content_id', $row)) {
|
||||
$this->content_id = $row['content_id'];
|
||||
}
|
||||
if (array_key_exists('locale_id', $row)) {
|
||||
$this->locale_id = $row['locale_id'];
|
||||
}
|
||||
if (array_key_exists('version_id', $row)) {
|
||||
$this->version_id = $row['version_id'];
|
||||
}
|
||||
if (array_key_exists('permalink', $row)) {
|
||||
$this->permalink = $row['permalink'];
|
||||
}
|
||||
if (array_key_exists('version', $row)) {
|
||||
$this->version = $row['version'];
|
||||
}
|
||||
if (array_key_exists('locale', $row)) {
|
||||
$this->locale = $row['locale'];
|
||||
}
|
||||
if (array_key_exists('creation_date', $row)) {
|
||||
$this->creation_date = $row['creation_date'];
|
||||
}
|
||||
if (array_key_exists('update_date', $row)) {
|
||||
$this->update_date = $row['update_date'];
|
||||
}
|
||||
if (array_key_exists('author', $row)) {
|
||||
$this->author = $row['author'];
|
||||
}
|
||||
if (array_key_exists('is_public', $row)) {
|
||||
$this->is_public = $row['is_public'];
|
||||
}
|
||||
if (array_key_exists('is_archive', $row)) {
|
||||
$this->is_archive = $row['is_archive'];
|
||||
}
|
||||
if (array_key_exists('is_commentable', $row)) {
|
||||
$this->is_commentable = $row['is_commentable'];
|
||||
}
|
||||
if (array_key_exists('type', $row)) {
|
||||
$this->type = $row['type'];
|
||||
}
|
||||
if (array_key_exists('name', $row)) {
|
||||
$this->name = $row['name'];
|
||||
}
|
||||
if ($decodedContent !== null) {
|
||||
$this->content = $decodedContent;
|
||||
}
|
||||
}
|
||||
|
||||
/*****
|
||||
** Edit a page by archiving the current one and inserting a new one ID
|
||||
*****/
|
||||
public function update() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
if($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0)
|
||||
die("Cannot update entry without giving ID");
|
||||
|
||||
$this->version++;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
pg_query($con, "BEGIN");
|
||||
|
||||
$query = "UPDATE content_versions SET is_archive = TRUE WHERE locale_id = $1";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->locale_id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$query = "INSERT INTO content_versions (version, update_date, is_archive, name, content, locale_id) VALUES
|
||||
($1, $2, FALSE, $3, $4, $5) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare2", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
|
||||
$jsonContent = json_encode(['text' => $this->content]);
|
||||
$result = pg_execute($con, "prepare2", array($this->version, date('r'), $this->name, $jsonContent, $this->locale_id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->version_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_contributors (content, contributor) VALUES
|
||||
($1, $2) ON CONFLICT (content, contributor) DO NOTHING";
|
||||
|
||||
pg_prepare($con, "prepare3", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare3", array($this->locale_id, $user->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_query($con, "COMMIT");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tUPDATE \tEdit wiki page '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'wiki.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Delete a page by archiving it
|
||||
*****/
|
||||
public function delete() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE contents SET is_public=FALSE WHERE permalink=$1 AND type='wiki'";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->permalink))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tDELETE \tUnpublish wiki page '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'wiki.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Restore a page from unpublishing it
|
||||
*****/
|
||||
public function restore() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "UPDATE contents SET is_public=TRUE WHERE permalink=$1 AND type='wiki'";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->permalink))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tRESTORE \tPublish wiki page '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'wiki.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Create a new page, fails if permalink already exists
|
||||
*****/
|
||||
public function insert() {
|
||||
global $config;
|
||||
global $user;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
pg_query($con, "BEGIN");
|
||||
|
||||
$query = "INSERT INTO contents (permalink, creation_date, is_public, is_commentable, type) VALUES
|
||||
($1, $2, TRUE, FALSE, 'wiki') RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($this->permalink, date('r')))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->content_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_locales (content_id, locale, author) VALUES
|
||||
($1, $2, $3) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare2", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare2", array($this->content_id, $this->locale, $user->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->locale_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_versions (version, update_date, is_archive, name, content, locale_id) VALUES
|
||||
('0', $1, FALSE, $2, $3, $4) RETURNING id";
|
||||
|
||||
pg_prepare($con, "prepare3", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
|
||||
$jsonContent = json_encode(['text' => $this->content]);
|
||||
$result = pg_execute($con, "prepare3", array(date('r'), $this->name, $jsonContent, $this->locale_id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
$this->version_id = pg_fetch_assoc($result)['id'];
|
||||
|
||||
$query = "INSERT INTO content_contributors (content, contributor) VALUES
|
||||
($1, $2)";
|
||||
|
||||
pg_prepare($con, "prepare4", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare4", array($this->locale_id, $user->id))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_query($con, "COMMIT");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
error_log(
|
||||
date('r')." \t".$user->name." (".$user->id.") \tINSERT \tCreate new wiki page '".$this->permalink."'\r\n",
|
||||
3,
|
||||
$config['logs_folder'].'wiki.log');
|
||||
}
|
||||
|
||||
/*****
|
||||
** Converts the Markdown content to HTML
|
||||
*****/
|
||||
public function md2html() {
|
||||
$this->content_html = \Michelf\MarkdownExtra::defaultTransform($this->content);
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************
|
||||
***********************************************************
|
||||
**
|
||||
** This class is to manage a wiki page object
|
||||
**
|
||||
***********************************************************
|
||||
**********************************************************/
|
||||
|
||||
class WikiPages
|
||||
{
|
||||
public $objs = array();
|
||||
public $number = NULL;
|
||||
|
||||
/*****
|
||||
** Checks if a page at this URL exists and return the ID
|
||||
*****/
|
||||
public function getHistory($url) {
|
||||
global $config;
|
||||
|
||||
$con = sql_connect();
|
||||
|
||||
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='wiki' ORDER BY update_date DESC";
|
||||
|
||||
pg_prepare($con, "prepare1", $query)
|
||||
or die ("Cannot prepare statement\n");
|
||||
$result = pg_execute($con, "prepare1", array($url))
|
||||
or die ("Cannot execute statement\n");
|
||||
|
||||
pg_close($con);
|
||||
|
||||
$this->number = pg_num_rows($result);
|
||||
|
||||
for($i = 0; $i < $this->number; $i++) {
|
||||
$row = pg_fetch_assoc($result, $i);
|
||||
$this->objs[$i] = new WikiPage;
|
||||
$this->objs[$i]->populate($row);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user