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:
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