openrat-cms

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

Template.class.php (7953B)


      1 <?php
      2 namespace cms\model;
      3 // OpenRat Content Management System
      4 // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de
      5 //
      6 // This program is free software; you can redistribute it and/or
      7 // modify it under the terms of the GNU General Public License
      8 // as published by the Free Software Foundation; either version 2
      9 // of the License, or (at your option) any later version.
     10 //
     11 // This program is distributed in the hope that it will be useful,
     12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 // GNU General Public License for more details.
     15 //
     16 // You should have received a copy of the GNU General Public License
     17 // along with this program; if not, write to the Free Software
     18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     19 use cms\base\DB;
     20 use language\Messages;
     21 use util\exception\ObjectNotFoundException;
     22 
     23 
     24 /**
     25  * Logische Darstellung eines Templates
     26  *
     27  * @author: $Author$
     28  * @version: $Revision$
     29  * @package openrat.objects
     30  */ 
     31 class Template extends ModelBase
     32 {
     33 	const TYPE_PUBLISH = 1;
     34 
     35 	/**
     36 	 * ID dieses Templates
     37 	 * @type Integer
     38 	 */
     39 	var $templateid = 0;
     40 
     41 	/**
     42 	 * Projekt-ID des aktuell ausgew?hlten Projektes
     43 	 * @type Integer
     44 	 */
     45 	var $projectid = 0;
     46 
     47 	/**
     48 	 * Logischer Name
     49 	 * @type String
     50 	 */
     51 	var $name = 'unnamed';
     52 
     53 	/**
     54 	 * Should this template be published?
     55 	 *
     56 	 * @var bool
     57 	 */
     58 	public $publish = true;
     59 
     60 	// Konstruktor
     61 	function __construct( $templateid='' )
     62 	{
     63 		if   ( is_numeric($templateid) )
     64 			$this->templateid = $templateid;
     65 	}
     66 
     67 
     68 	/**
     69  	 * Laden des Templates aus der Datenbank und f?llen der Objekteigenschaften
     70  	 */
     71 	function load()
     72 	{
     73 		$stmt = Db::sql( 'SELECT * FROM {{template}}'.
     74 		                ' WHERE id={templateid}' );
     75 		$stmt->setInt( 'templateid',$this->templateid );
     76 		$row = $stmt->getRow();
     77 		
     78 		if	( empty($row) )
     79 			throw new ObjectNotFoundException("Template not found: ".$this->templateid);
     80 
     81 		$this->name      = $row['name'     ];
     82 		$this->projectid = $row['projectid'];
     83 		$this->publish   = $row['type'] & self::TYPE_PUBLISH;
     84 	}
     85 
     86 
     87 	public function loadTemplateModelFor( $modelid ) {
     88 
     89 		$templateModel = new TemplateModel( $this->templateid, $modelid );
     90 		$templateModel->load();
     91 
     92 		return $templateModel;
     93 	}
     94 
     95 	/**
     96  	 * Abspeichern des Templates in der Datenbank
     97  	 */
     98 	function save()
     99 	{
    100 		if	( $this->name == "" )
    101 			$this->name = \cms\base\Language::lang(Messages::TEMPLATE).' #'.$this->templateid;
    102 
    103 		$stmt = Db::sql( <<<SQL
    104 			UPDATE {{template}}
    105 		       SET name={name},
    106 		           type={type}
    107 		     WHERE id={templateid}
    108 SQL
    109 		);
    110 		$stmt->setString( 'name'      ,$this->name       );
    111 		$stmt->setInt   ( 'templateid',$this->templateid );
    112 
    113 		$type = 0;
    114 		if( $this->publish ) $type |= self::TYPE_PUBLISH;
    115 
    116 		$stmt->setInt   ( 'type'      ,$type );
    117 
    118 		$stmt->execute();
    119 	}
    120 
    121 
    122 	/**
    123 	  * Es werden Templates mit einem Inhalt gesucht
    124 	  * @param String Suchbegriff
    125 	  * @return array Liste der gefundenen Template-IDs
    126 	  */
    127 	public static function getTemplateIdsByValue( $text )
    128 	{
    129 		$stmt = DB::sql( <<<SQL
    130 			SELECT templateid FROM {{templatemodel}}
    131 			LEFT JOIN {{content}}
    132 			       ON {{content}}.id = {{templatemodel}}.contentid
    133 			LEFT JOIN {{value}}
    134 			       ON {{value}}.contentid = {{content}}.id
    135 		     WHERE {{value}}.text LIKE {text}
    136 SQL
    137 		);
    138 
    139 		$stmt->setString( 'text'   ,'%'.$text.'%'  );
    140 		
    141 		return $stmt->getCol();
    142 	}
    143 
    144 
    145 	/**
    146  	 * Ermitteln aller Elemente zu diesem Template
    147  	 * Es wird eine Liste nur mit den Element-IDs ermittelt und zur?ckgegeben
    148  	 * @return array
    149  	 */
    150 	public function getElementIds()
    151 	{
    152 		$stmt = DB::sql( 'SELECT id FROM {{element}}'.
    153 		                '  WHERE templateid={templateid}'.
    154 		                '  ORDER BY name ASC' );
    155 		$stmt->setInt( 'templateid',$this->templateid );
    156 		return $stmt->getCol();
    157 	}
    158 
    159 
    160 
    161 	/**
    162  	 * Ermitteln aller Elemente zu diesem Template
    163  	 * Es wird eine Liste mit den kompletten Elementen ermittelt und zurueckgegeben
    164  	 * @return array
    165  	 */
    166 	function getElements()
    167 	{
    168 		$list = array();
    169 		$db = \cms\base\DB::get();
    170 
    171 		$sql = $db->sql( 'SELECT * FROM {{element}}'.
    172 		                '  WHERE templateid={templateid}'.
    173 		                '  ORDER BY name ASC' );
    174 		$sql->setInt( 'templateid',$this->templateid );
    175 		foreach($sql->getAll() as $row )
    176 		{
    177 			$e = new Element( $row['id'] );
    178 			$e->setDatabaseRow( $row );
    179 			
    180 			$list[$e->elementid] = $e;
    181 			unset($e);
    182 		}
    183 		return $list;
    184 	}
    185 
    186 
    187 
    188 	/**
    189  	 * Ermitteln aller Elemente zu diesem Template
    190  	 * Es wird eine Liste mit den kompletten Elementen ermittelt und zurueckgegeben
    191  	 * @return array
    192  	 */
    193 	function getWritableElements()
    194 	{
    195 		$list = array();
    196 		$e = new Element();
    197 		$readonlyList = implode(',',Element::$readonlyElementTypeIds);
    198 		
    199 		$db = \cms\base\DB::get();
    200 
    201 		$sql = $db->sql( <<<SQL
    202 SELECT * FROM {{element}}
    203   WHERE templateid={templateid}
    204     AND typeid NOT IN ($readonlyList)
    205   ORDER BY name ASC
    206 SQL
    207 );
    208 		$sql->setInt       ( 'templateid'  ,$this->templateid        );
    209 		foreach($sql->getAll() as $row )
    210 		{
    211 			$e = new Element( $row['id'] );
    212 			$e->setDatabaseRow( $row );
    213 
    214 			if (!$e->writable)
    215 			    continue;
    216 			
    217 			$list[$e->elementid] = $e;
    218 			unset($e);
    219 		}
    220 		return $list;
    221 	}
    222 
    223 
    224 
    225 	/**
    226  	 * Ermitteln aller Elemente zu diesem Template
    227  	 * Es wird eine Liste mit den Element-Namen zur?ckgegeben
    228  	 * @return array
    229  	 */
    230 	public function getElementNames()
    231 	{
    232 		$db = \cms\base\DB::get();
    233 
    234 		$sql = $db->sql( 'SELECT id,name FROM {{element}}'.
    235 		                '  WHERE templateid={templateid}'.
    236 		                '  ORDER BY name ASC' );
    237 		$sql->setInt( 'templateid',$this->templateid );
    238 
    239 		return $sql->getAssoc();
    240 	}
    241 
    242 
    243 	/**
    244  	 * Hinzuf?gen eines Elementes
    245  	 * @param String Name des Elementes
    246  	 */
    247 	public function addElement($name, $description='', $typeid=Element::ELEMENT_TYPE_TEXT )
    248 	{
    249 		$element = new Element();
    250 		$element->name       = $name;
    251 		$element->label      = $name;
    252 		$element->desc       = $description;
    253 		$element->typeid     = $typeid;
    254 		$element->templateid = $this->templateid;
    255 		$element->format     = Element::ELEMENT_FORMAT_TEXT;
    256 		$element->writable   = true;
    257 		$element->persist();
    258 
    259 		return $element;
    260 	}
    261 
    262 
    263 	/**
    264  	 * Hinzufuegen eines Templates
    265  	 * @param String Name des Templates (optional)
    266  	 */
    267 	function add()
    268 	{
    269 		$db = \cms\base\DB::get();
    270 
    271 		$sql = $db->sql('SELECT MAX(id) FROM {{template}}');
    272 		$this->templateid = intval($sql->getOne())+1;
    273 
    274 		$sql = $db->sql( 'INSERT INTO {{template}}'.
    275 		                ' (id,name,projectid)'.
    276 		                ' VALUES({templateid},{name},{projectid})' );
    277 		$sql->setInt   ('templateid',$this->templateid   );
    278 		$sql->setString('name'      ,$this->name         );
    279 
    280 		$sql->setInt   ('projectid' ,$this->projectid );
    281 
    282 		$sql->execute();
    283 	}
    284 
    285 
    286 	/**
    287  	 * Ermitteln alles Objekte (=Seiten), welche auf diesem Template basieren.
    288  	 * 
    289  	 * @return array Liste von Objekt-IDs
    290  	 */
    291 	function getDependentObjectIds()
    292 	{
    293 		$db = \cms\base\DB::get();
    294 
    295 		$sql = $db->sql( 'SELECT objectid FROM {{page}}'.
    296 		                '  WHERE templateid={templateid}' );
    297 		$sql->setInt( 'templateid',$this->templateid );
    298 
    299 		return $sql->getCol();
    300 	}
    301 
    302 
    303 	/**
    304  	 * Loeschen des Templates
    305  	 *
    306  	 * Entfernen alle Templateinhalte und des Templates selber
    307  	 */
    308 	public function delete()
    309 	{
    310 		$db = \cms\base\DB::get();
    311 		
    312 		foreach( $this->getElementIds() as $elementid )
    313 		{
    314 			$element = new Element( $elementid );
    315 			$element->delete();
    316 		}
    317 
    318 		$stmt = $db->sql( 'DELETE FROM {{templatemodel}}'.
    319 		                ' WHERE templateid={templateid}' );
    320 		$stmt->setInt( 'templateid',$this->templateid );
    321 		$stmt->execute();
    322 
    323 		$stmt = $db->sql( 'DELETE FROM {{template}}'.
    324 		                ' WHERE id={templateid}' );
    325 		$stmt->setInt( 'templateid',$this->templateid );
    326 
    327 		$stmt->execute();
    328 
    329 		$this->templateid = 0;
    330 	}
    331 	
    332 	
    333     public function getName()
    334     {
    335         return $this->name;
    336     }
    337 
    338 	public function getId()
    339 	{
    340 		return $this->templateid;
    341 	}
    342 
    343 
    344 }