MacroRunner.class.php (2632B)
1 <?php 2 3 4 namespace cms\macros; 5 6 use cms\generator\PageContext; 7 use cms\model\Element; 8 use cms\model\PageContent; 9 use cms\model\Template; 10 use cms\model\Value; 11 use logger\Logger; 12 use util\ArrayUtils; 13 use util\exception\GeneratorException; 14 use util\text\variables\VariableResolver; 15 16 class MacroRunner 17 { 18 public $page; 19 20 /** 21 * @param $name 22 * @param $parameter 23 * @param $page 24 * @param $pageContext PageContext 25 * @return string 26 * @throws GeneratorException 27 */ 28 public function executeMacro($name, $parameter, $page, $pageContext) 29 { 30 $this->page = $page; 31 32 $className = 'cms\macros\macro\\'.$name; 33 $output = ''; 34 35 if (!class_exists($className)) 36 throw new GeneratorException('class not found:' . $className); 37 38 /** @var \util\Macro $macro */ 39 $macro = new $className; 40 41 if (!method_exists($macro, 'execute')) 42 throw new GeneratorException(' (missing method: execute())'); 43 44 $macro->setPageContext($pageContext); 45 46 $resolver = new VariableResolver(); 47 48 $resolver->namespaceSeparator = ':'; 49 $resolver->defaultSeparator = '?'; 50 $resolver->addResolver('setting',function ($var) { 51 return ArrayUtils::getSubValue($this->page->getSettings(), explode('.', $var)); 52 }); 53 $resolver->addResolver('element',function ($var) use($pageContext) { 54 $template = new Template($this->page->templateid); 55 $elements = $template->getElementNames(); 56 $elementid = array_search($var, $elements); 57 58 $element = new Element($elementid); 59 $element->load(); 60 61 $pageContent = new PageContent(); 62 $pageContent->pageId = $this->page->pageid; 63 $pageContent->languageid = $pageContext->languageId; 64 $pageContent->elementId = $elementid; 65 $pageContent->load(); 66 67 $value = new Value(); 68 $value->contentid = $pageContent->contentId; 69 $value->load(); 70 71 return $value->getRawValue($element->typeid); 72 }); 73 74 $parameters = $resolver->resolveVariablesInArray($parameter); 75 76 foreach ($parameters as $param_name => $param_value) { 77 78 if (!property_exists($macro, $param_name)) { 79 80 Logger::warn( "Unknown parameter $param_name in macro $className" ); 81 continue; 82 } 83 84 if ( DEVELOPMENT ) 85 Logger::trace("Setting parameter for Macro-class $className, " . $param_name . ':' . print_r($param_value, true)); 86 87 // Die Parameter der Makro-Klasse typisiert setzen. 88 if (is_int($macro->$param_name)) 89 $macro->$param_name = intval($param_value); 90 elseif (is_array($macro->$param_name)) 91 $macro->$param_name = (array)$param_value; 92 else 93 $macro->$param_name = $param_value; 94 95 } 96 97 ob_start(); 98 99 $macro->execute(); 100 101 $output .= ob_get_contents(); 102 103 ob_end_clean(); 104 105 return $output; 106 } 107 }