openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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:
Mdev-helper/docker/openrat-dev/config-dev.yml | 9++++++++-
Mmodules/cms/action/PageelementAction.class.php | 10+++-------
Mmodules/cms/action/pageelement/PageelementHistoryAction.class.php | 17++++++++++++++++-
Mmodules/cms/action/pageelement/PageelementValueAction.class.php | 9+++++++++
Mmodules/cms/base/DefaultConfig.class.php | 19-------------------
Mmodules/cms/generator/ValueGenerator.class.php | 3+--
Amodules/cms/model/Content.class.php | 459+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/model/PageContent.class.php | 170+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmodules/cms/model/TemplateModel.class.php | 35+++++++++++++++++++++++++----------
Mmodules/cms/model/Value.class.php | 521+++++++++++++------------------------------------------------------------------
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