Exemple #1
0
 public function setContentWithLayout(string $textContent, string $layout = 'Global', array $vars = [])
 {
     $this->compiler->setContents($textContent);
     if ($path = $this->resolver->getView("Layout\\{$layout}")) {
         $textContent = $this->compiler->compile([$path]);
     }
     $this->setVars($vars);
     $this->setContent($textContent);
     return $this;
 }
Exemple #2
0
 private function loadTemplateFromUrl($templateUrl)
 {
     if (!empty($templateUrl)) {
         if ($path = (new Resolver())->getView("Helper\\{$templateUrl}")) {
             $compiler = new Compiler();
             //not using DI since Helper object is often created by user
             $this->template = $compiler->compile([$path]);
         } else {
             throw new ViewError(sprintf("Unable to find helper: %s", $templateUrl));
         }
     }
 }
Exemple #3
0
 /**
  * Get all <event name="$eventName"></event> tags and fire $eventName events,
  * then replace the <event> tag with the response generated by event handlers.
  *
  */
 public function render()
 {
     $html = !empty($this->layout) ? $this->compiler->replaceContentTagInLayout($this->content ?? '', $this->layout) : $this->content ?? '';
     $event = new ViewParserEvent($this, $html);
     $this->dispatcher->fire(ViewParserEvent::VIEWPARSER_RENDER, $event);
     $output = preg_replace_callback('~(<minute-event.*?</minute-event>)~mi', function ($matches) {
         $tag = $matches[1];
         $attrs = (array) new SimpleXMLElement($tag);
         $attrs = current($attrs);
         $event = new ViewEvent($this, $tag, $attrs);
         $eventName = strtolower(strtr($attrs['name'], ['_' => '.']));
         if (preg_match('/^(user|import)\\./i', $eventName)) {
             if (!empty($attrs['as'])) {
                 $importEvent = new ImportEvent($event, $tag, $attrs);
                 $this->dispatcher->fire($eventName, $importEvent);
                 foreach ($attrs as $k => $v) {
                     if ($k !== 'name' && $k !== 'as') {
                         $values[] = sprintf('%s="%s"', $k, htmlentities($v));
                     }
                 }
                 $data = $importEvent->getContent();
                 $import = sprintf('<minute-importer into="%s" data="%s" %s></minute-importer>', $attrs['as'], htmlentities(json_encode($data ?? [])), join(' ', $values ?? []));
                 $event->setContent($import);
             } else {
                 $this->dispatcher->fire($eventName, $event);
             }
         } else {
             throw new ViewError("Server side event '{$eventName}' failed (server side events may start with USER_ or IMPORT_ only)");
         }
         return $event->getContent();
     }, $event->getHtml());
     /** @var Helper $helper */
     foreach ($this->helpers ?? [] as $helper) {
         if ($content = $helper->getTemplate()) {
             $tagName = $helper->getPosition() === Helper::POSITION_BODY ? '</body>' : '</head>';
             $output = $this->tagUtils->insertBeforeTag($tagName, $content, $output);
         }
     }
     $output = preg_replace_callback('~<title></title>~', function () {
         $url = $this->request->getPath();
         $event = new SeoEvent($url);
         $this->dispatcher->fire(SeoEvent::SEO_GET_TITLE, $event);
         $result = sprintf('<title>%s</title>%s', $event->getTitle() ?: ucwords(trim(join(' ', preg_split('/\\W+/', $url)))), PHP_EOL);
         foreach ($event->getMeta() as $meta) {
             $result .= sprintf('<meta name="%s" content="%s" />%s', $meta['name'], $meta['content'], PHP_EOL);
         }
         return $result;
     }, $output);
     return $output;
 }