commit a167d93a374b22e66e98b3b490a9636ec06746bf
parent c8a1f9e7ed31cfffdeb73fc7459f47eb1c75efc5
Author: dankert <devnull@localhost>
Date: Wed, 6 Oct 2004 11:55:02 +0200
Neuer Elementtyp: dynamic
Diffstat:
4 files changed, 1630 insertions(+), 1478 deletions(-)
diff --git a/actionClasses/ElementAction.class.php b/actionClasses/ElementAction.class.php
@@ -20,11 +20,14 @@
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// ---------------------------------------------------------------------------
// $Log$
-// Revision 1.4 2004-07-07 20:43:57 dankert
+// Revision 1.5 2004-10-06 09:54:43 dankert
+// Neuer Elementtyp: dynamic
+//
+// Revision 1.4 2004/07/07 20:43:57 dankert
// Neuer Elementtyp: select
//
// Revision 1.3 2004/05/02 14:49:37 dankert
-// Einfügen package-name (@package)
+// Einf?gen package-name (@package)
//
// Revision 1.2 2004/04/24 17:41:51 dankert
// Subtypes von Info geaendert
@@ -58,7 +61,7 @@ class ElementAction extends Action
/**
- * Ändern des Element-Typs
+ * ?ndern des Element-Typs
*/
function changetype()
{
@@ -89,7 +92,7 @@ class ElementAction extends Action
$this->setTemplateVar('default_type',$this->element->type);
- // Abhängig vom aktuellen Element-Typ die Eigenschaften anzeigen
+ // Abh?ngig vom aktuellen Element-Typ die Eigenschaften anzeigen
$properties = $this->element->getRelatedProperties();
@@ -117,6 +120,7 @@ class ElementAction extends Action
case 'subtype':
+ $convertToLang = false;
switch( $this->element->type )
{
case 'info':
@@ -150,22 +154,42 @@ class ElementAction extends Action
'act_user_mail',
'act_user_desc',
'act_user_tel' );
+ $convertToLang = true;
break;
case 'infodate':
$subtype = Array('date_published',
'date_saved',
'date_created' );
- break;
+ $convertToLang = true;
+ break;
+
+ case 'dynamic':
+
+ $files = Array();
+ $handle = opendir ('./dynamicClasses');
+ while ( $file = readdir($handle) )
+ {
+ $file = substr($file,0,strlen($file)-10);
+ if ( $file != '' )
+ $files[$file] = $file;
+ }
+ closedir($handle);
+
+ $subtypes = $files;
+ break;
default:
$subtype = array();
break;
}
- foreach( $subtype as $t )
+ if ( $convertToLang == true )
{
- $subtypes[$t] = lang('EL_'.$this->element->type.'_'.$t);
+ foreach( $subtype as $t )
+ {
+ $subtypes[$t] = lang('EL_'.$this->element->type.'_'.$t);
+ }
}
$this->setTemplateVar('subtype' ,$subtypes );
@@ -228,6 +252,49 @@ class ElementAction extends Action
case 'select':
$this->setTemplateVar('select_items',$this->element->code );
break;
+ case 'dynamic':
+ $className = $this->element->subtype;
+ $fileName = './dynamicClasses/'.$className.'.class.php';
+ if ( is_file( $fileName ) )
+ {
+ require( $fileName );
+
+ if ( class_exists($className) )
+ {
+ $dynEl = new $className;
+
+ if ( method_exists( $dynEl,'execute' ) )
+ {
+ if ( isset( $dynEl->description ) )
+ $this->setTemplateVar('dynamic_class_description',$dynEl->description );
+ else
+ $this->setTemplateVar('dynamic_class_description',lang('NO_DESCRIPTION_AVAILABLE' ) );
+
+ if ( isset( $dynEl->parameters ) )
+ $this->setTemplateVar('dynamic_class_parameters',$dynEl->parameters );
+ else
+ $this->setTemplateVar('dynamic_class_parameters',Array() );
+ }
+ else
+ {
+ $this->setTemplateVar('dynamic_class_description',"WARNING: Class $className has no execute()-Method" );
+ $this->setTemplateVar('dynamic_class_parameters',Array() );
+ }
+ }
+ else
+ {
+ $this->setTemplateVar('dynamic_class_description',"WARNING: Class $className not found" );
+ $this->setTemplateVar('dynamic_class_parameters' ,Array() );
+ }
+ }
+ else
+ {
+ $this->setTemplateVar('dynamic_class_description',"WARNING: File $fileName not found" );
+ $this->setTemplateVar('dynamic_class_parameters' ,Array() );
+ }
+ $this->setTemplateVar('parameters',$this->element->code );
+ break;
+
case 'code':
$this->setTemplateVar('code',$this->element->code);
break;
@@ -253,7 +320,7 @@ class ElementAction extends Action
$objects = array();
- // Ermitteln aller verfügbaren Objekt-IDs
+ // Ermitteln aller verf?gbaren Objekt-IDs
foreach( Folder::getAllObjectIds() as $id )
{
$o = new Object( $id );
@@ -283,7 +350,7 @@ class ElementAction extends Action
$folders = array();
- // Ermitteln aller verfügbaren Objekt-IDs
+ // Ermitteln aller verf?gbaren Objekt-IDs
foreach( Folder::getAllFolders() as $id )
{
$o = new Object( $id );
diff --git a/objectClasses/Element.class.php b/objectClasses/Element.class.php
@@ -1,371 +1,376 @@
-<?php
-// ---------------------------------------------------------------------------
-// $Id$
-// ---------------------------------------------------------------------------
-// OpenRat Content Management System
-// Copyright (C) 2002-2004 Jan Dankert, jandankert@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.
-// ---------------------------------------------------------------------------
+<?php
+// ---------------------------------------------------------------------------
+// $Id$
+// ---------------------------------------------------------------------------
+// OpenRat Content Management System
+// Copyright (C) 2002-2004 Jan Dankert, jandankert@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.
+// ---------------------------------------------------------------------------
// $Log$
-// Revision 1.3 2004-07-07 20:45:10 dankert
+// Revision 1.4 2004-10-06 09:54:19 dankert
+// Neuer Elementtyp: dynamic
+//
+// Revision 1.3 2004/07/07 20:45:10 dankert
// Neuer Elementtyp: select
-//
-// Revision 1.2 2004/05/02 14:41:31 dankert
-// Einfügen package-name (@package)
-//
-// Revision 1.2 2004/04/30 20:36:25 dankert
-// Neu: Freigabe
-//
-// Revision 1.1 2004/04/24 15:15:12 dankert
-// Initiale Version
-//
-// ---------------------------------------------------------------------------
-
-/**
- * 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.
- *
- * @package openrat.objects
- */
-class Element
-{
- /**
- * Eindeutige ID dieses Elementes
- * @type Integer
- */
- var $elementid;
-
- /**
- * Template-ID zu der dieses Elementes geh?rt
- * @type Integer
- */
- var $templateid;
-
- /**
- * Typ des Elementes
- * Folgende Typen sind moeglich:
- * <ul>
- * <li>text</li>
- * <li>longtext</li>
- * <li>select</li>
- * <li>number</li>
- * <li>link</li>
- * <li>date</li>
- * <li>list</li>
- * <li>code</li>
- * <li>info</li>
- * <li>infodate</li>
- * </ul>
- *
- * @type String
- */
- var $type;
-
- /**
- * Logischer Name dieses Elementes
- * @type String
- */
- var $name;
-
- /**
- * Beschreibung zu diesem Element
- * Zu jedem Element kann eine Beschreibung hinterlegt werden, die dem Redakteur bei der Bearbeitung
- * der Inhalte als Bearbeitungshilfe dienen kann.
- * @type String
- */
- var $desc;
-
- /**
- * Objekt-ID eines Ordners, aus diesem Ordner (samt Unterordner)
- * k?nnen zu verlinkende Objekte ausgew?hlt werden
- * @type Integer
- */
- var $folderobjectid = 0;
-
- /**
- * Schalter ob dieses Element von Redakteuren bearbeiten werden kann
- * @type Boolean
- */
- var $writable;
-
- /**
- * Schalter, ob dieses Element in allen Sprachen den gleichen Inhalt haben soll
- * @type Boolean
- */
- var $allLanguages;
-
-
- /**
- * Im Konstruktor wird die Element-Id gesetzt
- * @param Integer Element-Id
- */
- function Element( $elementid=0 )
- {
- global $SESS;
-
- if ( intval($elementid)!=0 )
- $this->elementid = $elementid;
- }
-
-
- /**
- * Hinzufügen eines Elementes
- * Das aktuelle Element wird in die Datenbank geschrieben.
- */
- function add()
- {
- $db = db_connection();
-
- $sql = new Sql('SELECT MAX(id) FROM {t_element}');
- $this->elementid = intval($db->getOne($sql->query))+1;
-
- $sql = new Sql( 'INSERT INTO {t_element}'.
- ' (id,templateid,name,descr,type,writable) '.
- " VALUES ( {elementid},{templateid},{name},'',{type},{writable} ) " );
-
- $sql->setInt ( 'elementid' ,$this->elementid );
- $sql->setString ( 'name' ,$this->name );
- $sql->setString ( 'type' ,$this->type );
- $sql->setInt ( 'templateid',$this->templateid );
- $sql->setBoolean( 'writable' ,$this->writable );
-
- $db->query( $sql->query );
- }
-
-
-
-// function path_to_page( $pageid )
-// {
-// return $this->page->path_to_object( $pageid );
-// }
-// function path_to_object( $pageid )
-// {
-// return $this->path_to_page( $pageid );
-// }
-
-
- /**
- * Lesen des Elementes aus der Datenbank
- * Alle Eigenschaften des Elementes werden aus der Datenbank gelesen
- */
- function load()
- {
- $db = db_connection();
-
- $sql = new Sql( 'SELECT * FROM {t_element}'.
- ' WHERE id={elementid}' );
- $sql->setInt( 'elementid',$this->elementid );
- $prop = $db->getRow( $sql->query );
-
- $this->templateid = $prop['templateid'];
- $this->name = $prop['name'];
- $this->desc = $prop['descr'];
- $this->type = $prop['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' );
-
- if ( !$this->writable)
- $this->withIcon = false;
-
- $this->decimals = intval( $prop['decimals' ] );
- $this->decPoint = strval( $prop['dec_point' ] );
- $this->thousandSep = strval( $prop['thousand_sep' ] );
- $this->code = strval( $prop['code' ] );
- $this->defaultText = strval( $prop['default_text' ] );
- $this->folderObjectId = intval( $prop['folderobjectid' ] );
- $this->defaultObjectId = intval( $prop['default_objectid'] );
- }
-
-
-
- /**
- * Abspeichern des Elementes
- * Das aktuelle Element wird in der Datenbank gespeichert
- */
- function save()
- {
- $db = db_connection();
-
- $sql = new Sql( 'UPDATE {t_element}'.
- ' SET templateid = {templateid},'.
- ' name = {name},'.
- ' descr = {desc},'.
- ' type = {type},'.
- ' subtype = {subtype},'.
- ' with_icon = {withIcon},'.
- ' dateformat = {dateformat},'.
- ' wiki = {wiki},'.
- ' html = {html},'.
- ' all_languages = {allLanguages},'.
- ' writable = {writable},'.
- ' decimals = {decimals},'.
- ' dec_point = {decPoint},'.
- ' thousand_sep = {thousandSep},'.
- ' code = {code},'.
- ' default_text = {defaultText},'.
- ' folderobjectid = {folderObjectId},'.
- ' default_objectid= {defaultObjectId}'.
- ' WHERE id={elementid}' );
-
- $sql->setInt ( 'elementid' ,$this->elementid );
- $sql->setInt ( 'templateid' ,$this->templateid );
- $sql->setString ( 'name' ,$this->name );
- $sql->setString ( 'desc' ,$this->desc );
- $sql->setString ( 'type' ,$this->type );
- $sql->setString ( 'subtype' ,$this->subtype );
- $sql->setBoolean( 'withIcon' ,$this->withIcon );
- $sql->setString ( 'dateformat' ,$this->dateformat );
- $sql->setBoolean( 'wiki' ,$this->wiki );
- $sql->setBoolean( 'html' ,$this->html );
- $sql->setBoolean( 'writable' ,$this->writable );
- $sql->setBoolean( 'allLanguages' ,$this->allLanguages );
- $sql->setInt ( 'decimals' ,$this->decimals );
- $sql->setString ( 'decPoint' ,$this->decPoint );
- $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 );
-
- if ( intval($this->defaultObjectId)==0 )
- $sql->setNull( 'defaultObjectId' );
- else $sql->setInt ( 'defaultObjectId' ,$this->defaultObjectId );
-
- $db->query( $sql->query );
- }
-
-
-
- /**
- * Setzt den Typ des Elementes
- * @param String Der neue Typ, siehe getAvailableTypes() für mögliche Typen
- * @see #type
- */
- function setType( $type )
- {
- $db = db_connection();
-
- $sql = new Sql( 'UPDATE {t_element}'.
- ' SET type = {type}'.
- ' WHERE id={elementid}' );
-
- $sql->setInt ( 'elementid',$this->elementid );
- $sql->setString ( 'type' ,$type );
-
- $db->query( $sql->query );
- }
-
-
- /**
- * Löschen des Elementes und aller Inhalte
- */
- function delete()
- {
- $db = db_connection();
-
- // Inhalte l?schen
- $this->deleteValues();
-
- // Element l?schen
- $sql = new Sql('DELETE FROM {t_element} '.
- ' WHERE id={elementid}' );
- $sql->setInt( 'elementid',$this->elementid );
-
- $db->query( $sql->query );
- }
-
-
- /**
- * L?schen aller Seiteninhalte mit diesem Element
- * Das Element wird nicht gelöscht.
- */
- function deleteValues()
- {
- $db = db_connection();
-
- // Alle Inhalte mit diesem Element l?schen
- $sql = new Sql('DELETE FROM {t_value} '.
- ' WHERE elementid={elementid}' );
- $sql->setInt( 'elementid',$this->elementid );
- $db->query( $sql->query );
- }
-
-
- /**
- * Abh?ngig vom Element-Typ werden die zur Darstellung notwendigen Eigenschaften ermittelt
- * @return Array()
- */
- function getRelatedProperties()
- {
- $typeprop = Array('text' =>Array('withIcon','allLanguages','writable','html','wiki','defaultText'),
- 'longtext'=>Array('withIcon','allLanguages','writable','html','wiki','defaultText'),
- 'select' =>Array('withIcon','allLanguages','writable','defaultText','code'),
- 'number' =>Array('withIcon','allLanguages','writable','decPoint','decimals','thousandSep'),
- 'link' =>Array('withIcon','allLanguages','writable','folderObjectId','defaultObjectId'),
- 'date' =>Array('withIcon','allLanguages','writable','dateformat'),
- 'list' =>Array('withIcon','allLanguages','writable','folderObjectId'),
- 'code' =>Array('code'),
- 'info' =>Array('subtype'),
- 'infodate'=>Array('subtype','dateformat') );
-
- return $typeprop[ $this->type ];
- }
-
-
- /**
- * Ermitteln aller benutzbaren Elementtypen
- * @return Array
- */
- function getAvailableTypes()
- {
- return array('text',
- 'longtext',
- 'select',
- 'number',
- 'link',
- 'date',
- 'list',
- 'code',
- 'info',
- 'infodate');
- }
-
-
- /**
- * Ermittelt, ob das Element beschreibbar ist.
- * Bestimmte Typen (z.B. Info-Felder) sind nie beschreibbar, dann wird immer false zurückgegeben.
- * Ansonsten wird ermittelt, ob dieses Element als beschreibbar markiert ist.
- */
- function isWritable()
- {
- // Bei bestimmten Feldern immer false zurueckgeben
- if ( in_array($this->type,Array('info','infodate','code')) )
- return false;
-
- return $this->writable;
- }
-}
-
+//
+// Revision 1.2 2004/05/02 14:41:31 dankert
+// Einf?gen package-name (@package)
+//
+// Revision 1.2 2004/04/30 20:36:25 dankert
+// Neu: Freigabe
+//
+// Revision 1.1 2004/04/24 15:15:12 dankert
+// Initiale Version
+//
+// ---------------------------------------------------------------------------
+
+/**
+ * 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.
+ *
+ * @package openrat.objects
+ */
+class Element
+{
+ /**
+ * Eindeutige ID dieses Elementes
+ * @type Integer
+ */
+ var $elementid;
+
+ /**
+ * Template-ID zu der dieses Elementes geh?rt
+ * @type Integer
+ */
+ var $templateid;
+
+ /**
+ * Typ des Elementes
+ * Folgende Typen sind moeglich:
+ * <ul>
+ * <li>text</li>
+ * <li>longtext</li>
+ * <li>select</li>
+ * <li>number</li>
+ * <li>link</li>
+ * <li>date</li>
+ * <li>list</li>
+ * <li>code</li>
+ * <li>info</li>
+ * <li>infodate</li>
+ * </ul>
+ *
+ * @type String
+ */
+ var $type;
+
+ /**
+ * Logischer Name dieses Elementes
+ * @type String
+ */
+ var $name;
+
+ /**
+ * Beschreibung zu diesem Element
+ * Zu jedem Element kann eine Beschreibung hinterlegt werden, die dem Redakteur bei der Bearbeitung
+ * der Inhalte als Bearbeitungshilfe dienen kann.
+ * @type String
+ */
+ var $desc;
+
+ /**
+ * Objekt-ID eines Ordners, aus diesem Ordner (samt Unterordner)
+ * k?nnen zu verlinkende Objekte ausgew?hlt werden
+ * @type Integer
+ */
+ var $folderobjectid = 0;
+
+ /**
+ * Schalter ob dieses Element von Redakteuren bearbeiten werden kann
+ * @type Boolean
+ */
+ var $writable;
+
+ /**
+ * Schalter, ob dieses Element in allen Sprachen den gleichen Inhalt haben soll
+ * @type Boolean
+ */
+ var $allLanguages;
+
+
+ /**
+ * Im Konstruktor wird die Element-Id gesetzt
+ * @param Integer Element-Id
+ */
+ function Element( $elementid=0 )
+ {
+ global $SESS;
+
+ if ( intval($elementid)!=0 )
+ $this->elementid = $elementid;
+ }
+
+
+ /**
+ * Hinzuf?gen eines Elementes
+ * Das aktuelle Element wird in die Datenbank geschrieben.
+ */
+ function add()
+ {
+ $db = db_connection();
+
+ $sql = new Sql('SELECT MAX(id) FROM {t_element}');
+ $this->elementid = intval($db->getOne($sql->query))+1;
+
+ $sql = new Sql( 'INSERT INTO {t_element}'.
+ ' (id,templateid,name,descr,type,writable) '.
+ " VALUES ( {elementid},{templateid},{name},'',{type},{writable} ) " );
+
+ $sql->setInt ( 'elementid' ,$this->elementid );
+ $sql->setString ( 'name' ,$this->name );
+ $sql->setString ( 'type' ,$this->type );
+ $sql->setInt ( 'templateid',$this->templateid );
+ $sql->setBoolean( 'writable' ,$this->writable );
+
+ $db->query( $sql->query );
+ }
+
+
+
+// function path_to_page( $pageid )
+// {
+// return $this->page->path_to_object( $pageid );
+// }
+// function path_to_object( $pageid )
+// {
+// return $this->path_to_page( $pageid );
+// }
+
+
+ /**
+ * Lesen des Elementes aus der Datenbank
+ * Alle Eigenschaften des Elementes werden aus der Datenbank gelesen
+ */
+ function load()
+ {
+ $db = db_connection();
+
+ $sql = new Sql( 'SELECT * FROM {t_element}'.
+ ' WHERE id={elementid}' );
+ $sql->setInt( 'elementid',$this->elementid );
+ $prop = $db->getRow( $sql->query );
+
+ $this->templateid = $prop['templateid'];
+ $this->name = $prop['name'];
+ $this->desc = $prop['descr'];
+ $this->type = $prop['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' );
+
+ if ( !$this->writable)
+ $this->withIcon = false;
+
+ $this->decimals = intval( $prop['decimals' ] );
+ $this->decPoint = strval( $prop['dec_point' ] );
+ $this->thousandSep = strval( $prop['thousand_sep' ] );
+ $this->code = strval( $prop['code' ] );
+ $this->defaultText = strval( $prop['default_text' ] );
+ $this->folderObjectId = intval( $prop['folderobjectid' ] );
+ $this->defaultObjectId = intval( $prop['default_objectid'] );
+ }
+
+
+
+ /**
+ * Abspeichern des Elementes
+ * Das aktuelle Element wird in der Datenbank gespeichert
+ */
+ function save()
+ {
+ $db = db_connection();
+
+ $sql = new Sql( 'UPDATE {t_element}'.
+ ' SET templateid = {templateid},'.
+ ' name = {name},'.
+ ' descr = {desc},'.
+ ' type = {type},'.
+ ' subtype = {subtype},'.
+ ' with_icon = {withIcon},'.
+ ' dateformat = {dateformat},'.
+ ' wiki = {wiki},'.
+ ' html = {html},'.
+ ' all_languages = {allLanguages},'.
+ ' writable = {writable},'.
+ ' decimals = {decimals},'.
+ ' dec_point = {decPoint},'.
+ ' thousand_sep = {thousandSep},'.
+ ' code = {code},'.
+ ' default_text = {defaultText},'.
+ ' folderobjectid = {folderObjectId},'.
+ ' default_objectid= {defaultObjectId}'.
+ ' WHERE id={elementid}' );
+
+ $sql->setInt ( 'elementid' ,$this->elementid );
+ $sql->setInt ( 'templateid' ,$this->templateid );
+ $sql->setString ( 'name' ,$this->name );
+ $sql->setString ( 'desc' ,$this->desc );
+ $sql->setString ( 'type' ,$this->type );
+ $sql->setString ( 'subtype' ,$this->subtype );
+ $sql->setBoolean( 'withIcon' ,$this->withIcon );
+ $sql->setString ( 'dateformat' ,$this->dateformat );
+ $sql->setBoolean( 'wiki' ,$this->wiki );
+ $sql->setBoolean( 'html' ,$this->html );
+ $sql->setBoolean( 'writable' ,$this->writable );
+ $sql->setBoolean( 'allLanguages' ,$this->allLanguages );
+ $sql->setInt ( 'decimals' ,$this->decimals );
+ $sql->setString ( 'decPoint' ,$this->decPoint );
+ $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 );
+
+ if ( intval($this->defaultObjectId)==0 )
+ $sql->setNull( 'defaultObjectId' );
+ else $sql->setInt ( 'defaultObjectId' ,$this->defaultObjectId );
+
+ $db->query( $sql->query );
+ }
+
+
+
+ /**
+ * Setzt den Typ des Elementes
+ * @param String Der neue Typ, siehe getAvailableTypes() f?r m?gliche Typen
+ * @see #type
+ */
+ function setType( $type )
+ {
+ $db = db_connection();
+
+ $sql = new Sql( 'UPDATE {t_element}'.
+ ' SET type = {type}'.
+ ' WHERE id={elementid}' );
+
+ $sql->setInt ( 'elementid',$this->elementid );
+ $sql->setString ( 'type' ,$type );
+
+ $db->query( $sql->query );
+ }
+
+
+ /**
+ * L?schen des Elementes und aller Inhalte
+ */
+ function delete()
+ {
+ $db = db_connection();
+
+ // Inhalte l?schen
+ $this->deleteValues();
+
+ // Element l?schen
+ $sql = new Sql('DELETE FROM {t_element} '.
+ ' WHERE id={elementid}' );
+ $sql->setInt( 'elementid',$this->elementid );
+
+ $db->query( $sql->query );
+ }
+
+
+ /**
+ * L?schen aller Seiteninhalte mit diesem Element
+ * Das Element wird nicht gel?scht.
+ */
+ function deleteValues()
+ {
+ $db = db_connection();
+
+ // Alle Inhalte mit diesem Element l?schen
+ $sql = new Sql('DELETE FROM {t_value} '.
+ ' WHERE elementid={elementid}' );
+ $sql->setInt( 'elementid',$this->elementid );
+ $db->query( $sql->query );
+ }
+
+
+ /**
+ * Abh?ngig vom Element-Typ werden die zur Darstellung notwendigen Eigenschaften ermittelt
+ * @return Array()
+ */
+ function getRelatedProperties()
+ {
+ $typeprop = Array('text' =>Array('withIcon','allLanguages','writable','html','wiki','defaultText'),
+ 'longtext'=>Array('withIcon','allLanguages','writable','html','wiki','defaultText'),
+ 'select' =>Array('withIcon','allLanguages','writable','defaultText','code'),
+ 'number' =>Array('withIcon','allLanguages','writable','decPoint','decimals','thousandSep'),
+ 'link' =>Array('withIcon','allLanguages','writable','folderObjectId','defaultObjectId'),
+ 'date' =>Array('withIcon','allLanguages','writable','dateformat'),
+ 'list' =>Array('withIcon','allLanguages','writable','folderObjectId'),
+ 'code' =>Array('code'),
+ 'dynamic' =>Array('subtype','code'),
+ 'info' =>Array('subtype'),
+ 'infodate'=>Array('subtype','dateformat') );
+
+ return $typeprop[ $this->type ];
+ }
+
+
+ /**
+ * Ermitteln aller benutzbaren Elementtypen
+ * @return Array
+ */
+ function getAvailableTypes()
+ {
+ return array('text',
+ 'longtext',
+ 'select',
+ 'number',
+ 'link',
+ 'date',
+ 'list',
+ 'code',
+ 'dynamic',
+ 'info',
+ 'infodate');
+ }
+
+
+ /**
+ * Ermittelt, ob das Element beschreibbar ist.
+ * Bestimmte Typen (z.B. Info-Felder) sind nie beschreibbar, dann wird immer false zur?ckgegeben.
+ * Ansonsten wird ermittelt, ob dieses Element als beschreibbar markiert ist.
+ */
+ function isWritable()
+ {
+ // Bei bestimmten Feldern immer false zurueckgeben
+ if ( in_array($this->type,Array('info','infodate','code')) )
+ return false;
+
+ return $this->writable;
+ }
+}
+
?>
\ No newline at end of file
diff --git a/objectClasses/Value.class.php b/objectClasses/Value.class.php
@@ -1,1104 +1,1154 @@
-<?php
-// ---------------------------------------------------------------------------
-// $Id$
-// ---------------------------------------------------------------------------
-// DaCMS Content Management System
-// Copyright (C) 2002 Jan Dankert, jandankert@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.
-// ---------------------------------------------------------------------------
+<?php
+// ---------------------------------------------------------------------------
+// $Id$
+// ---------------------------------------------------------------------------
+// DaCMS Content Management System
+// Copyright (C) 2002 Jan Dankert, jandankert@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.
+// ---------------------------------------------------------------------------
// $Log$
-// Revision 1.9 2004-07-07 20:48:33 dankert
+// Revision 1.10 2004-10-06 09:55:02 dankert
+// Neuer Elementtyp: dynamic
+//
+// Revision 1.9 2004/07/07 20:48:33 dankert
// Neuer Elementtyp: select
-//
-// Revision 1.8 2004/05/03 21:15:30 dankert
-// Umstellung auf dezimale ASCII-Werte
-//
-// Revision 1.7 2004/05/03 20:21:49 dankert
-// setzen von ObjectId bei Code-Elementen
-//
-// Revision 1.6 2004/05/02 14:41:31 dankert
-// Einfügen package-name (@package)
-//
-// Revision 1.5 2004/05/02 12:01:33 dankert
-// Funktion release() zum freigeben von Inhalten
-//
-// Revision 1.4 2004/05/02 11:40:00 dankert
-// Freigabestatus der Seiteninhalte verarbeiten
-//
-// Revision 1.3 2004/04/24 18:11:28 dankert
-// Info-elemente
-//
-// Revision 1.2 2004/04/24 15:28:17 dankert
-// Korrektur: relative Pfad bei Listen
-//
-// Revision 1.1 2004/04/24 15:15:12 dankert
-// Initiale Version
-//
-// Revision 1.1 2004/03/13 23:09:48 dankert
-// *** empty log message ***
-//
-// ---------------------------------------------------------------------------
-
-
-/**
- * Darstellen einer Inhaltes
- *
- * @version $Revision$
- * @author $Author$
- * @package openrat.objects
- */
-
-class Value
-{
- /**
- * ID dieser Inhaltes
- * @type Integer
- */
- var $valueid=0;
-
- /**
- * Seiten-Objekt der übergeordneten Seite
- * @type Object
- */
- var $page;
-
- /**
- * Objekt-ID, auf die verlinkt wird
- * @type Integer
- */
- var $linkToObjectId;
-
- /**
- * Text-Inhalt
- * @type String
- */
- var $text;
-
- /**
- * Zahl. Auch Fließkommazahlen werden als Ganzzahl gespeichert
- * @type Integer
- */
- var $number;
-
-
- /**
- * Datum als Unix-Timestamp
- * @type Integer
- */
- var $date;
-
- /**
- * Element-Objekt
- * @type Object
- */
- var $element;
-
- /**
- * Der eigentliche Inhalt des Elementes
- * @type String
- */
- var $value;
-
- /**
- * TimeStamp der letzten Änderung
- * @type Integer
- */
- var $lastchangeTimeStamp;
-
- /**
- * Benutzer-ID der letzten Änderung
- * @type Integer
- */
- var $lastchangeUserId;
-
- /**
- * Schalter, ob dieser Inhalt der aktive Inhalt ist
- * @type Boolean
- */
- var $active;
-
- /**
- * Schalter, ob dieser Inhalt der Inhalt ist, der veroeffentlicht
- * werden soll
- * @type Boolean
- */
- var $publish;
-
- /**
- * Konstruktor
- */
- function Value()
- {
- global $SESS;
-
- $this->lastchangeUserId = 0;
- $this->lastchangeTimeStamp = 0;
-
- $this->languageid = $SESS['languageid'];
- }
-
-
- /**
- * Umwandeln von Wiki-Textauszeichnungen in HTML-Auszeichnungen
- *
- * @param text zu bearbeitender Text
- * @param html Boolean, ob HTML-Tags erlaubt sind
- *
- * @return String Ausgabe
- */
- function decode_wiki( $text,$html=false )
- {
- global $conf_languagedir,
- $conf_php;
-
- $ini_chars = parse_ini_file( $conf_languagedir.'/specialchars.ini.'.$conf_php );
-
- $neu = array();
-
- $toc = array();
- $tocid = 0;
-
- $pre = false;
- $quote = false;
- $br = false;
- $ul = false;
- $ol = false;
- $li = true;
- $level = 0;
- $lis = array();
- $table = false;
- $p = false;
-
- // Links
- if ( $this->element->html )
- $pf = '>';
- else $pf = '>';
-
- if ( $this->element->html )
- $pf = '>';
- else $pf = '>';
-
- // Zeichenkette in die einzelnen Zeilen zerlegen
- $zeilen = explode("\n",$text);
-
- foreach( $zeilen as $zeile )
- {
- # Leer- und Sonderzeichen am Zeilenende entfernen
- $zeile = chop( $zeile );
-
- // Backtick am Zeilenbeginn schaltet Wikiauszeichnungen aus
- if ( substr($zeile,0,1) == '`' && !$pre )
- {
- $zeile = substr($zeile,1);
- $nowiki = true;
- }
- else
- {
- $nowiki = false;
- }
-
- // Zitat Anfang
- if ( $zeile == $pf && !$quote && !$pre )
- {
- if ( $p )
- {
- $neu[] = '</p>';
- $p = false;
- }
-
- $zeile = '<blockquote>';
- $quote = true;
- }
-
- // Zitat Ende
- if ( $zeile == $pf && $quote && !$pre )
- {
- if ( $p )
- {
- $neu[] = '</p>';
- $p = false;
- }
- $zeile = '</blockquote>';
- $quote = false;
- }
-
- // Präformatierter Text Anfang
- if ( $zeile == '=' && !$pre )
- {
- if ( $p )
- {
- $neu[] = '</p>';
- $p = false;
- }
-
- $zeile = '<pre>';
- $pre = true;
- }
-
- // Präformatierter Text Ende
- if ( $zeile == '=' && $pre )
- {
- $zeile = '</pre>';
- $pre = false;
- }
-
-
- // Überschriften
- if ( preg_match('/^([+]{1,}) ?(.*)/',$zeile,$match) && !$nowiki && !$pre && !$quote )
- {
- if ( $p )
- {
- $neu[] = '</p>';
- $p = false;
- }
-
- $tocid++;
- $hlev = strlen($match[1]);
- $toc[] = array('level'=>$hlev,'id'=>$tocid,'text'=>$match[2]);
- $zeile = '<h'.$hlev.'><a name="toc'.$tocid.'"></a>'.$match[2].'</h'.$hlev.'>';
- }
-
- // Bei präformatierem Text keine weiteren Formatierungen durchführen
- if ( !$pre )
- {
- // Tabellen
- $beg = substr($zeile,0,1);
-
- if ( $beg == '|' )
- {
- if ( !$table )
- {
- if ( $p )
- {
- $neu[] = '</p>';
- $p = false;
- }
-
- $neu[] = '<table>';
- $table = true;
- }
-
- $zeile = ereg_replace( '^\|','<tr><td>',$zeile );
- $zeile = ereg_replace( '\|?$','</td></tr>',$zeile );
- $zeile = str_replace( '|','</td><td>',$zeile );
-
- // Spaltenübergreifende Zellen
- $zeile = str_replace('<td></td><td>','<td colspan\="2">',$zeile);
- for( $i=2; $i<=10; $i++)
- $zeile = str_replace('</td><td colspan\="'.$i.'"></td><td>','</td><td colspan\="'.($i+1).'">',$zeile);
-
- // Spalten-Überschriften <th>
- $zeile = eregi_replace( '<td([^<]*)>!([^<]+)</td>','<th\\1>\\2</th>',$zeile );
-
- // CSS-Klassen
- $zeile = eregi_replace( '<t([dh][^<]*)>\(([a-zA-Z0-9]+)\)([^<]+)</td>','<t\\1 class\="\\2">\\3</td>',$zeile );
- }
- else
- {
- if( $table )
- {
- $table = false;
- $neu[] = '</table>';
- }
- }
-
-
- // Aufzählungen
- if ( preg_match('/^( *)([\*#-]) (.*)/',$zeile,$match) && !$nowiki )
- {
- if ( $p )
- {
- $neu[] = '</p>';
- $p = false;
- }
-
- $lev = strlen($match[1])+1;
- $type = $match[2];
- $text = $match[3];
-
- if ( $level == $lev ) $neu[] = '</li>';
-
- while( $level < $lev )
- {
- $level++;
-
- if ( $match[2]=='#')
- $neu[] = '<ol class="level'.$level.'">';
- else $neu[] = '<ul class="level'.$level.'">';
-
- $lis[$level] = $match[2];
- }
-
- while( $level > $lev )
- {
- $neu[] = '</li>';
- if ( $lis[$level]=='#')
- $neu[] = '</ol>';
- else $neu[] = '</ul>';
-
- $level--;
- }
-
- $zeile = '<li>'.$text;
- }
- else
- {
- while( $level > 0 )
- {
- if ( $lis[$level]=='#')
- $neu[] = '</ol>';
- else $neu[] = '</ul>';
- $level--;
- }
- }
- }
-
-
- // Absätze einrichten
- if (!$pre && !$ol && !$ul && !$table && substr($zeile,0,1)!='<' )
- {
- if ( $zeile != '' && $p )
- {
- $neu[] = '<br/>';
- }
-
- if ( $zeile == '' && $p )
- {
- $neu[] = '</p>';
- $p = false;
- }
-
- if ( $zeile != '' && !$p )
- {
- $neu[] = '<p>';
- $p = true;
- }
- }
-
-
-
- // Textauszeichnungen fett,kursiv,fest
- if ( !$pre && !$nowiki ) // nicht bei präformatiertem Text
- {
- // *Fett*
- //$zeile = ereg_replace( '\*([^*]+[^\\])\*' , '<strong>\\1</strong>' , $zeile );
- $zeile = preg_replace( '/\*([^*]+[^\\\\]+)\*/' , '<strong>\\1</strong>' , $zeile );
-
- // kursiv
- $zeile = ereg_replace( '_([^_]+[^\\])_' , '<em>\\1</em>' , $zeile );
-
- // feste Breite
- $zeile = ereg_replace( '=([^=]+[^\\])=' , '<tt>\\1</tt>' , $zeile );
-
- // Text->... umsetzen nach "Text"->... (Anfuehrungszeichen ergaenzen)
- $zeile = ereg_replace( '([A-Za-z0-9._?äöüÄÖÜß-]+)-'.$pf, '"\\1"-'.$pf, $zeile );
-
- // ...->Link umsetzen nach ...->"Link" (Anfuehrungszeichen ergaenzen)
- $zeile = ereg_replace( '-'.$pf.'([A-Za-z0-9.:_\/\,\?\=\&-]+)', '-'.$pf.'"\\1"',$zeile );
-
- # Links ...->"nnn" ersetzen mit ...->"object:nnn"
- $zeile = ereg_replace( '-'.$pf.'\"([0-9]+)\"', '-'.$pf.'"object:\\1"', $zeile );
-
- // Links ->... url-kodieren
-// preg_match_all( '|-'.$pf.'\"([^\"]+)\"|',$zeile,$urls,PREG_SET_ORDER );
-// foreach( $urls as $url )
-// {
-// echo $url[1];
-// $urlneu = urlencode( $url[1] );
-// echo "wird zu $urlneu<br>";
-// $zeile = str_replace( $url[0],'-'.$pf.'"'.$urlneu.'"',$zeile );
-// }
-
- # Links "mit->..."
- $zeile = ereg_replace( '\"([^\"]+)\"-'.$pf.'\"([^\"]+)\"', '<a href="\\2">\\1</a>', $zeile );
-
- // alleinstehende externe Links
- $zeile = ereg_replace( '([^"])((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]*))', '\\1<a href="\\2">\\4</a>', $zeile );
- $zeile = ereg_replace( '^((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]*))', '<a href="\\1">\\3</a>', $zeile );
-
- // Einbinden von Bildern
- $zeile = ereg_replace( '(ima?ge?):\/?\/?(([0-9]+))(\{.*\})?', '<img src="object:\\2" alt="" />', $zeile );
-
- # mailto:...-Links
- $zeile = ereg_replace( '([A-Za-z0-9._-]+@[A-Za-z0-9._-]+)', '<a href="mailto:\\1">\\1</a>', $zeile );
-
- // Links object:nnn ersetzen
- preg_match_all( '|object:([0-9]+)|',$zeile,$objects,PREG_SET_ORDER );
- foreach( $objects as $object )
- {
- $var = $this->page->path_to_object( $object[1] );
- $zeile = str_replace( $object[0],$var,$zeile );
- }
-
- $zeile = ereg_replace( '([^\\\\])\\\\','\\1', $zeile );
- }
- $neu[] = $zeile;
- }
-
- if ( $ol ) $neu[] = '</ol>';
- if ( $ul ) $neu[] = '</ul>';
- if ( $table ) $neu[] = '</table>';
- if ( $pre ) $neu[] = '</pre>';
- if ( $p ) $neu[] = '</p>';
-
-
- $text = implode("\n",$neu);
-
- // Inhaltsverzeichnis
-
- $toctext = array();
- foreach( $toc as $t )
- {
- if ($t['level'] == 1 && count($toctext)>0) $toctext[] = '';
- $toctext[] = str_repeat(' ',$t['level']*2).'<a href="#toc'.$t['id'].'">'.$t['text'].'</a>';
- }
- $text = str_replace( '##TOC##',implode("<br/>\n",$toctext),$text ); // Inhaltsverzeichnis einfügen
-
- foreach( $ini_chars as $key=>$val)
- {
- $text = str_replace( chr($key),$val,$text );
- }
-
- return $text;
- }
-
-
- function path_to_page( $pageid )
- {
- return $this->page->path_to_object( $pageid );
- }
- function path_to_object( $pageid )
- {
- return $this->path_to_page( $pageid );
- }
-
-
- /**
- * Laden des aktuellen Inhaltes aus der Datenbank
- */
- function load()
- {
- $db = db_connection();
-
- if ( $this->publish )
- $sql = new Sql( 'SELECT * FROM {t_value}'.
- ' WHERE elementid ={elementid}'.
- ' AND pageid ={pageid}'.
- ' AND languageid={languageid}'.
- ' AND publish=1' );
- else $sql = new Sql( 'SELECT * FROM {t_value}'.
- ' WHERE elementid ={elementid}'.
- ' AND pageid ={pageid}'.
- ' AND languageid={languageid}'.
- ' AND active=1' );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
- $row = $db->getRow( $sql->query );
-
- $this->text = $row['text'];
- $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']);
- }
-
-
- /**
- * Laden eines bestimmten Inhaltes aus der Datenbank
- */
- function loadWithId()
- {
- $db = db_connection();
-
- $sql = new Sql( 'SELECT * FROM {t_value}'.
- ' WHERE id={valueid}' );
- $sql->setInt( 'valueid',$this->valueid);
- $row = $db->getRow( $sql->query );
-
- $this->text = $row['text'];
- $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']);
- }
-
-
- /**
- * Alle Versionen des aktuellen Inhaltes werden ermittelt
- * @return Array
- */
- function getVersionList()
- {
- $db = db_connection();
-
- $sql = new Sql( 'SELECT id FROM {t_value}'.
- ' WHERE elementid ={elementid}'.
- ' AND pageid ={pageid}'.
- ' AND languageid={languageid}'.
- ' ORDER BY lastchange_date' );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
-
- return $db->getCol( $sql->query );
- }
-
-
- /**
- * Inhalt freigeben
- */
- function release()
- {
- $db = db_connection();
-
- $sql = new Sql( 'UPDATE {t_value}'.
- ' SET publish=0'.
- ' WHERE elementid ={elementid}'.
- ' AND pageid ={pageid}'.
- ' AND languageid={languageid}' );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
-
- $db->query( $sql->query );
-
- $sql = new Sql( 'UPDATE {t_value}'.
- ' SET publish=1'.
- ' WHERE active = 1'.
- ' AND elementid ={elementid}'.
- ' AND pageid ={pageid}'.
- ' AND languageid={languageid}' );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
-
- $db->query( $sql->query );
- }
-
- /**
- * Inhalt speichern
- */
- function save()
- {
- global $SESS;
- $db = db_connection();
-
- $sql = new Sql( 'UPDATE {t_value}'.
- ' SET active=0'.
- ' WHERE elementid ={elementid}'.
- ' AND pageid ={pageid}'.
- ' AND languageid={languageid}' );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
-
- $db->query( $sql->query );
-
- if ( $this->publish )
- {
- // Wenn Inhalt sofort veroeffentlicht werden kann, dann
- // alle anderen Inhalte auf nicht-veroeffentlichen stellen
- $sql = new Sql( 'UPDATE {t_value}'.
- ' SET publish=0'.
- ' WHERE elementid ={elementid}'.
- ' AND pageid ={pageid}'.
- ' AND languageid={languageid}' );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
-
- $db->query( $sql->query );
- }
-
- // Naechste ID aus Datenbank besorgen
- $sql = new Sql('SELECT MAX(id) FROM {t_value}');
- $this->valueid = intval($db->getOne($sql->query))+1;
-
- $sql->setQuery( 'INSERT INTO {t_value}'.
- ' (id,linkobjectid,text,number,date,elementid,pageid,languageid,active,publish,lastchange_date,lastchange_userid)'.
- ' VALUES ({valueid},{linkobjectid},{text},{number},{date},{elementid},{pageid},{languageid},1,{publish},{lastchange_date},{lastchange_userid})' );
-
- $sql->setInt( 'valueid' ,$this->valueid );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid );
-
- if ( intval($this->linkToObjectId)==0)
- $sql->setNull ( 'linkobjectid' );
- else $sql->setInt ( 'linkobjectid',$this->linkToObjectId );
-
- if ( $this->text == '' )
- $sql->setNull ( 'text' );
- else $sql->setString( 'text',$this->text );
-
- if ( intval($this->number)==0)
- $sql->setNull ( 'number' );
- else $sql->setInt ( 'number',$this->number );
-
- if ( intval($this->date)==0)
- $sql->setNull ( 'date' );
- else $sql->setInt ( 'date',$this->date );
-
- $sql->setBoolean( 'publish' ,$this->publish );
- $sql->setInt ( 'lastchange_date' ,time() );
- $sql->setInt ( 'lastchange_userid',$SESS['user']['userid'] );
-
- $db->query( $sql->query );
- }
-
-
- /**
- * Diesen Inhalt löschen
- */
- function delete()
- {
- $db = db_connection();
- $sql = new Sql( 'DELETE * FROM {t_value}'.
- ' WHERE elementid ={elementid}'.
- ' AND pageid ={pageid}'.
- ' AND languageid={languageid}' );
- $sql->setInt( 'elementid' ,$this->element->elementid );
- $sql->setInt( 'pageid' ,$this->pageid );
- $sql->setInt( 'languageid',$this->languageid);
- $row = $db->getRow( $sql->query );
- }
-
-
- /**
- * Inhalt ermitteln
- */
- function generate()
- {
- if ( intval($this->valueid)==0 )
- $this->load();
- $db = db_connection();
- global $conf,
- $conf_tmpdir,
- $SESS;
-
- $inhalt = '';
-
- switch( $this->element->type )
- {
- case 'list':
-
- $objectid = $this->linkToObjectId;
- $this->page->up_path();
-
- if ( intval($objectid) == 0 )
- $objectid = $this->element->defaultObjectId;
-
- if ( $this->simple )
- {
- $f = new Folder( $objectid );
- $f->load();
- $inhalt = $f->name;
- unset( $f );
- }
- else
- {
- if ( $objectid != $this->page->objectid ) // Rekursion vermeiden
- {
- $f = new Folder( $objectid );
- foreach( $f->getObjectIds() as $oid )
- {
- if ( $oid != $this->page->objectid ) // Rekursion vermeiden
- {
- $o = new Object( $oid );
- $o->load();
- switch( $o->getType() )
- {
- case 'page':
- $p = new Page( $oid );
- $p->public = $this->page->public;
- $p->up_path = $this->page->up_path();
- $p->projectmodelid = $this->page->projectmodelid;
- $p->languageid = $this->languageid;
- $p->load();
- $p->generate();
- $inhalt .= $p->value;
- unset( $p );
- break;
- case 'link':
- $l = new Link( $oid );
- $l->load();
- if ( $l->isLinkToObject )
- {
- $op = new Object( $l->linkedObjectId );
- $op->load();
- if ( $op->isPage )
- {
- $p = new Page( $l->linkedObjectId );
- $p->public = $this->page->public;
- $p->up_path = $this->page->up_path();
- $p->projectmodelid = $this->page->projectmodelid;
- $p->languageid = $this->languageid;
- $p->load();
- $p->generate();
- $inhalt .= $p->value;
- unset( $p );
- }
- }
- break;
- }
- }
- else die('FATAL: recursion detected');
- }
- }
- else die('FATAL: recursion detected');
- }
-
- if ( $this->simple )
- {
- $inhalt = strip_tags( $inhalt );
- $inhalt = str_replace( "\n",'',$inhalt );
- $inhalt = str_replace( "\r",'',$inhalt );
- }
-
- break;
-
-
- case 'link':
-
- $objectid = $this->linkToObjectId;
-
- if ( intval($objectid) == 0 )
- $objectid = $this->element->defaultObjectId;
-
- if ( $this->simple )
- {
- $p = new Page( $objectid );
- $p->load();
- $inhalt = $p->name;
- }
- else
- {
- $inhalt = $this->page->path_to_object( $objectid );
- }
-
- break;
-
-
- case 'longtext':
- case 'text':
- case 'select':
-
- $inhalt = $this->text;
-
- if ( $inhalt == '' )
- $inhalt = $this->element->defaultText;
-
- // Wenn HTML nicht erlaubt ist, dann die HTML-Tags ersetzen
- if ( !$this->element->html )
- {
- //$inhalt = htmlentities($inhalt);
-
- $inhalt = str_replace('<','<' ,$inhalt);
- $inhalt = str_replace('>','>' ,$inhalt);
- $inhalt = str_replace('>','&',$inhalt);
- }
-
- // Schnellformatierung ('Wiki') durchführen
- if ( $this->element->wiki )
- {
- $inhalt = $this->decode_wiki( $inhalt );
- }
-
- if ( $this->simple )
- {
- $inhalt = strip_tags( $inhalt );
- $inhalt = str_replace( "\n",'',$inhalt );
- $inhalt = str_replace( "\r",'',$inhalt );
- }
-
- break;
-
-
- // Zahl
- //
- // wird im entsprechenden Format angezeigt.
- case 'number':
-
- $number = $this->number / pow(10,$this->element->decimals);
- $inhalt = number_format( $number,$this->element->decimals,$this->element->decPoint,$this->element->thousandSep );
-
- break;
-
-
- // Datum
- case 'date':
-
- $date = $this->date;
- if ( intval($date) == 0 )
- $date = time();
-
- $inhalt = date( $this->element->dateformat,$date );
-
- break;
-
-
- // Programmcode (PHP)
- case 'code':
-
- $this->page->load();
-
- Api::delOutput('');
- Api::setObjectId( $this->page->objectid ); // haesslich :-/
- $code = "<?php\n".$this->element->code."\n?>";
- $tmp = $conf_tmpdir.'/'.md5($this->element->elementid).'.tmp';
- $f = fopen( $tmp,'w' );
- fwrite( $f,$code );
- fclose( $f );
-
- require( $tmp ); // Ausfuehren des temporaeren PHP-Codes
-
- $inhalt = Api::getOutput();
-
- break;
-
-
- // Info-Feld als Datum
- case 'infodate':
-
- switch( $this->element->subtype )
- {
- case 'date_published':
- $inhalt = date( $this->element->dateformat );
- break;
-
- case 'date_saved':
- $inhalt = date( $this->element->dateformat,$this->page->lastchange_date );
- break;
-
- case 'date_created':
- $inhalt = date( $this->element->dateformat,$this->page->create_date );
- break;
-
- default:
- $inhalt = 'please select subtype. unknown: '.$this->element->subtype;
- }
-
- break;
-
-
- // Info-Feld
- case 'info':
-
- switch( $this->element->subtype )
- {
- case 'db_id':
- $inhalt = $SESS['dbid'];
- break;
- case 'db_name':
- $inhalt = $conf['database_'.$SESS['dbid']]['comment'];
- break;
- case 'project_id':
- $inhalt = $this->page->projectid;
- break;
- case 'project_name':
- $project = new Project( $this->page->projectid );
- $project->load();
- $inhalt = $project->name;
- break;
- case 'language_id':
- $inhalt = $this->page->languageid;
- break;
- case 'language_iso':
- $language = new Language( $this->page->languageid );
- $language->load();
- $inhalt = $language->isoCode;
- break;
- case 'language_name':
- $language = new Language( $this->page->languageid );
- $language->load();
- $inhalt = $language->name;
- break;
- case 'page_id':
- $inhalt = $this->page->objectid;
- break;
- case 'page_name':
- $inhalt = $this->page->name;
- break;
- case 'page_desc':
- $inhalt = $this->page->desc;
- break;
- case 'page_fullfilename':
- $inhalt = $this->page->full_filename();
- break;
- case 'page_filename':
- $inhalt = $this->page->filename;
- break;
- case 'page_extension':
- $inhalt = '';
- break;
- case 'edit_url':
- $inhalt = Html::url(array('objectid'=>$this->page->objectid,'dbid'=>$SESS['dbid']));
- break;
- case 'edit_fullurl':
- $inhalt = 'http://';
- $inhalt .= getenv('SERVER_NAME');
- $inhalt .= dirname(getenv('SCRIPT_NAME'));
- $inhalt .= '/'.Html::url(array('objectid'=>$this->page->objectid,'dbid'=>$SESS['dbid']));;
- break;
- case 'lastch_user_username':
- $user = new User($this->page->lastchange_userid);
- $user->load();
- $inhalt = $user->name;
- break;
- case 'lastch_user_fullname':
- $user = new User($this->page->lastchange_userid);
- $user->load();
- $inhalt = $user->fullname;
- break;
- case 'lastch_user_mail':
- $user = new User($this->page->lastchange_userid);
- $user->load();
- $inhalt = $user->mail;
- break;
- case 'lastch_user_desc':
- $user = new User($this->page->lastchange_userid);
- $user->load();
- $inhalt = $user->desc;
- break;
- case 'lastch_user_tel':
- $user = new User($this->page->lastchange_userid);
- $user->load();
- $inhalt = $user->tel;
- break;
-
- case 'create_user_username':
- $user = new User($this->page->create_userid);
- $user->load();
- $inhalt = $user->name;
- break;
- case 'create_user_fullname':
- $user = new User($this->page->create_userid);
- $user->load();
- $inhalt = $user->fullname;
- break;
- case 'create_user_mail':
- $user = new User($this->page->create_userid);
- $user->load();
- $inhalt = $user->mail;
- break;
- case 'create_user_desc':
- $user = new User($this->page->create_userid);
- $user->load();
- $inhalt = $user->desc;
- break;
- case 'create_user_tel':
- $user = new User($this->page->create_userid);
- $user->load();
- $inhalt = $user->tel;
- break;
-
- case 'act_user_username':
- $user = new User($SESS['user']['id']);
- $user->load();
- $inhalt = $user->name;
- break;
- case 'act_user_fullname':
- $user = new User($SESS['user']['id']);
- $user->load();
- $inhalt = $user->fullname;
- break;
- case 'act_user_mail':
- $user = new User($SESS['user']['id']);
- $user->load();
- $inhalt = $user->mail;
- break;
- case 'act_user_desc':
- $user = new User($SESS['user']['id']);
- $user->load();
- $inhalt = $user->desc;
- break;
- case 'act_user_tel':
- $user = new User($SESS['user']['id']);
- $user->load();
- $inhalt = $user->tel;
- break;
- default:
- $inhalt = 'please select subtype. unknown: '.$this->element->subtype;
- }
- break;
- }
-
- if ( $this->page->icons && $this->element->withIcon )
- $inhalt = '<a href="'.Html::url(array('action'=>'pageelement','elementid'=>$this->element->elementid,'objectid'=>$this->page->objectid,'subaction'=>'edit')).'" title="'.$this->element->desc.'" target="cms_main_main"><img src="'.$conf['directories']['themedir'].'/images/icon_el_'.$this->element->type.'.png" border="0" align="left"></a>'.$inhalt;
-
- $this->value = $inhalt;
- }
-
-
- /**
- * Es werden Objekte mit einem Inhalt
- * @param String Suchbegriff
- * @return Array Liste der gefundenen Objekt-IDs
- */
- function getObjectIdsByValue( $text )
- {
- $db = db_connection();
-
- $sql = new Sql( 'SELECT {t_object}.id FROM {t_value} '.
- ' LEFT JOIN {t_page} '.
- ' ON {t_page}.id={t_value}.pageid '.
- ' LEFT JOIN {t_object} '.
- ' ON {t_object}.id={t_page}.objectid '.
- ' WHERE {t_value}.text LIKE {text}'.
- ' AND {t_value}.languageid={languageid}' );
- $sql->setInt ( 'languageid',$this->languageid );
- $sql->setString( 'text' ,'%'.$text.'%' );
-
- return $db->getCol( $sql->query );
- }
-
-
- /**
- * Es werden Objekte mit einer UserId ermittelt
- * @param Integer Benutzer-Id der letzten Änderung
- * @return Array Liste der gefundenen Objekt-IDs
- */
- function getObjectIdsByLastChangeUserId( $userid )
- {
-
- $db = db_connection();
-
- $sql = new Sql( 'SELECT {t_object}.id FROM {t_value} '.
- ' LEFT JOIN {t_page} '.
- ' ON {t_page}.id={t_value}.pageid '.
- ' LEFT JOIN {t_object} '.
- ' ON {t_object}.id={t_page}.objectid '.
- ' WHERE {t_value}.lastchange_userid={userid}'.
- ' AND {t_value}.languageid={languageid}' );
- $sql->setInt ( 'languageid',$this->languageid );
- $sql->setInt ( 'userid' ,$userid );
-
- return $db->getCol( $sql->query );
- }
+//
+// Revision 1.8 2004/05/03 21:15:30 dankert
+// Umstellung auf dezimale ASCII-Werte
+//
+// Revision 1.7 2004/05/03 20:21:49 dankert
+// setzen von ObjectId bei Code-Elementen
+//
+// Revision 1.6 2004/05/02 14:41:31 dankert
+// Einf?gen package-name (@package)
+//
+// Revision 1.5 2004/05/02 12:01:33 dankert
+// Funktion release() zum freigeben von Inhalten
+//
+// Revision 1.4 2004/05/02 11:40:00 dankert
+// Freigabestatus der Seiteninhalte verarbeiten
+//
+// Revision 1.3 2004/04/24 18:11:28 dankert
+// Info-elemente
+//
+// Revision 1.2 2004/04/24 15:28:17 dankert
+// Korrektur: relative Pfad bei Listen
+//
+// Revision 1.1 2004/04/24 15:15:12 dankert
+// Initiale Version
+//
+// Revision 1.1 2004/03/13 23:09:48 dankert
+// *** empty log message ***
+//
+// ---------------------------------------------------------------------------
+
+
+/**
+ * Darstellen einer Inhaltes
+ *
+ * @version $Revision$
+ * @author $Author$
+ * @package openrat.objects
+ */
+
+class Value
+{
+ /**
+ * ID dieser Inhaltes
+ * @type Integer
+ */
+ var $valueid=0;
+
+ /**
+ * Seiten-Objekt der ?bergeordneten Seite
+ * @type Object
+ */
+ var $page;
+
+ /**
+ * Objekt-ID, auf die verlinkt wird
+ * @type Integer
+ */
+ var $linkToObjectId;
+
+ /**
+ * Text-Inhalt
+ * @type String
+ */
+ var $text;
+
+ /**
+ * Zahl. Auch Flie?kommazahlen werden als Ganzzahl gespeichert
+ * @type Integer
+ */
+ var $number;
+
+
+ /**
+ * Datum als Unix-Timestamp
+ * @type Integer
+ */
+ var $date;
+
+ /**
+ * Element-Objekt
+ * @type Object
+ */
+ var $element;
+
+ /**
+ * Der eigentliche Inhalt des Elementes
+ * @type String
+ */
+ var $value;
+
+ /**
+ * TimeStamp der letzten ?nderung
+ * @type Integer
+ */
+ var $lastchangeTimeStamp;
+
+ /**
+ * Benutzer-ID der letzten ?nderung
+ * @type Integer
+ */
+ var $lastchangeUserId;
+
+ /**
+ * Schalter, ob dieser Inhalt der aktive Inhalt ist
+ * @type Boolean
+ */
+ var $active;
+
+ /**
+ * Schalter, ob dieser Inhalt der Inhalt ist, der veroeffentlicht
+ * werden soll
+ * @type Boolean
+ */
+ var $publish;
+
+ /**
+ * Konstruktor
+ */
+ function Value()
+ {
+ global $SESS;
+
+ $this->lastchangeUserId = 0;
+ $this->lastchangeTimeStamp = 0;
+
+ $this->languageid = $SESS['languageid'];
+ }
+
+
+ /**
+ * Umwandeln von Wiki-Textauszeichnungen in HTML-Auszeichnungen
+ *
+ * @param text zu bearbeitender Text
+ * @param html Boolean, ob HTML-Tags erlaubt sind
+ *
+ * @return String Ausgabe
+ */
+ function decode_wiki( $text,$html=false )
+ {
+ global $conf_languagedir,
+ $conf_php;
+
+ $ini_chars = parse_ini_file( $conf_languagedir.'/specialchars.ini.'.$conf_php );
+
+ $neu = array();
+
+ $toc = array();
+ $tocid = 0;
+
+ $pre = false;
+ $quote = false;
+ $br = false;
+ $ul = false;
+ $ol = false;
+ $li = true;
+ $level = 0;
+ $lis = array();
+ $table = false;
+ $p = false;
+
+ // Links
+ if ( $this->element->html )
+ $pf = '>';
+ else $pf = '>';
+
+ if ( $this->element->html )
+ $pf = '>';
+ else $pf = '>';
+
+ // Zeichenkette in die einzelnen Zeilen zerlegen
+ $zeilen = explode("\n",$text);
+
+ foreach( $zeilen as $zeile )
+ {
+ # Leer- und Sonderzeichen am Zeilenende entfernen
+ $zeile = chop( $zeile );
+
+ // Backtick am Zeilenbeginn schaltet Wikiauszeichnungen aus
+ if ( substr($zeile,0,1) == '`' && !$pre )
+ {
+ $zeile = substr($zeile,1);
+ $nowiki = true;
+ }
+ else
+ {
+ $nowiki = false;
+ }
+
+ // Zitat Anfang
+ if ( $zeile == $pf && !$quote && !$pre )
+ {
+ if ( $p )
+ {
+ $neu[] = '</p>';
+ $p = false;
+ }
+
+ $zeile = '<blockquote>';
+ $quote = true;
+ }
+
+ // Zitat Ende
+ if ( $zeile == $pf && $quote && !$pre )
+ {
+ if ( $p )
+ {
+ $neu[] = '</p>';
+ $p = false;
+ }
+ $zeile = '</blockquote>';
+ $quote = false;
+ }
+
+ // Pr?formatierter Text Anfang
+ if ( $zeile == '=' && !$pre )
+ {
+ if ( $p )
+ {
+ $neu[] = '</p>';
+ $p = false;
+ }
+
+ $zeile = '<pre>';
+ $pre = true;
+ }
+
+ // Pr?formatierter Text Ende
+ if ( $zeile == '=' && $pre )
+ {
+ $zeile = '</pre>';
+ $pre = false;
+ }
+
+
+ // ?berschriften
+ if ( preg_match('/^([+]{1,}) ?(.*)/',$zeile,$match) && !$nowiki && !$pre && !$quote )
+ {
+ if ( $p )
+ {
+ $neu[] = '</p>';
+ $p = false;
+ }
+
+ $tocid++;
+ $hlev = strlen($match[1]);
+ $toc[] = array('level'=>$hlev,'id'=>$tocid,'text'=>$match[2]);
+ $zeile = '<h'.$hlev.'><a name="toc'.$tocid.'"></a>'.$match[2].'</h'.$hlev.'>';
+ }
+
+ // Bei pr?formatierem Text keine weiteren Formatierungen durchf?hren
+ if ( !$pre )
+ {
+ // Tabellen
+ $beg = substr($zeile,0,1);
+
+ if ( $beg == '|' )
+ {
+ if ( !$table )
+ {
+ if ( $p )
+ {
+ $neu[] = '</p>';
+ $p = false;
+ }
+
+ $neu[] = '<table>';
+ $table = true;
+ }
+
+ $zeile = ereg_replace( '^\|','<tr><td>',$zeile );
+ $zeile = ereg_replace( '\|?$','</td></tr>',$zeile );
+ $zeile = str_replace( '|','</td><td>',$zeile );
+
+ // Spalten?bergreifende Zellen
+ $zeile = str_replace('<td></td><td>','<td colspan\="2">',$zeile);
+ for( $i=2; $i<=10; $i++)
+ $zeile = str_replace('</td><td colspan\="'.$i.'"></td><td>','</td><td colspan\="'.($i+1).'">',$zeile);
+
+ // Spalten-?berschriften <th>
+ $zeile = eregi_replace( '<td([^<]*)>!([^<]+)</td>','<th\\1>\\2</th>',$zeile );
+
+ // CSS-Klassen
+ $zeile = eregi_replace( '<t([dh][^<]*)>\(([a-zA-Z0-9]+)\)([^<]+)</td>','<t\\1 class\="\\2">\\3</td>',$zeile );
+ }
+ else
+ {
+ if( $table )
+ {
+ $table = false;
+ $neu[] = '</table>';
+ }
+ }
+
+
+ // Aufz?hlungen
+ if ( preg_match('/^( *)([\*#-]) (.*)/',$zeile,$match) && !$nowiki )
+ {
+ if ( $p )
+ {
+ $neu[] = '</p>';
+ $p = false;
+ }
+
+ $lev = strlen($match[1])+1;
+ $type = $match[2];
+ $text = $match[3];
+
+ if ( $level == $lev ) $neu[] = '</li>';
+
+ while( $level < $lev )
+ {
+ $level++;
+
+ if ( $match[2]=='#')
+ $neu[] = '<ol class="level'.$level.'">';
+ else $neu[] = '<ul class="level'.$level.'">';
+
+ $lis[$level] = $match[2];
+ }
+
+ while( $level > $lev )
+ {
+ $neu[] = '</li>';
+ if ( $lis[$level]=='#')
+ $neu[] = '</ol>';
+ else $neu[] = '</ul>';
+
+ $level--;
+ }
+
+ $zeile = '<li>'.$text;
+ }
+ else
+ {
+ while( $level > 0 )
+ {
+ if ( $lis[$level]=='#')
+ $neu[] = '</ol>';
+ else $neu[] = '</ul>';
+ $level--;
+ }
+ }
+ }
+
+
+ // Abs?tze einrichten
+ if (!$pre && !$ol && !$ul && !$table && substr($zeile,0,1)!='<' )
+ {
+ if ( $zeile != '' && $p )
+ {
+ $neu[] = '<br/>';
+ }
+
+ if ( $zeile == '' && $p )
+ {
+ $neu[] = '</p>';
+ $p = false;
+ }
+
+ if ( $zeile != '' && !$p )
+ {
+ $neu[] = '<p>';
+ $p = true;
+ }
+ }
+
+
+
+ // Textauszeichnungen fett,kursiv,fest
+ if ( !$pre && !$nowiki ) // nicht bei pr?formatiertem Text
+ {
+ // *Fett*
+ //$zeile = ereg_replace( '\*([^*]+[^\\])\*' , '<strong>\\1</strong>' , $zeile );
+ $zeile = preg_replace( '/\*([^*]+[^\\\\]+)\*/' , '<strong>\\1</strong>' , $zeile );
+
+ // kursiv
+ $zeile = ereg_replace( '_([^_]+[^\\])_' , '<em>\\1</em>' , $zeile );
+
+ // feste Breite
+ $zeile = ereg_replace( '=([^=]+[^\\])=' , '<tt>\\1</tt>' , $zeile );
+
+ // Text->... umsetzen nach "Text"->... (Anfuehrungszeichen ergaenzen)
+ $zeile = ereg_replace( '([A-Za-z0-9._????????-]+)-'.$pf, '"\\1"-'.$pf, $zeile );
+
+ // ...->Link umsetzen nach ...->"Link" (Anfuehrungszeichen ergaenzen)
+ $zeile = ereg_replace( '-'.$pf.'([A-Za-z0-9.:_\/\,\?\=\&-]+)', '-'.$pf.'"\\1"',$zeile );
+
+ # Links ...->"nnn" ersetzen mit ...->"object:nnn"
+ $zeile = ereg_replace( '-'.$pf.'\"([0-9]+)\"', '-'.$pf.'"object:\\1"', $zeile );
+
+ // Links ->... url-kodieren
+// preg_match_all( '|-'.$pf.'\"([^\"]+)\"|',$zeile,$urls,PREG_SET_ORDER );
+// foreach( $urls as $url )
+// {
+// echo $url[1];
+// $urlneu = urlencode( $url[1] );
+// echo "wird zu $urlneu<br>";
+// $zeile = str_replace( $url[0],'-'.$pf.'"'.$urlneu.'"',$zeile );
+// }
+
+ # Links "mit->..."
+ $zeile = ereg_replace( '\"([^\"]+)\"-'.$pf.'\"([^\"]+)\"', '<a href="\\2">\\1</a>', $zeile );
+
+ // alleinstehende externe Links
+ $zeile = ereg_replace( '([^"])((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]*))', '\\1<a href="\\2">\\4</a>', $zeile );
+ $zeile = ereg_replace( '^((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]*))', '<a href="\\1">\\3</a>', $zeile );
+
+ // Einbinden von Bildern
+ $zeile = ereg_replace( '(ima?ge?):\/?\/?(([0-9]+))(\{.*\})?', '<img src="object:\\2" alt="" />', $zeile );
+
+ # mailto:...-Links
+ $zeile = ereg_replace( '([A-Za-z0-9._-]+@[A-Za-z0-9._-]+)', '<a href="mailto:\\1">\\1</a>', $zeile );
+
+ // Links object:nnn ersetzen
+ preg_match_all( '|object:([0-9]+)|',$zeile,$objects,PREG_SET_ORDER );
+ foreach( $objects as $object )
+ {
+ $var = $this->page->path_to_object( $object[1] );
+ $zeile = str_replace( $object[0],$var,$zeile );
+ }
+
+ $zeile = ereg_replace( '([^\\\\])\\\\','\\1', $zeile );
+ }
+ $neu[] = $zeile;
+ }
+
+ if ( $ol ) $neu[] = '</ol>';
+ if ( $ul ) $neu[] = '</ul>';
+ if ( $table ) $neu[] = '</table>';
+ if ( $pre ) $neu[] = '</pre>';
+ if ( $p ) $neu[] = '</p>';
+
+
+ $text = implode("\n",$neu);
+
+ // Inhaltsverzeichnis
+
+ $toctext = array();
+ foreach( $toc as $t )
+ {
+ if ($t['level'] == 1 && count($toctext)>0) $toctext[] = '';
+ $toctext[] = str_repeat(' ',$t['level']*2).'<a href="#toc'.$t['id'].'">'.$t['text'].'</a>';
+ }
+ $text = str_replace( '##TOC##',implode("<br/>\n",$toctext),$text ); // Inhaltsverzeichnis einf?gen
+
+ foreach( $ini_chars as $key=>$val)
+ {
+ $text = str_replace( chr($key),$val,$text );
+ }
+
+ return $text;
+ }
+
+
+ function path_to_page( $pageid )
+ {
+ return $this->page->path_to_object( $pageid );
+ }
+ function path_to_object( $pageid )
+ {
+ return $this->path_to_page( $pageid );
+ }
+
+
+ /**
+ * Laden des aktuellen Inhaltes aus der Datenbank
+ */
+ function load()
+ {
+ $db = db_connection();
+
+ if ( $this->publish )
+ $sql = new Sql( 'SELECT * FROM {t_value}'.
+ ' WHERE elementid ={elementid}'.
+ ' AND pageid ={pageid}'.
+ ' AND languageid={languageid}'.
+ ' AND publish=1' );
+ else $sql = new Sql( 'SELECT * FROM {t_value}'.
+ ' WHERE elementid ={elementid}'.
+ ' AND pageid ={pageid}'.
+ ' AND languageid={languageid}'.
+ ' AND active=1' );
+ $sql->setInt( 'elementid' ,$this->element->elementid );
+ $sql->setInt( 'pageid' ,$this->pageid );
+ $sql->setInt( 'languageid',$this->languageid);
+ $row = $db->getRow( $sql->query );
+
+ $this->text = $row['text'];
+ $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']);
+ }
+
+
+ /**
+ * Laden eines bestimmten Inhaltes aus der Datenbank
+ */
+ function loadWithId()
+ {
+ $db = db_connection();
+
+ $sql = new Sql( 'SELECT * FROM {t_value}'.
+ ' WHERE id={valueid}' );
+ $sql->setInt( 'valueid',$this->valueid);
+ $row = $db->getRow( $sql->query );
+
+ $this->text = $row['text'];
+ $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']);
+ }
+
+
+ /**
+ * Alle Versionen des aktuellen Inhaltes werden ermittelt
+ * @return Array
+ */
+ function getVersionList()
+ {
+ $db = db_connection();
+
+ $sql = new Sql( 'SELECT id FROM {t_value}'.
+ ' WHERE elementid ={elementid}'.
+ ' AND pageid ={pageid}'.
+ ' AND languageid={languageid}'.
+ ' ORDER BY lastchange_date' );
+ $sql->setInt( 'elementid' ,$this->element->elementid );
+ $sql->setInt( 'pageid' ,$this->pageid );
+ $sql->setInt( 'languageid',$this->languageid);
+
+ return $db->getCol( $sql->query );
+ }
+
+
+ /**
+ * Inhalt freigeben
+ */
+ function release()
+ {
+ $db = db_connection();
+
+ $sql = new Sql( 'UPDATE {t_value}'.
+ ' SET publish=0'.
+ ' WHERE elementid ={elementid}'.
+ ' AND pageid ={pageid}'.
+ ' AND languageid={languageid}' );
+ $sql->setInt( 'elementid' ,$this->element->elementid );
+ $sql->setInt( 'pageid' ,$this->pageid );
+ $sql->setInt( 'languageid',$this->languageid);
+
+ $db->query( $sql->query );
+
+ $sql = new Sql( 'UPDATE {t_value}'.
+ ' SET publish=1'.
+ ' WHERE active = 1'.
+ ' AND elementid ={elementid}'.
+ ' AND pageid ={pageid}'.
+ ' AND languageid={languageid}' );
+ $sql->setInt( 'elementid' ,$this->element->elementid );
+ $sql->setInt( 'pageid' ,$this->pageid );
+ $sql->setInt( 'languageid',$this->languageid);
+
+ $db->query( $sql->query );
+ }
+
+ /**
+ * Inhalt speichern
+ */
+ function save()
+ {
+ global $SESS;
+ $db = db_connection();
+
+ $sql = new Sql( 'UPDATE {t_value}'.
+ ' SET active=0'.
+ ' WHERE elementid ={elementid}'.
+ ' AND pageid ={pageid}'.
+ ' AND languageid={languageid}' );
+ $sql->setInt( 'elementid' ,$this->element->elementid );
+ $sql->setInt( 'pageid' ,$this->pageid );
+ $sql->setInt( 'languageid',$this->languageid);
+
+ $db->query( $sql->query );
+
+ if ( $this->publish )
+ {
+ // Wenn Inhalt sofort veroeffentlicht werden kann, dann
+ // alle anderen Inhalte auf nicht-veroeffentlichen stellen
+ $sql = new Sql( 'UPDATE {t_value}'.
+ ' SET publish=0'.
+ ' WHERE elementid ={elementid}'.
+ ' AND pageid ={pageid}'.
+ ' AND languageid={languageid}' );
+ $sql->setInt( 'elementid' ,$this->element->elementid );
+ $sql->setInt( 'pageid' ,$this->pageid );
+ $sql->setInt( 'languageid',$this->languageid);
+
+ $db->query( $sql->query );
+ }
+
+ // Naechste ID aus Datenbank besorgen
+ $sql = new Sql('SELECT MAX(id) FROM {t_value}');
+ $this->valueid = intval($db->getOne($sql->query))+1;
+
+ $sql->setQuery( 'INSERT INTO {t_value}'.
+ ' (id,linkobjectid,text,number,date,elementid,pageid,languageid,active,publish,lastchange_date,lastchange_userid)'.
+ ' VALUES ({valueid},{linkobjectid},{text},{number},{date},{elementid},{pageid},{languageid},1,{publish},{lastchange_date},{lastchange_userid})' );
+
+ $sql->setInt( 'valueid' ,$this->valueid );
+ $sql->setInt( 'elementid' ,$this->element->elementid );
+ $sql->setInt( 'pageid' ,$this->pageid );
+ $sql->setInt( 'languageid',$this->languageid );
+
+ if ( intval($this->linkToObjectId)==0)
+ $sql->setNull ( 'linkobjectid' );
+ else $sql->setInt ( 'linkobjectid',$this->linkToObjectId );
+
+ if ( $this->text == '' )
+ $sql->setNull ( 'text' );
+ else $sql->setString( 'text',$this->text );
+
+ if ( intval($this->number)==0)
+ $sql->setNull ( 'number' );
+ else $sql->setInt ( 'number',$this->number );
+
+ if ( intval($this->date)==0)
+ $sql->setNull ( 'date' );
+ else $sql->setInt ( 'date',$this->date );
+
+ $sql->setBoolean( 'publish' ,$this->publish );
+ $sql->setInt ( 'lastchange_date' ,time() );
+ $sql->setInt ( 'lastchange_userid',$SESS['user']['userid'] );
+
+ $db->query( $sql->query );
+ }
+
+
+ /**
+ * Diesen Inhalt l?schen
+ */
+ function delete()
+ {
+ $db = db_connection();
+ $sql = new Sql( 'DELETE * FROM {t_value}'.
+ ' WHERE elementid ={elementid}'.
+ ' AND pageid ={pageid}'.
+ ' AND languageid={languageid}' );
+ $sql->setInt( 'elementid' ,$this->element->elementid );
+ $sql->setInt( 'pageid' ,$this->pageid );
+ $sql->setInt( 'languageid',$this->languageid);
+ $row = $db->getRow( $sql->query );
+ }
+
+
+ /**
+ * Diese Methode erzeugt fuer alle Elementtypen den Inhalt
+ */
+ function generate()
+ {
+ if ( intval($this->valueid)==0 )
+ $this->load();
+ $db = db_connection();
+ global $conf,
+ $conf_tmpdir,
+ $SESS;
+
+ $inhalt = '';
+
+ Logger::debug('Generating Element '.$this->element->name.', type='.$this->element->type );
+ switch( $this->element->type )
+ {
+ case 'list':
+
+ $objectid = $this->linkToObjectId;
+ $this->page->up_path();
+
+ if ( intval($objectid) == 0 )
+ $objectid = $this->element->defaultObjectId;
+
+ if ( $this->simple )
+ {
+ $f = new Folder( $objectid );
+ $f->load();
+ $inhalt = $f->name;
+ unset( $f );
+ }
+ else
+ {
+ if ( $objectid != $this->page->objectid ) // Rekursion vermeiden
+ {
+ $f = new Folder( $objectid );
+ foreach( $f->getObjectIds() as $oid )
+ {
+ if ( $oid != $this->page->objectid ) // Rekursion vermeiden
+ {
+ $o = new Object( $oid );
+ $o->load();
+ switch( $o->getType() )
+ {
+ case 'page':
+ $p = new Page( $oid );
+ $p->public = $this->page->public;
+ $p->up_path = $this->page->up_path();
+ $p->projectmodelid = $this->page->projectmodelid;
+ $p->languageid = $this->languageid;
+ $p->load();
+ $p->generate();
+ $inhalt .= $p->value;
+ unset( $p );
+ break;
+ case 'link':
+ $l = new Link( $oid );
+ $l->load();
+ if ( $l->isLinkToObject )
+ {
+ $op = new Object( $l->linkedObjectId );
+ $op->load();
+ if ( $op->isPage )
+ {
+ $p = new Page( $l->linkedObjectId );
+ $p->public = $this->page->public;
+ $p->up_path = $this->page->up_path();
+ $p->projectmodelid = $this->page->projectmodelid;
+ $p->languageid = $this->languageid;
+ $p->load();
+ $p->generate();
+ $inhalt .= $p->value;
+ unset( $p );
+ }
+ }
+ break;
+ }
+ }
+ else die('FATAL: recursion detected');
+ }
+ }
+ else die('FATAL: recursion detected');
+ }
+
+ if ( $this->simple )
+ {
+ $inhalt = strip_tags( $inhalt );
+ $inhalt = str_replace( "\n",'',$inhalt );
+ $inhalt = str_replace( "\r",'',$inhalt );
+ }
+
+ break;
+
+
+ case 'link':
+
+ $objectid = $this->linkToObjectId;
+
+ if ( intval($objectid) == 0 )
+ $objectid = $this->element->defaultObjectId;
+
+ if ( $this->simple )
+ {
+ $p = new Page( $objectid );
+ $p->load();
+ $inhalt = $p->name;
+ }
+ else
+ {
+ $inhalt = $this->page->path_to_object( $objectid );
+ }
+
+ break;
+
+
+ case 'longtext':
+ case 'text':
+ case 'select':
+
+ $inhalt = $this->text;
+
+ if ( $inhalt == '' )
+ $inhalt = $this->element->defaultText;
+
+ // Wenn HTML nicht erlaubt ist, dann die HTML-Tags ersetzen
+ if ( !$this->element->html )
+ {
+ //$inhalt = htmlentities($inhalt);
+
+ $inhalt = str_replace('<','<' ,$inhalt);
+ $inhalt = str_replace('>','>' ,$inhalt);
+ $inhalt = str_replace('>','&',$inhalt);
+ }
+
+ // Schnellformatierung ('Wiki') durchf?hren
+ if ( $this->element->wiki )
+ {
+ $inhalt = $this->decode_wiki( $inhalt );
+ }
+
+ if ( $this->simple )
+ {
+ $inhalt = strip_tags( $inhalt );
+ $inhalt = str_replace( "\n",'',$inhalt );
+ $inhalt = str_replace( "\r",'',$inhalt );
+ }
+
+ break;
+
+
+ // Zahl
+ //
+ // wird im entsprechenden Format angezeigt.
+ case 'number':
+
+ $number = $this->number / pow(10,$this->element->decimals);
+ $inhalt = number_format( $number,$this->element->decimals,$this->element->decPoint,$this->element->thousandSep );
+
+ break;
+
+
+ // Datum
+ case 'date':
+
+ $date = $this->date;
+ if ( intval($date) == 0 )
+ $date = time();
+
+ $inhalt = date( $this->element->dateformat,$date );
+
+ break;
+
+
+ // Programmcode (PHP)
+ case 'code':
+
+ $this->page->load();
+
+ Api::delOutput('');
+ Api::setObjectId( $this->page->objectid ); // haesslich :-/
+ $code = "<?php\n".$this->element->code."\n?>";
+ $tmp = $conf_tmpdir.'/'.md5($this->element->elementid).'.tmp';
+ $f = fopen( $tmp,'w' );
+ fwrite( $f,$code );
+ fclose( $f );
+
+ require( $tmp ); // Ausfuehren des temporaeren PHP-Codes
+
+ $inhalt = Api::getOutput();
+
+ break;
+
+
+ // Programmcode (PHP)
+ case 'dynamic':
+
+ $this->page->load();
+
+ $className = $this->element->subtype;
+ $fileName = './dynamicClasses/'.$className.'.class.php';
+ if ( is_file( $fileName ) )
+ {
+ // Fuer den Fall, dass eine Dynamic-Klasse mehrmals pro Vorlage auftritt
+ if ( !class_exists($className) )
+ require( $fileName );
+
+ if ( class_exists($className) )
+ {
+ $dynEl = new $className;
+ $dynEl->page = &$this->page;
+
+ if ( method_exists( $dynEl,'execute' ) )
+ {
+ $dynEl->api = new Api();
+ $dynEl->api->delOutput('');
+ $dynEl->api->objectid = $this->page->objectid;
+ $dynEl->api->page = &$this->page;
+
+ $dynEl->execute();
+ $inhalt = $dynEl->api->getOutput();
+ }
+ else
+ {
+ Logger::warn("WARNING: Class $className has no execute()-Method" );
+ }
+ }
+ else
+ {
+ Logger::warn("WARNING: Class $className not found" );
+ }
+ }
+ else
+ {
+ Logger::warn("WARNING: File $fileName not found" );
+ }
+
+ break;
+
+
+ // Info-Feld als Datum
+ case 'infodate':
+
+ switch( $this->element->subtype )
+ {
+ case 'date_published':
+ $inhalt = date( $this->element->dateformat );
+ break;
+
+ case 'date_saved':
+ $inhalt = date( $this->element->dateformat,$this->page->lastchange_date );
+ break;
+
+ case 'date_created':
+ $inhalt = date( $this->element->dateformat,$this->page->create_date );
+ break;
+
+ default:
+ $inhalt = 'please select subtype. unknown: '.$this->element->subtype;
+ }
+
+ break;
+
+
+ // Info-Feld
+ case 'info':
+
+ switch( $this->element->subtype )
+ {
+ case 'db_id':
+ $inhalt = $SESS['dbid'];
+ break;
+ case 'db_name':
+ $inhalt = $conf['database_'.$SESS['dbid']]['comment'];
+ break;
+ case 'project_id':
+ $inhalt = $this->page->projectid;
+ break;
+ case 'project_name':
+ $project = new Project( $this->page->projectid );
+ $project->load();
+ $inhalt = $project->name;
+ break;
+ case 'language_id':
+ $inhalt = $this->page->languageid;
+ break;
+ case 'language_iso':
+ $language = new Language( $this->page->languageid );
+ $language->load();
+ $inhalt = $language->isoCode;
+ break;
+ case 'language_name':
+ $language = new Language( $this->page->languageid );
+ $language->load();
+ $inhalt = $language->name;
+ break;
+ case 'page_id':
+ $inhalt = $this->page->objectid;
+ break;
+ case 'page_name':
+ $inhalt = $this->page->name;
+ break;
+ case 'page_desc':
+ $inhalt = $this->page->desc;
+ break;
+ case 'page_fullfilename':
+ $inhalt = $this->page->full_filename();
+ break;
+ case 'page_filename':
+ $inhalt = $this->page->filename;
+ break;
+ case 'page_extension':
+ $inhalt = '';
+ break;
+ case 'edit_url':
+ $inhalt = Html::url(array('objectid'=>$this->page->objectid,'dbid'=>$SESS['dbid']));
+ break;
+ case 'edit_fullurl':
+ $inhalt = 'http://';
+ $inhalt .= getenv('SERVER_NAME');
+ $inhalt .= dirname(getenv('SCRIPT_NAME'));
+ $inhalt .= '/'.Html::url(array('objectid'=>$this->page->objectid,'dbid'=>$SESS['dbid']));;
+ break;
+ case 'lastch_user_username':
+ $user = new User($this->page->lastchange_userid);
+ $user->load();
+ $inhalt = $user->name;
+ break;
+ case 'lastch_user_fullname':
+ $user = new User($this->page->lastchange_userid);
+ $user->load();
+ $inhalt = $user->fullname;
+ break;
+ case 'lastch_user_mail':
+ $user = new User($this->page->lastchange_userid);
+ $user->load();
+ $inhalt = $user->mail;
+ break;
+ case 'lastch_user_desc':
+ $user = new User($this->page->lastchange_userid);
+ $user->load();
+ $inhalt = $user->desc;
+ break;
+ case 'lastch_user_tel':
+ $user = new User($this->page->lastchange_userid);
+ $user->load();
+ $inhalt = $user->tel;
+ break;
+
+ case 'create_user_username':
+ $user = new User($this->page->create_userid);
+ $user->load();
+ $inhalt = $user->name;
+ break;
+ case 'create_user_fullname':
+ $user = new User($this->page->create_userid);
+ $user->load();
+ $inhalt = $user->fullname;
+ break;
+ case 'create_user_mail':
+ $user = new User($this->page->create_userid);
+ $user->load();
+ $inhalt = $user->mail;
+ break;
+ case 'create_user_desc':
+ $user = new User($this->page->create_userid);
+ $user->load();
+ $inhalt = $user->desc;
+ break;
+ case 'create_user_tel':
+ $user = new User($this->page->create_userid);
+ $user->load();
+ $inhalt = $user->tel;
+ break;
+
+ case 'act_user_username':
+ $user = new User($SESS['user']['id']);
+ $user->load();
+ $inhalt = $user->name;
+ break;
+ case 'act_user_fullname':
+ $user = new User($SESS['user']['id']);
+ $user->load();
+ $inhalt = $user->fullname;
+ break;
+ case 'act_user_mail':
+ $user = new User($SESS['user']['id']);
+ $user->load();
+ $inhalt = $user->mail;
+ break;
+ case 'act_user_desc':
+ $user = new User($SESS['user']['id']);
+ $user->load();
+ $inhalt = $user->desc;
+ break;
+ case 'act_user_tel':
+ $user = new User($SESS['user']['id']);
+ $user->load();
+ $inhalt = $user->tel;
+ break;
+ default:
+ $inhalt = 'please select subtype. unknown: '.$this->element->subtype;
+ }
+ break;
+ }
+
+ if ( $this->page->icons && $this->element->withIcon )
+ $inhalt = '<a href="'.Html::url(array('action'=>'pageelement','elementid'=>$this->element->elementid,'objectid'=>$this->page->objectid,'subaction'=>'edit')).'" title="'.$this->element->desc.'" target="cms_main_main"><img src="'.$conf['directories']['themedir'].'/images/icon_el_'.$this->element->type.'.png" border="0" align="left"></a>'.$inhalt;
+
+ $this->value = $inhalt;
+ }
+
+
+ /**
+ * Es werden Objekte mit einem Inhalt
+ * @param String Suchbegriff
+ * @return Array Liste der gefundenen Objekt-IDs
+ */
+ function getObjectIdsByValue( $text )
+ {
+ $db = db_connection();
+
+ $sql = new Sql( 'SELECT {t_object}.id FROM {t_value} '.
+ ' LEFT JOIN {t_page} '.
+ ' ON {t_page}.id={t_value}.pageid '.
+ ' LEFT JOIN {t_object} '.
+ ' ON {t_object}.id={t_page}.objectid '.
+ ' WHERE {t_value}.text LIKE {text}'.
+ ' AND {t_value}.languageid={languageid}' );
+ $sql->setInt ( 'languageid',$this->languageid );
+ $sql->setString( 'text' ,'%'.$text.'%' );
+
+ return $db->getCol( $sql->query );
+ }
+
+
+ /**
+ * Es werden Objekte mit einer UserId ermittelt
+ * @param Integer Benutzer-Id der letzten ?nderung
+ * @return Array Liste der gefundenen Objekt-IDs
+ */
+ function getObjectIdsByLastChangeUserId( $userid )
+ {
+
+ $db = db_connection();
+
+ $sql = new Sql( 'SELECT {t_object}.id FROM {t_value} '.
+ ' LEFT JOIN {t_page} '.
+ ' ON {t_page}.id={t_value}.pageid '.
+ ' LEFT JOIN {t_object} '.
+ ' ON {t_object}.id={t_page}.objectid '.
+ ' WHERE {t_value}.lastchange_userid={userid}'.
+ ' AND {t_value}.languageid={languageid}' );
+ $sql->setInt ( 'languageid',$this->languageid );
+ $sql->setInt ( 'userid' ,$userid );
+
+ return $db->getCol( $sql->query );
+ }
}
\ No newline at end of file
diff --git a/themes/default/pages/html/element.tpl.php b/themes/default/pages/html/element.tpl.php
@@ -275,6 +275,36 @@
<?php } ?>
+ <?php if ( isset($parameters) )
+ {
+ $fx = fx($fx); ?>
+ <tr>
+ <td></td>
+ <td class="help"><?php echo $dynamic_class_description ?></td>
+ </tr>
+ <?php if ( count($dynamic_class_parameters) > 0 )
+ { ?>
+ <tr>
+ <td class="<?php echo $fx ?>"><?php echo lang('EL_PROP_DYNAMIC_PARAMETERS') ?></td>
+ <td class="<?php echo $fx ?>"><textarea name="code" rows="15" cols="40"><?php echo $parameters ?></textarea></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td class="help"><ul><?php foreach( $dynamic_class_parameters as $paramName=>$paramDesc )
+ { ?>
+ <li><strong><?php echo $paramName ?></strong>: <?php echo $paramDesc ?></li>
+ <?php } ?>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td class="help"><?php echo lang('EL_PROP_DYNAMIC_PARAMETERS_DESC') ?></td>
+ </tr>
+ <?php } ?>
+ <?php } ?>
+
+
<?php if ( isset($select_items) )
{
$fx = fx($fx); ?>