Location: PHPKode > projects > OpenRat CMS > openrat/objectClasses/Element.class.php
<?php
// OpenRat Content Management System
// Copyright (C) 2002-2010 Jan Dankert, hide@address.com
//
// 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.



/**
 * 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.
 *
 * @author Jan Dankert
 * @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>insert</li>
	 * <li>linkinfo</li>
	 * <li>linkdate</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;
	
	/**
	 * Vorausgew�hltes Objekt. 
	 * @type Integer
	 */
	var $defaultObjectId = 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;

	var $readonlyElementNames = array('copy','linkinfo','linkdate','info','infodate','code','dynamic');
	
	/**
	 * Untertyp.
	 *
	 * @var String
	 */
	var $subtype = '';
	var $withIcon = false;
	var $dateformat = 'r';
	var $wiki = false;
	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
	 */
	function Element( $elementid=0 )
	{
		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))+1;

		$sql = new Sql( 'INSERT INTO {t_element}'.
		                ' (id,templateid,name,descr,type,writable) '.
		                " VALUES ( {elementid},{templateid},{name},{description},{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   );
		$sql->setString ( 'description',$this->desc       );

		$db->query( $sql );
	}



//	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()
	{
		if	( intval($this->elementid) != 0 )
		{		
			$db = db_connection();
			$sql = new Sql( <<<SQL
SELECT * FROM {t_element}
 WHERE id={elementid}
SQL
);
			$sql->setInt( 'elementid',$this->elementid );
			$this->setDatabaseRow( $db->getRow( $sql ) );
		}
	}


	function setDatabaseRow( $prop )
	{
		if	( count($prop) <= 0 )
			return;

		$this->elementid      = $prop['id'        ];
		$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 );
	}



	/**
	 * 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 )
	{
		$this->type = $type;
		$db = db_connection();
		
		$sql = new Sql( 'UPDATE {t_element}'.
		                ' SET type            = {type}'.
		                ' WHERE id={elementid}'         );

		$sql->setInt    ( 'elementid',$this->elementid );
		$sql->setString ( 'type'     ,$this->type      );

		$db->query( $sql );
	}


	/**
	 * Setzt ein Prefix vor den Elementnamen.
	 * @param String Prefix
	 */
	function setPrefix( $prefix )
	{
		if	( strrpos($this->name,'%') === FALSE )
			$name = $this->name;
		else
			list( $oldprefix,$name ) = explode('%',$this->name.'%');
		
		$this->name = $prefix.'%'.$name;
	}


	/**
	 * Loeschen 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 );
	}


	/**
	 * 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 );
	}


	/**
	 * Abhaengig vom Element-Typ werden die zur Darstellung notwendigen Eigenschaften ermittelt.
	 * @return Array()
	 */
	function getRelatedProperties()
	{
		$prp = array('text'    =>array('withIcon','allLanguages','writable','htmlwiki','defaultText'),
		             'longtext'=>array('withIcon','allLanguages','writable','htmlwiki','defaultText'),
		             'select'  =>array('withIcon','allLanguages','writable','defaultText','code'),
		             'number'  =>array('withIcon','allLanguages','writable','decPoint','decimals','thousandSep'),
		             'link'    =>array('subtype','withIcon','allLanguages','writable','linktype','folderObjectId','defaultObjectId'),
		             'date'    =>array('withIcon','allLanguages','writable','dateformat','defaultText'),
		             'list'    =>array('subtype','withIcon','allLanguages','writable','folderObjectId','defaultObjectId'),
		             'insert'  =>array('subtype','withIcon','allLanguages','writable','folderObjectId','defaultObjectId'),
		             'copy'    =>array('prefix','name','defaultText'),
		             'linkinfo'=>array('prefix','subtype','defaultText'),
		             'linkdate'=>array('prefix','subtype','dateformat'),
		             'code'    =>array('code'),
		             'dynamic' =>array('subtype','code'),
		             'info'    =>array('subtype'),
		             'infodate'=>array('subtype','dateformat') );
		return $prp[ $this->type ];
	}



	function getDefaultValue()
	{
		switch(  $this->type )
		{
			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');
	}


	/**
	 * Ermittelt die Klasse des Element-Typs.<br>
	 * Entweder "info", "text" oder "dynamic".
	 * 
	 * @return String
	 */
	function getTypeClass()
	{
		switch( $this->type )
		{
			case 'text':
			case 'longtext':
			case 'select':
			case 'number':
			case 'link':
			case 'date':
			case 'list':
			case 'insert':
				return 'text';

			case 'code':
			case 'dynamic':
				return 'dynamic';

			case 'copy':
			case 'info':
			case 'infodate':
			case 'linkinfo':
			case 'linkdate':
				return 'info';
		}
	}


	function getSelectItems()
	{
		$parameters = explode( "\n",$this->code );
		$items      = array();
	
		foreach( $parameters as $it )
		{
			$paar        = explode( ":",$it,2 );
			$param_name  = trim($paar[0]);

			if	( count($paar) > 1 )
				$param_value = trim($paar[1]);
			else
				$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); 
			
			$items[$param_name] = $param_value;
		}
		return $items;
	}
	

	function getDynamicParameters()
	{
		$parameters = explode( "\n",$this->code );
		$items      = array();
	
		foreach( $parameters as $it )
		{
			$paar = explode( ":",$it,2 );
			if	( count($paar) > 1 )
			{
				$param_name  = trim($paar[0]);
				$param_value = trim($paar[1]);

//				// 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	( !empty($param_value) )				
					$items[$param_name] = $param_value;
			}
		}
		return $items;
	}
	

	/**
	 * 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,$this->readonlyElementNames) )
			return false;

		return $this->writable;
	}
}

?>
Return current item: OpenRat CMS