openrat-cms

# OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs

ElementAction.class.php (22456B)


      1 <?php
      2 
      3 namespace cms\action;
      4 
      5 
      6 use cms\model\Element;
      7 use cms\model\Project;
      8 use cms\model\Template;
      9 use cms\model\Folder;
     10 use cms\model\BaseObject;
     11 use ReflectionClass;
     12 use ReflectionProperty;
     13 use Text;
     14 
     15 
     16 
     17 /**
     18  * Action-Klasse fuer die Bearbeitung eines Template-Elementes.
     19  * 
     20  * @author Jan Dankert
     21  */
     22 class ElementAction extends BaseAction
     23 {
     24 	public $security = Action::SECURITY_USER;
     25 
     26     /**
     27      * @var Element
     28      */
     29 	private $element;
     30 
     31     private $template;
     32 
     33     /**
     34 	 * Konstruktor
     35 	 */
     36 	function __construct()
     37 	{
     38         parent::__construct();
     39 
     40     }
     41 
     42 
     43     public function init()
     44     {
     45         if	( $this->getRequestId() == 0 )
     46 			throw new \ValidationException('no element-id available');
     47 
     48 		$this->element = new Element( $this->getRequestId() );
     49 		$this->element->load();
     50 
     51 		$this->setTemplateVar( 'elementid' ,$this->element->elementid   );
     52 	}
     53 
     54 
     55 
     56 	/**
     57 	 * Umbenennen des Elementes
     58 	 */
     59 	public function removeView()
     60 	{
     61 		$this->setTemplateVar( 'name' ,$this->element->name );
     62 	}
     63 	
     64 	
     65 	/**
     66 	 * Entfernen des Elementes
     67 	 */
     68 	public function removePost()
     69 	{
     70 		if	( !$this->hasRequestVar('confirm') )
     71 			throw new \ValidationException('confirm');
     72 
     73 		$type = $this->getRequestVar('type','abc');
     74 		
     75 		if ( $type == 'value' )
     76 		{
     77 		    // Nur Inhalte löschen
     78 			$this->element->deleteValues();
     79 			$this->addNotice('element',$this->element->name,'DELETED',OR_NOTICE_OK);
     80 		}
     81 		elseif ( $type == 'all' )
     82 		{
     83 		    // Element löschen
     84 			$this->element->delete();
     85 			$this->addNotice('element',$this->element->name,'DELETED',OR_NOTICE_OK);
     86 		}
     87 	}
     88 
     89 
     90 
     91 	/**
     92 	 * Aendern des Element-Typs
     93 	 */
     94 	public function advancedPost()
     95 	{
     96         global $conf;
     97         $ini_date_format = config('date','format');
     98 
     99 
    100         if	( $this->hasRequestVar('format'))
    101             $this->element->format = $this->getRequestId('format');
    102 
    103 
    104         if	( $this->hasRequestVar('dateformat'))
    105             $this->element->dateformat  = $ini_date_format[$this->getRequestVar('dateformat')];
    106 
    107 
    108         if	( $this->hasRequestVar('default_longtext'))
    109             $this->element->defaultText     = $this->getRequestVar('default_longtext',OR_FILTER_TEXT);
    110         else
    111             $this->element->defaultText     = $this->getRequestVar('default_text',OR_FILTER_TEXT);
    112 
    113         $this->element->subtype         = $this->getRequestVar('subtype');
    114 
    115         $this->element->html            = $this->hasRequestVar('html');
    116         $this->element->withIcon        = $this->hasRequestVar('with_icon');
    117         $this->element->allLanguages    = $this->hasRequestVar('all_languages');
    118         $this->element->writable        = $this->hasRequestVar('writable');
    119         $this->element->inherit         = $this->hasRequestVar('inherit');
    120 
    121         $this->element->decimals        = $this->getRequestVar('decimals');
    122         $this->element->decPoint        = $this->getRequestVar('dec_point');
    123         $this->element->thousandSep     = $this->getRequestVar('thousand_sep');
    124         $this->element->folderObjectId  = $this->getRequestVar('folderobjectid'  );
    125         $this->element->defaultObjectId = $this->getRequestVar('default_objectid');
    126 
    127         if	( $this->hasRequestVar('select_items'))
    128             $this->element->code         = $this->getRequestVar('select_items');
    129         else
    130             $this->element->code         = $this->getRequestVar('code'            ,OR_FILTER_RAW);
    131 
    132         if	( $this->hasRequestVar('name') )
    133             $this->element->name = $this->getRequestVar('name');
    134 
    135         if	( $this->hasRequestVar('linkelement') )
    136             $this->element->setPrefix( $this->getRequestVar('linkelement') );
    137 
    138         if	( $this->hasRequestVar('parameters'))
    139             $this->element->code = $this->getRequestVar('parameters',OR_FILTER_RAW);
    140 
    141         $this->element->save();
    142         $this->addNotice('element',$this->element->name,'SAVED');
    143 
    144     }
    145 
    146 
    147 	public function advancedView()
    148 	{
    149         global $conf;
    150         $this->setTemplateVar('type',$this->element->getTypeName() );
    151 
    152         // Abhaengig vom aktuellen Element-Typ die Eigenschaften anzeigen
    153         $properties = $this->element->getRelatedProperties();
    154 
    155         foreach( $this->element->getRelatedProperties() as $propertyName )
    156         {
    157             switch( $propertyName )
    158             {
    159                 case 'withIcon':
    160                     $this->setTemplateVar('with_icon'    ,$this->element->withIcon    );
    161                     break;
    162 
    163                 case 'allLanguages':
    164                     $this->setTemplateVar('all_languages',$this->element->allLanguages);
    165                     break;
    166 
    167                 case 'writable':
    168                     $this->setTemplateVar('writable'     ,$this->element->writable    );
    169                     break;
    170 
    171                 case 'inherit':
    172                     $this->setTemplateVar('inherit'     ,$this->element->inherit      );
    173                     break;
    174 
    175                 case 'html':
    176                     $this->setTemplateVar('html'       ,$this->element->html          );
    177                     break;
    178 
    179                 case 'subtype':
    180 
    181                     $convertToLang = false;
    182                     switch( $this->element->typeid )
    183                     {
    184                         case Element::ELEMENT_TYPE_INFO:
    185                             $subtypes = Array('db_id',
    186                                 'db_name',
    187                                 'project_id',
    188                                 'project_name',
    189                                 'language_id',
    190                                 'language_iso',
    191                                 'language_name',
    192                                 'page_id',
    193                                 'page_name',
    194                                 'page_desc',
    195                                 'page_fullfilename',
    196                                 'page_filename',
    197                                 'page_extension',
    198                                 'edit_url',
    199                                 'edit_fullurl',
    200                                 'lastch_user_username',
    201                                 'lastch_user_fullname',
    202                                 'lastch_user_mail',
    203                                 'lastch_user_desc',
    204                                 'lastch_user_tel',
    205                                 'create_user_username',
    206                                 'create_user_fullname',
    207                                 'create_user_mail',
    208                                 'create_user_desc',
    209                                 'create_user_tel',
    210                                 'act_user_username',
    211                                 'act_user_fullname',
    212                                 'act_user_mail',
    213                                 'act_user_desc',
    214                                 'act_user_tel' );
    215                             $convertToLang = true;
    216                             break;
    217 
    218                         case Element::ELEMENT_TYPE_INFODATE:
    219                         case Element::ELEMENT_TYPE_LINKDATE:
    220                             $subtypes = Array('date_published',
    221                                 'date_saved',
    222                                 'date_created' );
    223                             $convertToLang = true;
    224                             break;
    225 
    226                         case Element::ELEMENT_TYPE_LINK:
    227                             $subtypes = Array(
    228                                 'file',
    229                                 'image',
    230                                 'image_data_uri',
    231                                 'page',
    232                                 'folder',
    233                                 'link' );
    234                             $convertToLang = true;
    235                             break;
    236 
    237                         case Element::ELEMENT_TYPE_LINKINFO:
    238                             $subtypes = Array('width',
    239                                 'height',
    240                                 'id',
    241                                 'name',
    242                                 'description',
    243                                 'mime-type',
    244                                 'lastch_user_username',
    245                                 'lastch_user_fullname',
    246                                 'lastch_user_mail',
    247                                 'lastch_user_desc',
    248                                 'lastch_user_tel',
    249                                 'create_user_username',
    250                                 'create_user_fullname',
    251                                 'create_user_mail',
    252                                 'create_user_desc',
    253                                 'create_user_tel',
    254                                 'filename',
    255                                 'full_filename' );
    256                             $convertToLang = true;
    257                             break;
    258 
    259                         case Element::ELEMENT_TYPE_INSERT:
    260                             $subtypes = Array('inline',
    261                                 'ssi'     );
    262                             $convertToLang = true;
    263                             break;
    264 
    265                         case Element::ELEMENT_TYPE_DYNAMIC:
    266 
    267                             $files = Array();
    268                             $macroFiles = \FileUtils::readDir(__DIR__.'/../../cms-macros/macro');
    269                             foreach( $macroFiles as $macroFile )
    270                             {
    271                                 $file = substr($macroFile,0,strlen($macroFile)-10);
    272                                 if	( $file != '' )
    273                                     $files[$file] = $file;
    274                             }
    275 
    276                             $subtypes = $files;
    277                             break;
    278 
    279                         default:
    280                             $subtypes = array();
    281                             break;
    282                     }
    283 
    284                     if	( $convertToLang )
    285                     {
    286                         foreach( $subtypes as $t=>$v )
    287                         {
    288                             unset($subtypes[$t]);
    289                             $subtypes[$v] = lang('EL_'.$this->element->getTypeName().'_'.$v);
    290                         }
    291                     }
    292 
    293                     // Variable $subtype muss existieren, um Anzeige des Feldes zu erzwingen.
    294                     if (!isset($this->element->subtype))
    295                         $this->element->subtype='';
    296 
    297                     $this->setTemplateVar('subtypes',$subtypes              );
    298                     $this->setTemplateVar('subtype' ,$this->element->subtype);
    299 
    300                     break;
    301 
    302 
    303                 case 'dateformat':
    304 
    305                     //$ini_date_format = config('date','format');
    306                     //$ini_date_format = Conf()->subset('date')->get('format');
    307                     $ini_date_format = config()->subset('date')->get('format');
    308                     $dateformat = array();
    309 
    310                     $this->setTemplateVar('dateformat','');
    311 
    312                     foreach($ini_date_format as $idx=>$d)
    313                     {
    314                         if	( strpos($d,'%')!==FALSE )
    315                             $dateformat[$idx] = strftime($d);
    316                         else
    317                             $dateformat[$idx] = date($d);
    318                         if	( $d == $this->element->dateformat )
    319                             $this->setTemplateVar('dateformat',$idx);
    320                     }
    321 
    322                     $this->setTemplateVar('dateformats',$dateformat);
    323 
    324                     break;
    325 
    326 
    327                 // Eigenschaften Text und Text-Absatz
    328                 case 'defaultText':
    329 
    330                     switch( $this->element->typeid )
    331                     {
    332                         case Element::ELEMENT_TYPE_LONGTEXT:
    333                             $this->setTemplateVar('default_longtext',$this->element->defaultText );
    334                             break;
    335 
    336                         case Element::ELEMENT_TYPE_SELECT:
    337                         case Element::ELEMENT_TYPE_TEXT:
    338                             $this->setTemplateVar('default_text'    ,$this->element->defaultText );
    339                             break;
    340                     }
    341                     break;
    342 
    343 
    344                 case 'format':
    345                     $this->setTemplateVar('format', $this->element->format );
    346 
    347                     $formats = Element::getAvailableFormats();
    348 
    349                     // Für einfache Textelemente gibt es keinen HTML-Editor
    350                     if	( $this->element->typeid != Element::ELEMENT_TYPE_LONGTEXT )
    351                         unset( $formats[ Element::ELEMENT_FORMAT_HTML ] );
    352 
    353                     foreach( $formats as $t=>$v )
    354                         $formats[$t] = array('lang'=>'EL_PROP_FORMAT_'.$v);
    355 
    356                     $this->setTemplateVar('formatlist', $formats);
    357                     break;
    358 
    359                 case 'linktype':
    360                     $this->setTemplateVar('linktype', $this->element->wiki );
    361                     $this->setTemplateVar('linktypelist', array('page','file','link') );
    362                     break;
    363 
    364                 case 'prefix':
    365                     $t = new Template( $this->element->templateid );
    366 
    367                     $elements = array();
    368                     foreach( $t->getElements() as $element )
    369                     {
    370                         if	( $element->type == 'link' )
    371                             $elements[$element->name] = $element->name;
    372                     }
    373                     unset($t);
    374 
    375                     $this->setTemplateVar('linkelements',$elements );
    376 
    377                     list($linkElementName,$targetElementName) = explode('%',$this->element->name.'%');
    378                     $this->setTemplateVar('linkelement',$linkElementName );
    379 
    380                     break;
    381 
    382                 case 'name':
    383 
    384                     $names = array();
    385 
    386                     $template = new Template( $this->element->templateid );
    387                     $template->load();
    388                     $project = new Project( $template->projectid );
    389 
    390                     foreach( $project->getTemplates() as $tid=>$name )
    391                     {
    392                         $t = new Template( $tid );
    393                         $t->load();
    394 
    395                         foreach( $t->getElements() as $element )
    396                         {
    397                             if	( !in_array($element->type,array('copy','linkinfo','link')) )
    398                                 $names[$element->name] = $t->name.' - '.$element->name.' ('.lang('EL_'.$element->type).')';
    399                         }
    400                         unset($t);
    401                     }
    402 
    403 
    404                     $this->setTemplateVar('names',$names );
    405 
    406                     list($linkElementName,$targetElementName) = explode('%',$this->element->name.'%');
    407                     $this->setTemplateVar('name',$targetElementName );
    408                     break;
    409 
    410                 // Eigenschaften PHP-Code
    411                 case 'code':
    412 
    413                     switch( $this->element->typeid )
    414                     {
    415 
    416                         case Element::ELEMENT_TYPE_SELECT:
    417                             $this->setTemplateVar('select_items',$this->element->code );
    418                             break;
    419 
    420                         case Element::ELEMENT_TYPE_DYNAMIC:
    421 
    422                             $className = $this->element->subtype;
    423                             $fileName  = OR_DYNAMICCLASSES_DIR.'/'.$className.'.class.'.PHP_EXT;
    424 
    425 							$description = '';
    426 							$paramList   = array();
    427 							$parameters  = array();
    428 
    429 							if	( is_file( $fileName ) )
    430                             {
    431                                 require( $fileName );
    432 
    433                                 if	( class_exists($className) )
    434                                 {
    435                                     $dynEl = new $className;
    436 
    437                                     $description = $dynEl->description;
    438 
    439                                     $old = $this->element->getDynamicParameters();
    440 
    441 									$reflect = new ReflectionClass($dynEl);
    442 									$props   = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);
    443                                     foreach( get_object_vars($dynEl) as $paramName=>$paramValue )
    444                                     {
    445 										$paramList[$paramName] = print_r( $paramValue, true);
    446 
    447 										if	( @$old[$paramName] )
    448 											$parameters[$paramName] = $old[$paramName];
    449 										else
    450 											$parameters[$paramName] = $paramValue;
    451                                     }
    452 
    453                                 }
    454                             }
    455 
    456 							$this->setTemplateVar('dynamic_class_description',$description );
    457 							$this->setTemplateVar('dynamic_class_parameters' ,$paramList          );
    458 							$this->setTemplateVar('parameters'               ,\YAML::dump($parameters)  );
    459 
    460 
    461                             break;
    462 
    463                         case Element::ELEMENT_TYPE_CODE:
    464                             if	( $conf['security']['disable_dynamic_code'] )
    465                                 $this->addNotice('element',$this->element->name,'CODE_DISABLED',OR_NOTICE_WARN);
    466 
    467                             $this->setTemplateVar('code',$this->element->code);
    468                             break;
    469                     }
    470                     break;
    471 
    472 
    473                 case 'decimals':
    474                     $this->setTemplateVar('decimals'     ,$this->element->decimals    );
    475                     break;
    476 
    477                 case 'decPoint':
    478                     $this->setTemplateVar('dec_point'    ,$this->element->decPoint    );
    479                     break;
    480 
    481                 case 'thousandSep':
    482                     $this->setTemplateVar('thousand_sep' ,$this->element->thousandSep );
    483                     break;
    484 
    485 
    486                 // Eigenschaften Link
    487                 case 'defaultObjectId':
    488 
    489                     $objects = array();
    490 
    491                     $template = new Template( $this->element->templateid );
    492                     $template->load();
    493                     $project = new Project( $template->projectid );
    494 
    495                     // Ermitteln aller verfuegbaren Objekt-IDs
    496                     foreach( $project->getAllObjectIds() as $id )
    497                     {
    498                         $o = new BaseObject( $id );
    499                         $o->load();
    500 
    501                         switch( $this->element->typeid )
    502                         {
    503                             case Element::ELEMENT_TYPE_LINK:
    504                                 if	( ! in_array( $o->typeid, array(BaseObject::TYPEID_PAGE,BaseObject::TYPEID_IMAGE,BaseObject::TYPEID_FILE,BaseObject::TYPEID_LINK,BaseObject::TYPEID_URL,BaseObject::TYPEID_TEXT ) ) )
    505                                     continue 2;
    506                                 break;
    507                             //Change tobias
    508                             case Element::ELEMENT_TYPE_INSERT:
    509                                 if	( ! in_array( $o->typeid, array(BaseObject::TYPEID_FOLDER,BaseObject::TYPEID_PAGE,BaseObject::TYPEID_IMAGE,BaseObject::TYPEID_FILE,BaseObject::TYPEID_LINK,BaseObject::TYPEID_URL,BaseObject::TYPEID_TEXT ) ) )
    510                                     continue 2;
    511                                 break;
    512                             //Change tobias end
    513                             default:
    514                                 continue 2;
    515                         }
    516 
    517                         $objects[ $id ]  = lang( $o->getType() ).': ';
    518 
    519                         if	( !$o->isRoot )
    520                         {
    521                             $f = new Folder( $o->parentid );
    522                             $f->load();
    523                             $names = $f->parentObjectNames(false,true);
    524                             foreach( $names as $fid=>$name )
    525                                 $names[$fid] = Text::maxLength($name,15,'..',STR_PAD_BOTH);
    526                             $objects[ $id ] .= implode( FILE_SEP,$names );
    527                         }
    528 
    529                         $objects[ $id ] .= FILE_SEP.$o->name;
    530                     }
    531 
    532                     asort( $objects ); // Sortieren
    533 
    534                     $this->setTemplateVar('objects',$objects);
    535 
    536                     $this->setTemplateVar('default_objectid',$this->element->defaultObjectId);
    537 
    538                     break;
    539 
    540 
    541                 case 'folderObjectId':
    542 
    543 
    544                     // Ermitteln aller verf?gbaren Objekt-IDs
    545                     $template = new Template( $this->element->templateid );
    546                     $template->load();
    547                     $project = new Project( $template->projectid );
    548 
    549                     $folders = $project->getAllFlatFolders();
    550                     $this->setTemplateVar('folders',$folders);
    551 
    552                     $this->setTemplateVar('folderobjectid'  ,$this->element->folderObjectId  );
    553 
    554                     break;
    555 
    556                 default:
    557                     throw new \LogicException('Unknown element property: '.$propertyName );
    558             }
    559         }
    560 	}
    561 	
    562 
    563 	
    564 	/**
    565 	 * Auswahlmaske f�r weitere Einstellungen zum Template-Element.
    566 	 *
    567 	 */
    568 	function infoView()
    569 	{
    570 		$this->setTemplateVar('id'  ,$this->element->elementid );
    571 		$this->setTemplateVar('name',$this->element->name );
    572 		$this->setTemplateVar('type',$this->element->getTypeName() );
    573 	}
    574 	
    575 	/**
    576 	 * Auswahlmaske f�r weitere Einstellungen zum Template-Element.
    577 	 *
    578 	 */
    579 	function propView()
    580 	{
    581         // Name und Beschreibung
    582         $this->setTemplateVar('name'       ,$this->element->name);
    583         $this->setTemplateVar('label'      ,$this->element->label);
    584 
    585         $this->setTemplateVar('description',$this->element->desc);
    586 
    587         // Die verschiedenen Element-Typen
    588         $types = array();
    589 
    590         foreach( Element::getAvailableTypes() as $typeId=>$typeKey )
    591             $types[ $typeId ] = 'EL_'.$typeKey;
    592 
    593         // Code-Element nur fuer Administratoren (da voller Systemzugriff!)
    594         if	( !$this->userIsAdmin() )
    595             unset( $types['code'] );
    596 
    597         // Liste aller Elementtypen
    598         $this->setTemplateVar('types',$types);
    599 
    600         // Aktueller Typ
    601         $this->setTemplateVar('typeid',$this->element->typeid);
    602 	}
    603 
    604 
    605 	
    606 	/**
    607 	 * Speichern der Element-Eigenschaften.
    608 	 */
    609 	public function propPost()
    610 	{
    611         if	( !$this->userIsAdmin() && $this->getRequestVar('type') == 'code' )
    612             // Code-Elemente fuer Nicht-Administratoren nicht benutzbar
    613             throw new \ValidationException('type');
    614 
    615         $this->element->typeid = $this->getRequestId('typeid');
    616 
    617         $this->element->name = $this->getRequestVar('name'       ,OR_FILTER_ALPHANUM);
    618         $this->element->label= $this->getRequestVar('label'      ,OR_FILTER_TEXT);
    619         $this->element->desc = $this->getRequestVar('description',OR_FILTER_TEXT);
    620 
    621         $this->element->save();
    622 
    623         $this->addNotice('element',$this->element->name,'SAVED',OR_NOTICE_OK);
    624 	}
    625 }
    626