commit dcdb22a2e7a114c0ad5bb4e32720176eabfa777e
parent 21d761f1d1a7f22907a1a4631a51d24aeb96d4af
Author: Jan Dankert <develop@jandankert.de>
Date: Tue, 9 Nov 2021 00:35:42 +0100
Fixes: Reading and writing template sources with the new content table.
Diffstat:
10 files changed, 772 insertions(+), 480 deletions(-)
diff --git a/dev-helper/docker/openrat-dev/config-dev.yml b/dev-helper/docker/openrat-dev/config-dev.yml
@@ -12,7 +12,7 @@ database:
user : ${env:DB_USER}
password : ${env:DB_PASS}
base64 : true # store binary as BASE64 (should be true for postgresql)
- prefix : cms_
+ prefix : cms_pro1_
suffix : _or
log:
file : ""
@@ -21,6 +21,13 @@ log:
production: ${env:CMS_PRODUCTION}
+mail:
+ client: smtp
+ smtp:
+ relay:
+ host: mail.weiherhei.de
+ hostname: "cms.docker.spencer"
+
publish:
filesystem:
directory: /var/www/localhost/public
diff --git a/modules/cms/action/PageelementAction.class.php b/modules/cms/action/PageelementAction.class.php
@@ -358,14 +358,10 @@ class PageelementAction extends BaseAction
$value->page = new Page( $value->objectid );
$value->page->load();
-
// Inhalt sofort freigegeben, wenn
// - Recht vorhanden
// - Freigabe gewuenscht
- if ( $value->page->hasRight( Permission::ACL_RELEASE ) && $this->request->has('release') )
- $value->publish = true;
- else
- $value->publish = false;
+ $value->publish = $value->page->hasRight( Permission::ACL_RELEASE ) && $this->request->has('release') );
// Up-To-Date-Check
$lastChangeTime = $value->getLastChangeSinceByAnotherUser( $this->request->getText('value_time'), Session::getUser()->userid );
@@ -382,13 +378,13 @@ class PageelementAction extends BaseAction
foreach( $project->getLanguageIds() as $languageid )
{
$value->languageid = $languageid;
- $value->add();
+ $value->persist();
}
}
else
{
// sonst nur 1x speichern (fuer die aktuelle Sprache)
- $value->add();
+ $value->persist();
}
$this->addNoticeFor( $this->pageelement, Messages::SAVED);
diff --git a/modules/cms/action/pageelement/PageelementHistoryAction.class.php b/modules/cms/action/pageelement/PageelementHistoryAction.class.php
@@ -2,7 +2,9 @@
namespace cms\action\pageelement;
use cms\action\Method;
use cms\action\PageelementAction;
+use cms\model\Content;
use cms\model\Element;
+use cms\model\PageContent;
use cms\model\Value;
class PageelementHistoryAction extends PageelementAction implements Method {
@@ -10,6 +12,14 @@ class PageelementHistoryAction extends PageelementAction implements Method {
$this->page->load();
+
+ $pageContent = new PageContent();
+ $pageContent->languageid = $this->page->languageid;
+ $pageContent->elementId = &$this->element->elementid;
+ $pageContent->pageId = $this->page->pageid;
+ $pageContent->load();
+ $this->value->contentid = $pageContent->contentId;
+
$this->value->objectid = $this->page->objectid;
$this->value->pageid = $this->page->pageid;
$this->value->page = $this->page;
@@ -31,7 +41,12 @@ class PageelementHistoryAction extends PageelementAction implements Method {
$value->languageid = $languageId;
/** @var Value $value */
- foreach($value->getVersionList() as $value) {
+ $content = new Content( $this->value->contentid );
+
+ foreach($content->getVersionList() as $valueId) {
+
+ $value = new Value();
+ $value->loadWithId( $valueId );
$language['values'][] = [
'text' => $this->calculateValue( $value ),
diff --git a/modules/cms/action/pageelement/PageelementValueAction.class.php b/modules/cms/action/pageelement/PageelementValueAction.class.php
@@ -2,6 +2,7 @@
namespace cms\action\pageelement;
use cms\action\Method;
use cms\action\PageelementAction;
+use cms\model\PageContent;
use cms\model\Permission;
use cms\model\Page;
@@ -13,6 +14,14 @@ class PageelementValueAction extends PageelementAction implements Method {
}
public function view() {
+
+ $pageContent = new PageContent();
+ $pageContent->languageid = $this->page->languageid;
+ $pageContent->elementId = &$this->element->elementid;
+ $pageContent->pageId = $this->page->pageid;
+ $pageContent->load();
+ $this->value->contentid = $pageContent->contentId;
+
$this->value->languageid = $this->page->languageid;
$this->value->objectid = $this->page->objectid;
$this->value->pageid = $this->page->pageid;
diff --git a/modules/cms/base/DefaultConfig.class.php b/modules/cms/base/DefaultConfig.class.php
@@ -39,25 +39,6 @@ class DefaultConfig {
'auto_reload' => true,
'session_destroy_on_config_reload' => true,
],
- 'content' =>
- [
- 'file' =>
- [
- 'max_file_size' => '1500',
- ],
- 'revision-limit' =>
- [
- 'enabled' => false,
- 'max-age' => 120,
- 'min-age' => 1,
- 'max-revisions' => 100,
- 'min-revisions' => 3,
- ],
- 'language' =>
- [
- 'use_default_language' => true,
- ],
- ],
'countries' =>
[
'AA' => 'Afar',
diff --git a/modules/cms/generator/ValueGenerator.class.php b/modules/cms/generator/ValueGenerator.class.php
@@ -59,8 +59,7 @@ class ValueGenerator extends BaseGenerator
/**
- * Hier findet die eigentliche Bereitstellung des Inhaltes statt, zu
- * jedem Elementtyp wird ein Inhalt ermittelt.
+ * Generating a page value.
*
* @return string
*/
diff --git a/modules/cms/model/Content.class.php b/modules/cms/model/Content.class.php
@@ -0,0 +1,458 @@
+<?php
+namespace cms\model;
+use cms\base\Configuration;
+use cms\base\DB;
+use cms\base\Startup;
+use util\ArrayUtils;
+use cms\generator\Publish;
+use cms\macros\MacroRunner;
+use \util\exception\ObjectNotFoundException;
+use logger\Logger;
+use util\exception\GeneratorException;
+use util\Text;
+use util\Html;
+use util\Http;
+use util\Transformer;
+use util\Code;
+use util\cache\FileCache;
+
+// OpenRat Content Management System
+// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+
+/**
+ * Darstellen einer Inhaltes
+ *
+ * @version $Revision$
+ * @author $Author$
+ * @package openrat.objects
+ */
+
+class Content extends ModelBase
+{
+ /**
+ * Content ID.
+ * @type Integer
+ */
+ private $id;
+
+ /**
+ * Seiten-Objekt der ?bergeordneten Seite
+ * @type Page
+ */
+ var $page;
+
+ /**
+ * Seiten-Id der uebergeordneten Seite
+ * @type Integer
+ */
+ var $pageid;
+
+ /**
+ * Objekt-ID, auf die verlinkt wird
+ * @type Integer
+ */
+ var $linkToObjectId=0;
+
+ /**
+ * Text-Inhalt
+ * @type String
+ */
+ var $text='';
+
+ /**
+ * Zahl. Auch Flie?kommazahlen werden als Ganzzahl gespeichert
+ * @type Integer
+ */
+ var $number=0;
+
+
+ /**
+ * Datum als Unix-Timestamp
+ * @type Integer
+ */
+ var $date=0;
+
+ /**
+ * Element-Objekt
+ * @type Element
+ */
+ var $element;
+
+ /**
+ * Element-Id
+ * @type Integer
+ */
+ var $elementid;
+
+ /**
+ * Der eigentliche Inhalt des Elementes
+ * @type String
+ */
+ var $value;
+
+ /**
+ * TimeStamp der letzten Aenderung
+ * @type Integer
+ */
+ var $lastchangeTimeStamp;
+
+ /**
+ * Benutzer-ID der letzten Aenderung
+ * @type Integer
+ */
+ var $lastchangeUserId;
+
+ /**
+ * Benutzername der letzten Aenderung
+ * @type Integer
+ */
+ var $lastchangeUserName;
+
+ /**
+ * Active content.
+ *
+ * Do NOT set this attribute, it should be used readonly.
+ *
+ * @type bool
+ */
+ public $active;
+
+ /**
+ * @type Publish
+ */
+ public $publisher;
+
+ /**
+ * @type boolean
+ */
+ var $publish = false;
+
+ /**
+ * @type Boolean
+ * @deprecated
+ */
+ public $simple;
+
+
+ /**
+ * Sprach-Id.
+ * @var int
+ */
+ public $languageid;
+
+ /**
+ * Format
+ *
+ * @var int
+ */
+ public $format = null;
+
+ /**
+ * constructor
+ */
+ function __construct( $id = null )
+ {
+ $this->id = $id;
+ }
+
+
+ public function load()
+ {
+ // TODO: Implement load() method.
+ }
+
+ /**
+ * Gets the IDs of all versions of this content.
+ * @return array
+ */
+ function getVersionList()
+ {
+ $stmt = DB::sql( <<<SQL
+ SELECT {{value}}.id
+ FROM {{value}}
+ WHERE contentid ={contentid}
+ ORDER BY lastchange_date
+SQL
+ );
+ $stmt->setInt( 'contentid' ,$this->id );
+
+ return $stmt->getCol();
+ }
+
+
+ /**
+ * returns the count of all versions.
+ * @return integer
+ */
+ function getCountVersions()
+ {
+ $sql = DB::sql( <<<SQL
+ SELECT COUNT(*) FROM {{value}}
+ WHERE contentid ={contentid}
+SQL
+ );
+ $sql->setInt( 'contentid' ,$this->id );
+
+ return $sql->getOne();
+ }
+
+
+ /**
+ * @return String|null
+ */
+ public function getLastChangeTime()
+ {
+ $sql = DB::sql( <<<SQL
+ SELECT lastchange_date FROM {{value}}
+ WHERE contentid ={contentid}
+ ORDER BY id DESC
+SQL
+ );
+ $sql->setInt( 'contentid' ,$this->id );
+
+ return $sql->getOne();
+ }
+
+
+ /**
+ * Gets the last change date by another user since a specific date.
+ * @param $date
+ * @param $userid
+ * @return String
+ */
+ public function getLastChangeSinceByAnotherUser( $date, $userid )
+ {
+ $sql = Db::sql( <<<SQL
+ SELECT lastchange_date
+ FROM {{value}}
+ WHERE contentid = {contentid}
+ AND lastchange_date > {date}
+ AND lastchange_userid != {userid}
+ ORDER BY id DESC
+SQL
+ );
+ $sql->setInt( 'contentid' ,$this->id );
+ $sql->setInt( 'date' ,$date );
+ $sql->setInt( 'userid' ,$userid );
+
+ return $sql->getOne();
+ }
+
+
+
+ /**
+ * Inhalt freigeben
+ */
+ function release()
+ {
+ $sql = DB::sql( <<<SQL
+ UPDATE {{value}}
+ SET publish = 0
+ WHERE contentid = {contentid}
+SQL
+ );
+ $sql->setInt( 'contentid' ,$this->id );
+
+ $sql->execute();
+
+ $sql = Db::sql( <<<SQL
+ UPDATE {{value}}
+ SET publish = 1
+ WHERE active = 1
+ AND contentid = {contentid}
+SQL
+ );
+ $sql->setInt( 'contentid' ,$this->id );
+
+ $sql->execute();
+ }
+
+
+ /**
+ * No function, values are NOT updated, values are only added.
+ * @return name|void
+ */
+ protected function save()
+ {
+ // not implemented, values are only added ("copy on write")
+ }
+
+
+ protected function add()
+ {
+ // Naechste ID aus Datenbank besorgen
+ $stmt = DB::sql('SELECT MAX(id) FROM {{content}}');
+ $this->id = intval($stmt->getOne())+1;
+
+ $stmt = DB::sql( <<<SQL
+INSERT INTO {{content}}
+ (id )
+ VALUES ({contentid})
+SQL
+ );
+ $stmt->setInt( 'contentid' ,$this->id );
+ $stmt->execute();
+ }
+
+
+ /**
+ * Delete this content.
+ *
+ * If a object (page, file, ...) is deleted, then all referenced contents must be deleted too.
+ */
+ public function delete()
+ {
+ // Delete all values
+ $stmt = DB::sql( <<<SQL
+ DELETE * FROM {{value}}
+ WHERE contentid = {contentid}
+SQL
+ );
+ $stmt->setInt( 'contentid' ,$this->id );
+ $stmt->execute();
+
+ // Delete the content
+ $stmt = DB::sql( <<<SQL
+ DELETE * FROM {{content}}
+ WHERE contentid = {contentid}
+SQL
+ );
+ $stmt->setInt( 'contentid' ,$this->id );
+ $stmt->execute();
+ }
+
+
+
+ /**
+ * Es werden Objekte mit einem Inhalt gesucht.
+ * @param String Suchbegriff
+ * @return array Liste der gefundenen Objekt-IDs
+ */
+ function getObjectIdsByValue( $text )
+ {
+ $sql = DB::sql( <<<SQL
+ SELECT {{object}}.id FROM {{value}}
+ LEFT JOIN {{page}}
+ ON {{page}}.id={{value}}.pageid
+ LEFT JOIN {{object}}
+ ON {{object}}.id={{page}}.objectid
+ WHERE {{value}}.text LIKE {text}
+ ORDER BY {{object}}.lastchange_date DESC
+SQL
+ );
+
+ $sql->setString( 'text' ,'%'.$text.'%' );
+
+ return $sql->getCol();
+ }
+
+
+ /**
+ * Es werden Objekte mit einer UserId ermittelt
+ * @param Integer Benutzer-Id der letzten ?nderung
+ * @return array Liste der gefundenen Objekt-IDs
+ */
+ function getObjectIdsByLastChangeUserId( $userid )
+ {
+ $sql = DB::sql( <<<SQL
+ SELECT {{object}}.id FROM {{value}}
+ LEFT JOIN {{page}}
+ ON {{page}}.id={{value}}.pageid
+ LEFT JOIN {{object}}
+ ON {{object}}.id={{page}}.objectid
+ WHERE {{value}}.lastchange_userid={userid}
+ ORDER BY {{object}}.lastchange_date DESC
+SQL
+ );
+ $sql->setInt ( 'userid' ,$userid );
+
+ return $sql->getCol();
+ }
+
+
+
+ /**
+ * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat.
+ *
+ * @return Integer Objekt-Id
+ */
+ public static function getLastChangedObjectByUserId( $userid )
+ {
+ $sql = DB::sql( <<<SQL
+SELECT {{object}}.id
+ FROM {{value}}
+ LEFT JOIN {{page}}
+ ON {{page}}.id={{value}}.pageid
+ LEFT JOIN {{object}}
+ ON {{object}}.id={{page}}.objectid
+ WHERE {{value}}.lastchange_userid={userid}
+ ORDER BY {{value}}.lastchange_date DESC
+SQL
+);
+ $sql->setInt ( 'userid' ,$userid );
+ return $sql->getOne();
+ }
+
+
+ /**
+ * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat.
+ *
+ * @return Integer Objekt-Id
+ */
+ public static function getLastChangedObjectInProjectByUserId( $projectid, $userid )
+ {
+ $sql = DB::sql( <<<SQL
+SELECT {{object}}.id
+ FROM {{value}}
+ LEFT JOIN {{page}}
+ ON {{page}}.id={{value}}.pageid
+ LEFT JOIN {{object}}
+ ON {{object}}.id={{page}}.objectid
+ WHERE {{value}}.lastchange_userid={userid}
+ AND {{object}}.projectid = {projectid}
+ ORDER BY {{value}}.lastchange_date DESC
+SQL
+);
+ $sql->setInt ( 'userid' ,$userid );
+ $sql->setInt ( 'projectid' ,$projectid );
+ return $sql->getOne();
+ }
+
+
+
+ public function getName()
+ {
+ return $this->id;
+ }
+
+
+ public function __toString()
+ {
+ return "Content: ".print_r($this,true);
+ }
+
+
+
+ public function getId()
+ {
+ return $this->id;
+ }
+
+
+}
+\ No newline at end of file
diff --git a/modules/cms/model/PageContent.class.php b/modules/cms/model/PageContent.class.php
@@ -0,0 +1,169 @@
+<?php
+namespace cms\model;
+use cms\base\Configuration;
+use cms\base\DB;
+use cms\base\Startup;
+use util\ArrayUtils;
+use cms\generator\Publish;
+use cms\macros\MacroRunner;
+use \util\exception\ObjectNotFoundException;
+use logger\Logger;
+use util\exception\GeneratorException;
+use util\Text;
+use util\Html;
+use util\Http;
+use util\Transformer;
+use util\Code;
+use util\cache\FileCache;
+
+
+
+/**
+ * PageContent.
+ *
+ * @author Jan Dankert
+ */
+
+class PageContent extends ModelBase
+{
+ /**
+ * ID.
+ * @var integer
+ */
+ private $id;
+
+ /**
+ * Content-ID.
+ *
+ * @type Integer
+ */
+ public $contentId = 0;
+
+ /**
+ * Element-Objekt
+ * @type integer
+ */
+ public $elementId;
+
+ /**
+ * Sprach-Id.
+ * @var int
+ */
+ public $languageid;
+
+ /**
+ * Page-Id
+ * @var integer
+ */
+ public $pageId;
+
+ /**
+ * Konstruktor
+ */
+ function __construct()
+ {
+ }
+
+
+
+ /**
+ * Laden des aktuellen Inhaltes aus der Datenbank
+ */
+ function load()
+ {
+ $stmt = Db::sql( <<<SQL
+ SELECT * FROM {{pagecontent}}
+ WHERE elementid ={elementid}
+ AND pageid ={pageid}
+ AND languageid={languageid}
+SQL
+ );
+ $stmt->setInt( 'elementid' ,$this->elementId );
+ $stmt->setInt( 'pageid' ,$this->pageId );
+ $stmt->setInt( 'languageid',$this->languageid);
+ $row = $stmt->getRow();
+
+ if ( count($row) > 0 ) // Wenn Inhalt gefunden
+ {
+ $this->contentId = intval($row['contentid']);
+ $this->id = intval($row['id' ]);
+ }
+ }
+
+
+
+ /**
+ * No function, values are NOT updated, values are only added.
+ * @return name|void
+ */
+ protected function save()
+ {
+ // not implemented, values are only added ("copy on write")
+ }
+
+ /**
+ * Add new object.
+ */
+ public function add()
+ {
+ // Get next ID from database.
+ $stmt = DB::sql('SELECT MAX(id) FROM {{pagecontent}}');
+ $this->id = intval($stmt->getOne())+1;
+
+ $content = new Content();
+ $content->persist();
+ $this->contentId = $content->getId();
+
+ $stmt = DB::sql( <<<SQL
+INSERT INTO {{pagecontent}}
+ (id ,contentid ,elementid ,pageid ,languageid )
+ VALUES ({valueid},{contentid},{elementid},{pageid},{languageid} )
+SQL
+ );
+ $stmt->setInt( 'valueid' ,$this->valueid );
+ $stmt->setInt( 'contentid' ,$this->contentId );
+ $stmt->setInt( 'elementid' ,$this->elementId );
+ $stmt->setInt( 'pageid' ,$this->pageid );
+ $stmt->setInt( 'languageid',$this->languageid );
+
+ $stmt->execute();
+ }
+
+
+
+ /**
+ * Diesen Inhalt loeschen
+ */
+ function delete()
+ {
+ $stmt = DB::sql( <<<SQL
+ DELETE * FROM {{pagecontent}}
+ WHERE id ={id}
+SQL
+ );
+ $stmt->setInt( 'id' ,$this->id );
+
+ $stmt->execute();
+ }
+
+
+ public function getName()
+ {
+ return "PageContent ".$this->id;
+ }
+
+
+ public function __toString()
+ {
+ return "PageContent: ".print_r($this,true);
+ }
+
+
+
+ public function getId()
+ {
+ return $this->id;
+ }
+
+
+}
+\ No newline at end of file
diff --git a/modules/cms/model/TemplateModel.class.php b/modules/cms/model/TemplateModel.class.php
@@ -33,6 +33,10 @@ class TemplateModel extends ModelBase
public $modelid;
public $templateid;
+ /**
+ * @var int
+ */
+ private $contentid;
/**
* TemplateModel constructor.
@@ -65,11 +69,12 @@ SQL
$stmt->setInt( 'modelid' ,$this->modelid );
$row = $stmt->getRow();
- if ( isset($row['id']) )
+ if ( $row )
{
$this->templatemodelid = $row['id' ];
$this->extension = $row['extension'];
$this->src = $row['text' ];
+ $this->contentid = $row['contentid'];
}
else
{
@@ -93,17 +98,23 @@ SQL
public function save()
{
// Vorlagen-Quelltext existiert für diese Varianten schon.
- $stmt = Db::sql( 'UPDATE {{templatemodel}}'.
- ' SET extension={extension},'.
- ' text={src} '.
- ' WHERE id={id}' );
+ $stmt = Db::sql( <<<SQL
+ UPDATE {{templatemodel}}
+ SET extension={extension}
+ WHERE id={id}
+SQL
+ );
$stmt->setInt ( 'id' ,$this->templatemodelid );
-
$stmt->setString( 'extension' ,$this->extension );
- $stmt->setString( 'src' ,$this->src );
$stmt->execute();
+
+ $value = new Value();
+ $value->contentid = $this->contentid;
+ $value->text = $this->src;
+ $value->publish = true;
+ $value->persist();
}
@@ -116,15 +127,19 @@ SQL
$stmt = Db::sql('SELECT MAX(id) FROM {{templatemodel}}');
$nextid = intval($stmt->getOne())+1;
+ $content = new Content();
+ $content->persist();
+ $this->contentid = $content->getId();
+
$stmt = Db::sql( 'INSERT INTO {{templatemodel}}'.
- ' (id,templateid,projectmodelid,extension,text) '.
- ' VALUES ({id},{templateid},{modelid},{extension},{src}) ');
+ ' (id,contentid,templateid,projectmodelid,extension) '.
+ ' VALUES ({id},{contentid},{templateid},{modelid},{extension}) ');
$stmt->setInt ( 'id',$nextid );
$stmt->setString( 'extension' ,$this->extension );
+ $stmt->setInt ( 'contentid' ,$this->contentid );
$stmt->setInt ( 'templateid' ,$this->templateid );
$stmt->setInt ( 'modelid' ,$this->modelid );
- $stmt->setString( 'src' ,$this->src );
$stmt->execute();
diff --git a/modules/cms/model/Value.class.php b/modules/cms/model/Value.class.php
@@ -16,31 +16,10 @@ use util\Transformer;
use util\Code;
use util\cache\FileCache;
-// OpenRat Content Management System
-// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-
-
/**
* Darstellen einer Inhaltes
*
- * @version $Revision$
- * @author $Author$
- * @package openrat.objects
+ * @author Jan Dankert
*/
class Value extends ModelBase
@@ -52,6 +31,12 @@ class Value extends ModelBase
var $valueid=0;
/**
+ * Content ID.
+ * @var int
+ */
+ public $contentid;
+
+ /**
* Seiten-Objekt der ?bergeordneten Seite
* @type Page
*/
@@ -165,72 +150,29 @@ class Value extends ModelBase
*/
function __construct()
{
- $this->lastchangeUserId = 0;
- $this->lastchangeTimeStamp = 0;
-
}
-
+
+
/**
* Laden des aktuellen Inhaltes aus der Datenbank
*/
- function loadForPublic()
+ public function loadPublished()
{
$stmt = Db::sql( <<<SQL
- SELECT {{value}}.* FROM {{pagecontent}}
- LEFT JOIN {{content}}
- ON {{pagecontent}}.contentid = {{content}}.id
- LEFT JOIN {{value}}
- ON {{value}}.contentid = {{content}}.id AND {{value}}.active = 1
- WHERE elementid = {elementid}
- AND pageid = {pageid}
- AND languageid = {languageid}
- AND {{value}}.publish = 1
+ SELECT * FROM {{value}}
+ WHERE contentid = {{contentid}}
+ AND publish = 1
SQL
);
- $stmt->setInt( 'elementid' ,$this->elementid );
- $stmt->setInt( 'pageid' ,$this->pageid );
- $stmt->setInt( 'languageid',$this->languageid);
- $row = $stmt->getRow();
-
- if ( count($row) > 0 ) // Wenn Inhalt gefunden
- {
- $this->text = $row['text' ];
- $this->format = $row['format'];
- $this->valueid = intval($row['id'] );
- $this->linkToObjectId = intval($row['linkobjectid']);
- $this->number = intval($row['number' ]);
- $this->date = intval($row['date' ]);
-
- $this->active = ( $row['active' ]=='1' );
- $this->publish = ( $row['publish']=='1' );
-
- $this->lastchangeTimeStamp = intval($row['lastchange_date' ]);
- $this->lastchangeUserId = intval($row['lastchange_userid']);
- }
+ $stmt->setInt( 'contentid' ,$this->contentid);
+
+ $this->bindRow( $stmt->getRow() );
}
- /**
- * Laden des aktuellen Inhaltes aus der Datenbank
- */
- function load()
- {
- $stmt = Db::sql( <<<SQL
- SELECT {{value}}.* FROM {{pagecontent}}
- LEFT JOIN {{content}}
- ON {{pagecontent}}.contentid = {{content}}.id
- LEFT JOIN {{value}}
- ON {{value}}.contentid = {{content}}.id AND {{value}}.active = 1
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
-SQL
- );
- $stmt->setInt( 'elementid' ,$this->elementid );
- $stmt->setInt( 'pageid' ,$this->pageid );
- $stmt->setInt( 'languageid',$this->languageid);
- $row = $stmt->getRow();
+
+ private function bindRow( $row ) {
if ( count($row) > 0 ) // Wenn Inhalt gefunden
{
@@ -251,238 +193,74 @@ SQL
/**
- * Laden eines bestimmten Inhaltes aus der Datenbank
- */
- function loadWithId( $valueid = null )
- {
- if ( $valueid )
- $this->valueid = $valueid;
-
- $sql = DB::sql( <<<SQL
- SELECT {{value}}.*,{{user}}.name as lastchange_username
- FROM {{value}}
- LEFT JOIN {{user}} ON {{user}}.id={{value}}.lastchange_userid
- WHERE {{value}}.id={valueid}
-SQL
- );
- $sql->setInt( 'valueid',$this->valueid);
- $row = $sql->getRow();
-
- $this->text = $row['text' ];
- $this->format = $row['format' ];
- $this->pageid = intval($row['pageid' ]);
- $this->elementid = intval($row['elementid' ]);
- $this->languageid = intval($row['languageid' ]);
- $this->valueid = intval($row['id' ]);
- $this->linkToObjectId = intval($row['linkobjectid']);
- $this->number = intval($row['number' ]);
- $this->date = intval($row['date' ]);
-
- $this->active = ( $row['active' ]=='1' );
- $this->publish = ( $row['publish']=='1' );
-
- $this->lastchangeTimeStamp = intval($row['lastchange_date' ]);
- $this->lastchangeUserId = intval($row['lastchange_userid' ]);
- $this->lastchangeUserName = $row['lastchange_username'];
- }
-
-
- /**
- * Alle Versionen des aktuellen Inhaltes werden ermittelt
- * @return array
- */
- function getVersionList()
- {
- $stmt = DB::sql( <<<SQL
- SELECT {{value}}.*,{{user}}.name as lastchange_username
- FROM {{value}}
- LEFT JOIN {{user}} ON {{user}}.id={{value}}.lastchange_userid
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
- ORDER BY lastchange_date
-SQL
- );
- $stmt->setInt( 'elementid' ,$this->element->elementid );
- $stmt->setInt( 'pageid' ,$this->pageid );
- $stmt->setInt( 'languageid',$this->languageid);
-
- $list = array();
- foreach($stmt->getAll() as $row )
- {
- $val = new Value();
- $val->valueid = $row['id'];
-
- $val->text = $row['text'];
- $val->format = $row['format'];
- $val->valueid = intval($row['id'] );
- $val->linkToObjectId = intval($row['linkobjectid']);
- $val->number = intval($row['number' ]);
- $val->date = intval($row['date' ]);
- $val->element = $this->element;
- $val->elementid = $this->elementid;
- $val->languageid = $this->languageid;
-
- $val->active = ( $row['active' ]=='1' );
- $val->publish = ( $row['publish']=='1' );
-
- $val->lastchangeTimeStamp = intval($row['lastchange_date' ]);
- $val->lastchangeUserId = intval($row['lastchange_userid' ]);
- $val->lastchangeUserName = $row['lastchange_username'];
-
- $list[] = $val;
- }
- return $list;
- }
-
-
- /**
- * Die Anzahl der Versionen des aktuellen Inhaltes wird ermittelt
- * @return array
+ * Loading the last value from the database.
*/
- function getCountVersions()
- {
- $sql = DB::sql( <<<SQL
-SELECT COUNT(*) FROM {{value}}
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
-SQL
- );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
-
- return $sql->getOne();
- }
-
-
- function getLastChangeTime()
+ public function load()
{
- $sql = DB::sql( <<<SQL
- SELECT lastchange_date FROM {{value}}
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
- ORDER BY id DESC
+ $stmt = Db::sql( <<<SQL
+ SELECT * FROM {{value}}
+ WHERE contentid = {contentid}
+ AND {{value}}.active = 1
SQL
);
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
+ $stmt->setInt( 'contentid' ,$this->contentid);
- return $sql->getOne();
+ $this->bindRow( $stmt->getRow() );
}
/**
- * Gets the last change date by another user since a specific date.
- * @param $date
- * @param $userid
- * @return String
+ * Laden eines bestimmten Inhaltes aus der Datenbank
*/
- public function getLastChangeSinceByAnotherUser( $date, $userid )
+ function loadWithId( $valueid = null )
{
- $sql = Db::sql( <<<SQL
- SELECT lastchange_date FROM {{value}}
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
- AND lastchange_date > {date}
- AND lastchange_userid != {userid}
- ORDER BY id DESC
+ $stmt = Db::sql( <<<SQL
+ SELECT * FROM {{value}}
+ WHERE id = {{valueid}}
SQL
);
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
- $sql->setInt( 'date' ,$date );
- $sql->setInt( 'userid' ,$userid);
+ $stmt->setInt( 'valueid' ,$valueid );
- return $sql->getOne();
+ $this->bindRow( $stmt->getRow() );
}
-
/**
- * Inhalt freigeben
+ * @see #save()
*/
- function release()
+ protected function add()
{
- $sql = DB::sql( <<<SQL
- UPDATE {{value}}
- SET publish = 0
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
-SQL
- );
- $sql->setInt( 'elementid' ,$this->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
-
- $sql->execute();
-
- $sql = Db::sql( <<<SQL
- UPDATE {{value}}
- SET publish = 1
- WHERE active = 1
- AND elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
-SQL
- );
- $sql->setInt( 'elementid' ,$this->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
-
- $sql->execute();
+ // this is implemented in the save() method.
}
/**
- * No function, values are NOT updated, values are only added.
- * @return name|void
+ * Saving the value.
+ * A value is always added, never overwritten. So we are doing an INSERT here.
*/
protected function save()
{
- // not implemented, values are only added ("copy on write")
- }
-
- /**
- * Inhalt speichern
- */
- public function add()
- {
$stmt = Db::sql( <<<SQL
UPDATE {{value}}
SET active=0
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
+ WHERE contentid = {contentid}
SQL
);
- $stmt->setInt( 'elementid' ,$this->element->elementid );
- $stmt->setInt( 'pageid' ,$this->pageid );
- $stmt->setInt( 'languageid',$this->languageid);
+ $stmt->setInt( 'contentid' ,$this->contentid );
$stmt->execute();
if ( $this->publish )
{
// Wenn Inhalt sofort veroeffentlicht werden kann, dann
- // alle anderen Inhalte auf nicht-veroeffentlichen stellen
+ // alle anderen Inhalte auf nicht-veroeffentlichen stellen
$stmt = DB::sql( <<<SQL
UPDATE {{value}}
SET publish=0
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
+ WHERE contentid = {contentid}
SQL
);
- $stmt->setInt( 'elementid' ,$this->element->elementid );
- $stmt->setInt( 'pageid' ,$this->pageid );
- $stmt->setInt( 'languageid',$this->languageid);
+ $stmt->setInt( 'contentid' ,$this->contentid );
$stmt->execute();
}
@@ -493,15 +271,13 @@ SQL
$stmt = DB::sql( <<<SQL
INSERT INTO {{value}}
- (id ,linkobjectid ,text ,number ,date ,elementid ,format ,pageid ,languageid ,active,publish ,lastchange_date ,lastchange_userid )
- VALUES ({valueid},{linkobjectid},{text},{number},{date},{elementid},{format},{pageid},{languageid},1 ,{publish},{lastchange_date},{lastchange_userid})
+ (id ,contentid ,linkobjectid ,text ,number ,date ,format ,active,publish ,lastchange_date ,lastchange_userid )
+ VALUES ({valueid},{contentid},{linkobjectid},{text},{number},{date},{format},1 ,{publish},{lastchange_date},{lastchange_userid})
SQL
);
$stmt->setInt( 'valueid' ,$this->valueid );
+ $stmt->setInt( 'contentid' ,$this->contentid );
$stmt->setInt( 'format' ,$this->format );
- $stmt->setInt( 'elementid' ,$this->element->elementid );
- $stmt->setInt( 'pageid' ,$this->pageid );
- $stmt->setInt( 'languageid',$this->languageid );
if ( intval($this->linkToObjectId)==0)
$stmt->setNull ( 'linkobjectid' );
@@ -525,204 +301,69 @@ SQL
$stmt->setInt ( 'lastchange_userid',$user->userid );
$stmt->execute();
-
- // Nur ausfuehren, wenn in Konfiguration aktiviert.
- $limit = Configuration::subset(['content','revision-limit'] );
- if ( $limit->is('enabled',false) )
- $this->checkLimit();
+
+ $this->pruneVersions();
}
-
+
+ // Some default values for pruning content
+ const DEFAULT_PRUNE_AFTER_AGE = 10 * 365 * 24 * 60 * 60; // prune after 10 years
+ const DEFAULT_PRUNE_AFTER_VERSIONS = 100; // prune after reaching 100 versions
+
/**
- * Pruefen, ob maximale Anzahl von Versionen erreicht.
- * In diesem Fall die zu alten Versionen l�schen.
+ * Automatic content pruning.
+ *
+ * Deletes old versions.
*/
- function checkLimit()
+ private function pruneVersions()
{
- $limitConfig = Configuration::subset(['content','revision-limit']);
+ $pruneConfig = Configuration::subset(['content','prune']);
+ if ( ! $pruneConfig->is('enabled',true) )
+ return; // no pruning.
+
+ // First Step: Reading all value id.
$sql = DB::sql( <<<SQL
SELECT id FROM {{value}}
- WHERE elementid = {elementid}
- AND pageid = {pageid}
- AND languageid = {languageid}
+ WHERE contentid = {contentid}
AND active = 0
AND publish = 0
ORDER BY id
SQL
);
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid );
+ $sql->setInt( 'contentid' ,$this->contentid );
$values = $sql->getCol();
-
- if ( count($values) > $limitConfig->get('min-revisions',3) )
- {
- $sql = DB::sql( <<<SQL
- DELETE FROM {{value}}
- WHERE elementid = {elementid}
- AND pageid = {pageid}
- AND languageid = {languageid}
- AND active = 0
- AND publish = 0
- AND lastchange_date < {min_date}
- AND id < {min_id}
-SQL
- );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid );
- $sql->setInt( 'min_date' ,$limitConfig['max-age']*24*60*60);
- $sql->setInt( 'min_id' ,$values[count($values)-$limitConfig['min-revisions']]);
- $sql->execute();
- }
-
- if ( count($values) > $limitConfig->get('max-revisions',100 ) )
- {
- $sql = Db::sql( <<<SQL
- DELETE FROM {{value}}
- WHERE elementid = {elementid}
- AND pageid = {pageid}
- AND languageid = {languageid}
- AND active = 0
- AND publish = 0
- AND lastchange_date < {min_date}
- AND id < {min_id}
-SQL
- );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid );
- $sql->setInt( 'min_date' ,$limitConfig['min-age']*24*60*60);
- $sql->setInt( 'min_id' ,$values[count($values)-$limitConfig['max-revisions']]);
- $sql->execute();
- }
- }
-
-
- /**
- * Diesen Inhalt loeschen
- */
- function delete()
- {
- $stmt = DB::sql( <<<SQL
- DELETE * FROM {{value}}
- WHERE elementid ={elementid}
- AND pageid ={pageid}
- AND languageid={languageid}
+ // Now deleting all outdated content.
+ $sql = DB::sql( <<<SQL
+ DELETE FROM {{value}}
+ WHERE contentid = {contentid}
+ AND active = 0
+ AND publish = 0
+ AND lastchange_date < {delete_before_date}
+ AND id < {delete_before_id}
SQL
);
- $stmt->setInt( 'elementid' ,$this->element->elementid );
- $stmt->setInt( 'pageid' ,$this->pageid );
- $stmt->setInt( 'languageid',$this->languageid);
-
- $stmt->execute();
+ $sql->setInt( 'contentid' ,$this->contentid );
+ $sql->setInt( 'delete_before_date' ,time() - $pruneConfig->getSeconds('age',self::DEFAULT_PRUNE_AFTER_AGE) );
+ $sql->setInt( 'delete_before_id' ,intval(@$values[count($values)-$pruneConfig->get('versions',self::DEFAULT_PRUNE_AFTER_VERSIONS)]) );
+ $sql->execute();
}
/**
- * Es werden Objekte mit einem Inhalt gesucht.
- * @param String Suchbegriff
- * @return array Liste der gefundenen Objekt-IDs
- */
- function getObjectIdsByValue( $text )
+ * Deleting (not possible).
+ */
+ function delete()
{
- $sql = DB::sql( <<<SQL
- SELECT {{object}}.id FROM {{value}}
- LEFT JOIN {{page}}
- ON {{page}}.id={{value}}.pageid
- LEFT JOIN {{object}}
- ON {{object}}.id={{page}}.objectid
- WHERE {{value}}.text LIKE {text}
- AND {{value}}.languageid={languageid}
- ORDER BY {{object}}.lastchange_date DESC
-SQL
- );
-
- $sql->setInt ( 'languageid',$this->languageid );
- $sql->setString( 'text' ,'%'.$text.'%' );
-
- return $sql->getCol();
+ // values cannot be deleted.
+ // only the whole content is able to be deleted, see class Content.
}
- /**
- * Es werden Objekte mit einer UserId ermittelt
- * @param Integer Benutzer-Id der letzten ?nderung
- * @return array Liste der gefundenen Objekt-IDs
- */
- function getObjectIdsByLastChangeUserId( $userid )
- {
- $sql = DB::sql( <<<SQL
- SELECT {{object}}.id FROM {{value}}
- LEFT JOIN {{page}}
- ON {{page}}.id={{value}}.pageid
- LEFT JOIN {{object}}
- ON {{object}}.id={{page}}.objectid
- WHERE {{value}}.lastchange_userid={userid}
- AND {{value}}.languageid={languageid}
- ORDER BY {{object}}.lastchange_date DESC
-SQL
- );
- $sql->setInt ( 'languageid',$this->languageid );
- $sql->setInt ( 'userid' ,$userid );
-
- return $sql->getCol();
- }
-
-
/**
- * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat.
- *
- * @return Integer Objekt-Id
- */
- public static function getLastChangedObjectByUserId( $userid )
- {
- $sql = DB::sql( <<<SQL
-SELECT {{object}}.id
- FROM {{value}}
- LEFT JOIN {{page}}
- ON {{page}}.id={{value}}.pageid
- LEFT JOIN {{object}}
- ON {{object}}.id={{page}}.objectid
- WHERE {{value}}.lastchange_userid={userid}
- ORDER BY {{value}}.lastchange_date DESC
-SQL
-);
- $sql->setInt ( 'userid' ,$userid );
- return $sql->getOne();
- }
-
-
- /**
- * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat.
- *
- * @return Integer Objekt-Id
- */
- public static function getLastChangedObjectInProjectByUserId( $projectid, $userid )
- {
- $sql = DB::sql( <<<SQL
-SELECT {{object}}.id
- FROM {{value}}
- LEFT JOIN {{page}}
- ON {{page}}.id={{value}}.pageid
- LEFT JOIN {{object}}
- ON {{object}}.id={{page}}.objectid
- WHERE {{value}}.lastchange_userid={userid}
- AND {{object}}.projectid = {projectid}
- ORDER BY {{value}}.lastchange_date DESC
-SQL
-);
- $sql->setInt ( 'userid' ,$userid );
- $sql->setInt ( 'projectid' ,$projectid );
- return $sql->getOne();
- }
-
-
- /**
* Ermittelt den unbearbeiteten, "rohen" Inhalt.
*
* @return mixed Inhalt