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 }