openrat-cms

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

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 }