Rename MVC folders for consistency

Co-authored-by: LeOSW42 <673670+LeOSW42@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]andLeOSW42 committed 2026-01-24 14:29:09 +00:00
1 parent fd84530759
commit 10aa54fd57
15 files changed
+4 -2

No files matched your search

+415
View File
@@ -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);
}
}
}
+226
View File
@@ -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);
}
}
}
+106
View File
@@ -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);
}
}
}
+515
View File
@@ -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);
}
}
}
+474
View File
@@ -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);
}
}
}
+348
View File
@@ -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);
}
}
}