openrat-cms

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

commit fa326848f98ca08cf5f69025cf8937cac016adcc
parent d24391bf3fa8a36d61d9712f38bbc27c4083d35e
Author: Jan Dankert <devnull@localhost>
Date:   Sat,  4 Aug 2018 01:57:04 +0200

Neue Datenbankspalten für lokale Einstellungen pro Objekt und das Speichern von Elementen mit Ids und Flags (anstatt von Namen).

Diffstat:
modules/cms-core/action/ElementAction.class.php | 7+++----
modules/cms-core/action/TemplateAction.class.php | 40+++-------------------------------------
modules/cms-core/model/Element.class.php | 157++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
modules/cms-core/model/Template.class.php | 8+++++---
modules/cms-core/model/Value.class.php | 4++--
modules/database-update/DbUpdate.class.php | 2+-
modules/database-update/update/DBVersion000015.class.php | 24++++++++++++++++++++++++
modules/database-update/update/DBVersion000016.class.php | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 259 insertions(+), 105 deletions(-)

diff --git a/modules/cms-core/action/ElementAction.class.php b/modules/cms-core/action/ElementAction.class.php @@ -143,14 +143,13 @@ class ElementAction extends Action - public function advancedView - () + public function advancedView() { // Die verschiedenen Element-Typen $types = array(); - foreach( $this->element->getAvailableTypes() as $t ) - $types[ $t ] = 'EL_'.$t; + foreach( $this->element->getAvailableTypes() as $typeid=>$t ) + $types[ $typeid ] = 'EL_'.$t; // Code-Element nur fuer Administratoren (da voller Systemzugriff!) if ( !$this->userIsAdmin() ) diff --git a/modules/cms-core/action/TemplateAction.class.php b/modules/cms-core/action/TemplateAction.class.php @@ -215,14 +215,14 @@ class TemplateAction extends Action // Die verschiedenen Element-Typen $types = array(); - foreach( Element::getAvailableTypes() as $t ) + foreach( Element::getAvailableTypes() as $typeid => $t ) { - $types[ $t ] = 'EL_'.$t; + $types[ $typeid ] = 'EL_'.$t; } // Code-Element nur fuer Administratoren (da voller Systemzugriff!) if ( !$this->userIsAdmin() ) - unset( $types['code'] ); + unset( $types[ELEMENT_TYPE_CODE] ); $this->setTemplateVar('types',$types); } @@ -539,39 +539,5 @@ class TemplateAction extends Action } - - /** - * Stellt fest, welche Menüeinträge ggf. ausgeblendet werden. - * - * @see actionClasses/Action#checkMenu($name) - */ - function checkMenu( $menu ) { - switch( $menu) - { - case 'srcelement': - // Platzhalter nur hinzufuegbar, wenn es welche gibt. - return is_object($this->template) && - (count($this->template->getElementIds()) > 0); - - case 'remove': - // Entfernen von Templates nur dann erlaubt, wenn keine Seiten auf diesem Template basieren. - return is_object($this->template) && - (count($this->template->getDependentObjectIds()) == 0); - - case 'pages': - // Anzeige von Seiten nur dann sinnvoll, wenn es auch Seiten gibt. - return is_object($this->template) && - (count($this->template->getDependentObjectIds()) > 0); - - case 'add': - case 'addel': - return !readonly(); - - default: - return true; - - } - } - } \ No newline at end of file diff --git a/modules/cms-core/model/Element.class.php b/modules/cms-core/model/Element.class.php @@ -1,11 +1,36 @@ <?php namespace cms\model; +define('ELEMENT_TYPE_DATE' , 1); +define('ELEMENT_TYPE_NUMBER' , 2); +define('ELEMENT_TYPE_TEXT' , 3); +define('ELEMENT_TYPE_INFO' , 4); +define('ELEMENT_TYPE_INFODATE', 5); +define('ELEMENT_TYPE_LINK' , 6); +define('ELEMENT_TYPE_LONGTEXT', 7); +define('ELEMENT_TYPE_CODE' , 8); +define('ELEMENT_TYPE_DYNAMIC' , 9); +define('ELEMENT_TYPE_SELECT' ,10); +define('ELEMENT_TYPE_COPY' ,11); +define('ELEMENT_TYPE_LINKINFO',12); +define('ELEMENT_TYPE_LINKDATE',13); +define('ELEMENT_TYPE_INSERT' ,14); + +define('ELEMENT_FORMAT_TEXT' ,0); +define('ELEMENT_FORMAT_HTML' ,1); +define('ELEMENT_FORMAT_WIKI' ,2); +define('ELEMENT_FORMAT_MARKDOWN',3); + +define('ELEMENT_FLAG_HTML_ALLOWED' , 1); +define('ELEMENT_FLAG_ALL_LANGUAGES', 2); +define('ELEMENT_FLAG_WRITABLE' , 4); +define('ELEMENT_FLAG_WITH_ICON' , 8); +define('ELEMENT_FLAG_INHERIT' ,16); /** * Diese Objektklasse stellt ein Element das. - * + * * Ein Element ist ein Platzhalter in einem Template und kann verschiedenen * Typs sein, z.B. Text oder ein Bild. * @@ -45,9 +70,17 @@ class Element * </ul> * * @type String + * @deprecated use #typeid */ var $type; + /** + * + * Type of the element. Must be a constant value of ELEMENT_TYPE_*. + * @var integer Type of element + */ + public $typeid; + /** * Logischer Name dieses Elementes * @type String @@ -64,17 +97,17 @@ class Element /** * Objekt-ID eines Ordners, aus diesem Ordner (samt Unterordner) - * k?nnen zu verlinkende Objekte ausgew?hlt werden + * k?nnen zu verlinkende Objekte ausgew?hlt werden * @type Integer */ var $folderObjectId = 0; - + /** - * Vorausgew�hltes Objekt. + * Vorausgew�hltes Objekt. * @type Integer */ var $defaultObjectId = 0; - + /** * Schalter ob dieses Element von Redakteuren bearbeiten werden kann * @type Boolean @@ -87,8 +120,11 @@ class Element */ var $allLanguages; - var $readonlyElementNames = array('copy','linkinfo','linkdate','info','infodate','code','dynamic'); - + public static $readonlyElementTypeIds = array( + ELEMENT_TYPE_COPY,ELEMENT_TYPE_LINKINFO,ELEMENT_TYPE_LINKDATE,ELEMENT_TYPE_INFO,ELEMENT_TYPE_INFODATE,ELEMENT_TYPE_CODE,ELEMENT_TYPE_DYNAMIC + ); + + /** * Untertyp. * @@ -97,15 +133,16 @@ class Element var $subtype = ''; var $withIcon = false; var $dateformat = 'r'; - var $wiki = false; + var $wiki = false; + var $format = ELEMENT_FORMAT_TEXT; var $html = false; var $decimals = 0; var $decPoint = '.'; var $thousandSep = ''; var $code = ''; var $defaultText = ''; - - + + /** * Im Konstruktor wird die Element-Id gesetzt * @param Integer Element-Id @@ -151,7 +188,7 @@ class Element function load() { if ( intval($this->elementid) != 0 ) - { + { $db = db_connection(); $sql = $db->sql( <<<SQL SELECT * FROM {{element}} @@ -177,15 +214,17 @@ SQL $this->templateid = $prop['templateid']; $this->name = $prop['name' ]; $this->desc = $prop['descr' ]; - $this->type = $prop['type' ]; - $this->subtype = $prop['subtype' ]; + $this->typeid = $prop['typeid' ]; + $this->type = Element::getAvailableTypes()[ $this->typeid ]; // name of type + $this->subtype = $prop['subtype' ]; $this->dateformat = $prop['dateformat']; - $this->wiki = ( $prop['wiki' ] == '1' ); - $this->withIcon = ( $prop['with_icon' ] == '1' ); - $this->html = ( $prop['html' ] == '1' ); - $this->allLanguages = ( $prop['all_languages'] == '1' ); - $this->writable = ( $prop['writable' ] == '1' ); + $this->wiki = $prop['format'] == ELEMENT_FORMAT_WIKI; + $this->format = $prop['format']; + $this->withIcon = $prop['flags'] & ELEMENT_FLAG_WITH_ICON; + $this->html = $prop['flags'] & ELEMENT_FLAG_HTML_ALLOWED; + $this->allLanguages = $prop['flags'] & ELEMENT_FLAG_ALL_LANGUAGES; + $this->writable = $prop['flags'] & ELEMENT_FLAG_WRITABLE; if ( !$this->writable) $this->withIcon = false; @@ -207,12 +246,12 @@ SQL function save() { $db = db_connection(); - + $sql = $db->sql( 'UPDATE {{element}}'. ' SET templateid = {templateid},'. ' name = {name},'. ' descr = {desc},'. - ' type = {type},'. + ' typeid = {typeid},'. ' subtype = {subtype},'. ' with_icon = {withIcon},'. ' dateformat = {dateformat},'. @@ -233,7 +272,7 @@ SQL $sql->setInt ( 'templateid' ,$this->templateid ); $sql->setString ( 'name' ,$this->name ); $sql->setString ( 'desc' ,$this->desc ); - $sql->setString ( 'type' ,$this->type ); + $sql->setString ( 'typeid' ,$this->typeid ); $sql->setString ( 'subtype' ,$this->subtype ); $sql->setBoolean( 'withIcon' ,$this->withIcon ); $sql->setString ( 'dateformat' ,$this->dateformat ); @@ -246,7 +285,7 @@ SQL $sql->setString ( 'thousandSep' ,$this->thousandSep ); $sql->setString ( 'code' ,$this->code ); $sql->setString ( 'defaultText' ,$this->defaultText ); - + if ( intval($this->folderObjectId)==0 ) $sql->setNull( 'folderObjectId' ); else $sql->setInt ( 'folderObjectId' ,$this->folderObjectId ); @@ -254,7 +293,7 @@ SQL if ( intval($this->defaultObjectId)==0 ) $sql->setNull( 'defaultObjectId' ); else $sql->setInt ( 'defaultObjectId' ,$this->defaultObjectId ); - + $sql->query(); } @@ -262,15 +301,15 @@ SQL /** * Setzt den Typ des Elementes und schreibt diesen sofort in die Datenbank. - * + * * @param String Der neue Typ, siehe getAvailableTypes() f?r m?gliche Typen * @see #type */ - function setType( $type ) + public function setType( $type ) { $this->type = $type; $db = db_connection(); - + $sql = $db->sql( 'UPDATE {{element}}'. ' SET type = {type}'. ' WHERE id={elementid}' ); @@ -292,7 +331,7 @@ SQL $name = $this->name; else list( $oldprefix,$name ) = explode('%',$this->name.'%'); - + $this->name = $prefix.'%'.$name; } @@ -365,44 +404,46 @@ SQL case 'text': case 'longtext': return $this->defaultText; - + case 'number'; return '0'; - + default: } - + return lang('EL_TYPE_'.$this->type); - + } /** * Ermitteln aller benutzbaren Elementtypen * @return array */ - function getAvailableTypes() - { - return array('text', - 'longtext', - 'select', - 'number', - 'link', - 'date', - 'insert', - 'copy', - 'linkinfo', - 'linkdate', - 'code', - 'dynamic', - 'info', - 'infodate'); - } + public static function getAvailableTypes() + { + return array( + ELEMENT_TYPE_TEXT => 'text', + ELEMENT_TYPE_LONGTEXT => 'longtext', + ELEMENT_TYPE_SELECT => 'select', + ELEMENT_TYPE_NUMBER => 'number', + ELEMENT_TYPE_LINK => 'link', + ELEMENT_TYPE_DATE => 'date', + ELEMENT_TYPE_INSERT => 'insert', + ELEMENT_TYPE_COPY => 'copy', + ELEMENT_TYPE_LINKINFO => 'linkinfo', + ELEMENT_TYPE_LINKDATE => 'linkdate', + ELEMENT_TYPE_CODE => 'code', + ELEMENT_TYPE_DYNAMIC => 'dynamic', + ELEMENT_TYPE_INFO => 'info', + ELEMENT_TYPE_INFODATE => 'infodate' + ); + } /** * Ermittelt die Klasse des Element-Typs.<br> * Entweder "info", "text" oder "dynamic". - * + * * @return String */ function getTypeClass() @@ -438,7 +479,7 @@ SQL { $parameters = explode( "\n",$this->code ); $items = array(); - + foreach( $parameters as $it ) { $paar = explode( ":",$it,2 ); @@ -450,20 +491,20 @@ SQL $param_value = trim($paar[0]); // Wenn Inhalt mit "'" beginnt und mit "'" aufhoert, dann diese Zeichen abschneiden - if ( substr($param_value,0,1) == "'" && substr($param_value,strlen($param_value)-1,1) == "'" ) - $param_value = substr($param_value,1,strlen($param_value)-2); - + if ( substr($param_value,0,1) == "'" && substr($param_value,strlen($param_value)-1,1) == "'" ) + $param_value = substr($param_value,1,strlen($param_value)-2); + $items[$param_name] = $param_value; } return $items; } - + function getDynamicParameters() { $parameters = explode( "\n",$this->code ); $items = array(); - + foreach( $parameters as $it ) { $paar = explode( ":",$it,2 ); @@ -476,13 +517,13 @@ SQL // if ( substr($param_value,0,1) == "'" && substr($param_value,strlen($param_value)-1,1) == "'" ) // $param_value = substr($param_value,1,strlen($param_value)-2); - if ( !empty($param_value) ) + if ( !empty($param_value) ) $items[$param_name] = $param_value; } } return $items; } - + /** * Ermittelt, ob das Element beschreibbar ist. @@ -492,7 +533,7 @@ SQL function isWritable() { // Bei bestimmten Feldern immer false zurueckgeben - if ( in_array($this->type,$this->readonlyElementNames) ) + if ( in_array($this->typeid,Element::$readonlyElementTypeIds) ) return false; return $this->writable; diff --git a/modules/cms-core/model/Template.class.php b/modules/cms-core/model/Template.class.php @@ -263,15 +263,14 @@ class Template { $list = array(); $e = new Element(); - $readonlyList = "'".implode("','",$e->readonlyElementNames)."'"; + $readonlyList = implode(',',Element::$readonlyElementTypeIds); $db = db_connection(); $sql = $db->sql( <<<SQL SELECT * FROM {{element}} WHERE templateid={templateid} - AND writable=1 - AND type NOT IN ($readonlyList) + AND typeid NOT IN ($readonlyList) ORDER BY name ASC SQL ); @@ -280,6 +279,9 @@ SQL { $e = new Element( $row['id'] ); $e->setDatabaseRow( $row ); + + if (!$e->writable) + continue; $list[$e->elementid] = $e; unset($e); diff --git a/modules/cms-core/model/Value.class.php b/modules/cms-core/model/Value.class.php @@ -88,7 +88,7 @@ class Value /** * Element-Objekt - * @type BaseObject + * @type Element */ var $element; @@ -567,7 +567,7 @@ SQL switch( $this->element->type ) { - case 'list' : // nur wg. R�ckw�rtskompabilit�t. + case 'list' : // nur wg. R�ckw�rtskompabilit�t. Nicht mehr in Verwendung! case 'insert': $objectid = $this->linkToObjectId; diff --git a/modules/database-update/DbUpdate.class.php b/modules/database-update/DbUpdate.class.php @@ -2,7 +2,7 @@ use database\Database; -define('OR_DB_SUPPORTED_VERSION',14); +define('OR_DB_SUPPORTED_VERSION' ,16); define('OR_DB_STATUS_UPDATE_PROGRESS', 0); define('OR_DB_STATUS_UPDATE_SUCCESS' , 1); diff --git a/modules/database-update/update/DBVersion000015.class.php b/modules/database-update/update/DBVersion000015.class.php @@ -0,0 +1,23 @@ +<?php + +use database\DbVersion; +use security\Password; + +/** + * Local settings for every object. + * + * @author dankert + * + */ +class DBVersion000015 extends DbVersion +{ + /** + * + */ + public function update() + { + $this->addColumn('object','settings',OR_DB_COLUMN_TYPE_TEXT,0,null,OR_DB_COLUMN_NOT_NULLABLE); + } +} + +?>+ \ No newline at end of file diff --git a/modules/database-update/update/DBVersion000016.class.php b/modules/database-update/update/DBVersion000016.class.php @@ -0,0 +1,121 @@ +<?php + +use database\DbVersion; +use security\Password; + +/** + * Converting element types from string to number. + * + * @author dankert + * + */ +class DBVersion000016 extends DbVersion +{ + /** + * + */ + public function update() + { + // Type 3 = Text is the default. + $this->addColumn('element','typeid',OR_DB_COLUMN_TYPE_INT,0,3,OR_DB_COLUMN_NOT_NULLABLE); + + $db = $this->getDb(); + $tableProject = $this->getTableName('element'); + + // Update the types + $conversionTable = array( + 1 => 'date', + 2 => 'number', + 3 => 'text', + 4 => 'info' , + 5 => 'infodate', + 6 => 'link' , + 7 => 'longtext', + 8 => 'code' , + 9 => 'dynamic' , + 10 => 'select' , + 11 => 'copy' , + 12 => 'linkinfo', + 13 => 'linkdate', + 14 => 'insert' + ); + + foreach ($conversionTable as $typeid => $typename ) + { + $updateStmt = $db->sql(<<<SQL +UPDATE $tableProject + SET typeid=$typeid WHERE type = '$typename' +SQL + ); + $updateStmt->query(); + } + + $this->dropColumn('element','type'); + + + + $this->addColumn('element','flags',OR_DB_COLUMN_TYPE_INT,0,0,OR_DB_COLUMN_NOT_NULLABLE); + + $updateStmt = $db->sql(<<<SQL +UPDATE $tableProject + SET flags=flags+1 WHERE html = 1 +SQL + ); + $updateStmt->query(); + + $updateStmt = $db->sql(<<<SQL +UPDATE $tableProject + SET flags=flags+2 WHERE all_languages = 1 +SQL + ); + $updateStmt->query(); + + $updateStmt = $db->sql(<<<SQL +UPDATE $tableProject + SET flags=flags+4 WHERE writable = 1 +SQL + ); + $updateStmt->query(); + + $updateStmt = $db->sql(<<<SQL +UPDATE $tableProject + SET flags=flags+8 WHERE with_icon = 1 +SQL + ); + $updateStmt->query(); + + + + $this->addColumn('element','format',OR_DB_COLUMN_TYPE_INT,0,0,OR_DB_COLUMN_NOT_NULLABLE); + + // Format = HTML + $updateStmt = $db->sql(<<<SQL +UPDATE $tableProject + SET format=1 WHERE html = 1 and wiki = 0 +SQL + ); + $updateStmt->query(); + + // Format = Wiki + $updateStmt = $db->sql(<<<SQL +UPDATE $tableProject + SET format=2 WHERE wiki = 1 +SQL + ); + $updateStmt->query(); + + // Other formats were not supported up to this version. + + // Cleanup + $this->dropColumn('element','wiki' ); + $this->dropColumn('element','html' ); + $this->dropColumn('element','all_languages'); + $this->dropColumn('element','writable' ); + $this->dropColumn('element','with_icon' ); + + } + + +} + +?>+ \ No newline at end of file