openrat-cms

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

MacroRunner.class.php (2320B)


      1 <?php
      2 
      3 
      4 use cms\model\Element;
      5 use cms\model\Template;
      6 use cms\model\Value;
      7 use util\VariableResolver;
      8 
      9 class MacroRunner
     10 {
     11 	public $page;
     12 
     13 	public function executeMacro($name, $parameter, $page)
     14 	{
     15 		$this->page = $page;
     16 
     17 		$className = $name;
     18 		$output = '';
     19 
     20 		$fileName = OR_DYNAMICCLASSES_DIR . $name . '.class.php';
     21 		if (!is_file($fileName))
     22 			throw new OpenRatException('ERROR_IN_ELEMENT','file not found:'.$fileName);
     23 
     24 		require_once( $fileName );
     25 
     26 		if (!class_exists($className))
     27 			throw new OpenRatException('ERROR_IN_ELEMENT', 'class not found:' . $className);
     28 
     29 
     30 		/** @var \Macro $macro */
     31 		$macro = new $className;
     32 
     33 		if (!method_exists($macro, 'execute'))
     34 			throw new OpenRatException('ERROR_IN_ELEMENT',' (missing method: execute())');
     35 
     36 		$macro->setContextPage($page);
     37 
     38 		$resolver = new VariableResolver();
     39 
     40 		$parameters = $resolver->resolveVariablesInArrayWith( $parameter, [
     41 
     42 			'setting'=> function ($var) {
     43 				return ArrayUtils::getSubValue($this->page->getSettings(), explode('.', $var));
     44 			},
     45 
     46 			'element'=>function ($var) {
     47 				$template = new Template($this->page->templateid);
     48 				$elements = $template->getElementNames();
     49 				$elementid = array_search($var, $elements);
     50 
     51 				$value = new Value();
     52 				$value->publisher = $this->page->publisher;
     53 				$value->elementid = $elementid;
     54 				$value->element = new Element($elementid);
     55 				$value->element->load();
     56 				$value->pageid = $this->page->pageid;
     57 				$value->languageid = $this->page->languageid;
     58 				$value->load();
     59 
     60 				return $value->getRawValue();
     61 			}
     62 		] );
     63 
     64 		foreach ($parameters as $param_name => $param_value) {
     65 
     66 			if (! property_exists($macro, $param_name)) {
     67 
     68 				if (!$this->page->publisher->isPublic())
     69 					$output .= "*WARNING*: Unknown parameter $param_name in macro $className\n";
     70 				continue;
     71 			}
     72 
     73 			Logger::trace("Setting parameter for Macro-class $className, " . $param_name . ':' . print_r($param_value,true));
     74 
     75 			// Die Parameter der Makro-Klasse typisiert setzen.
     76 			if (is_int($macro->$param_name))
     77 				$macro->$param_name = intval($param_value);
     78 			elseif (is_array($macro->$param_name))
     79 				$macro->$param_name = (array)$param_value;
     80 			else
     81 				$macro->$param_name = $param_value;
     82 
     83 		}
     84 
     85 		ob_start();
     86 
     87 		$macro->execute();
     88 
     89 		$output .= ob_get_contents();
     90 
     91 		ob_end_clean();
     92 
     93 		return $output;
     94 	}
     95 }