Example #1
0
 /**
  * @param \DOMDocument $xml
  * @param bool|string $specificInstance
  * @param bool $dontEcho
  * @param bool $dontFillXML
  * @param bool $normalize
  * @return bool|string
  * @throws Exception
  */
 public static function render(&$xml, $specificInstance = false, $dontEcho = false, $dontFillXML = false, $normalize = true)
 {
     if ($specificInstance) {
         $instance = $specificInstance;
     } elseif (self::$instance) {
         $instance = self::$instance;
     } else {
         $instance = 'main';
     }
     Debugger::addLine("Render start (instance '{$instance}')");
     if (!($resource = Resourcer::getInstance('xslt')->compile($instance))) {
         throw new Exception("XSLT resource not found");
     }
     $xslDom = new \DomDocument();
     $xslDom->resolveExternals = true;
     $xslDom->substituteEntities = true;
     if (!$xslDom->loadXML($resource)) {
         throw new Exception("XSLT load problem for instance '{$instance}'");
     }
     $xslProcessor = new \XSLTProcessor();
     $xslProcessor->importStylesheet($xslDom);
     if (!$dontFillXML and !HttpError::$error and !Debugger::$shutdown) {
         View\XML::fillXML($xml, $instance);
     }
     // transform template
     if ($html = $xslProcessor->transformToDoc($xml)) {
         if ($normalize) {
             $html = self::normalize($html);
         } else {
             $html->formatOutput = true;
             $html = $html->saveXML();
         }
         if ($dontEcho) {
             return $html;
         }
         echo $html;
         self::$rendered = true;
         if (Debugger::isEnabled()) {
             echo '<!-- Page rendered in ' . Debugger::getTimer() . ' seconds -->';
         }
         if (function_exists('fastcgi_finish_request')) {
             fastcgi_finish_request();
         }
     } else {
         $errormsg = libxml_get_errors();
         //error_get_last();
         throw new Exception($errormsg ? $errormsg['message'] : "Can't render templates");
     }
     return true;
 }
Example #2
0
 /**
  * Fill output XML with some common data
  * @param \DOMDocument|null $xml
  * @param null $instance
  */
 public static function fillXML(&$xml = null, $instance = null)
 {
     $controller = Controller::getInstance();
     if (is_null($xml)) {
         $xml = $controller->xml;
         $node = $controller->realRoot;
     } else {
         $node = $xml->documentElement;
     }
     Debugger::addLine('Filling XML data for render: Started');
     // TODO: sync this with Envi::getState()
     $node->setAttribute('lang', Envi\Setup::getLocale());
     $node->setAttribute('site', Envi::getSubsite());
     $node->setAttribute('host', $host = Envi::getHost());
     $node->setAttribute('mainhost', $mainhost = Envi::getHost(true));
     $node->setAttribute('protocol', Envi::getProtocol());
     $node->setAttribute('fullhost', Envi::getURLPrefix());
     $node->setAttribute('instance', $instance ? $instance : View::$instance);
     $node->setAttribute('uri', Envi::getUri());
     $node->setAttribute('controllerUri', Action::getControllerUri());
     if ($host != $mainhost) {
         $node->setAttribute('urlprefix', Envi::getURLPrefix(true));
     }
     // get user agent
     Envi\UserAgent::getUserAgentXML($node);
     // ajax flag
     $node->setAttribute('ajax', (Request::isAjax() or isset($_SERVER['HTTP_X_REQUESTED_WITH']) and $_SERVER['HTTP_X_REQUESTED_WITH'] == 'SwitchPage') ? '1' : '0');
     $node->setAttribute('switcher', (!$controller->cache and isset($_SERVER['HTTP_X_REQUESTED_WITH']) and $_SERVER['HTTP_X_REQUESTED_WITH'] == 'SwitchPage') ? '1' : '0');
     // build and version number
     $node->setAttribute('build', Version::getBuild());
     $node->setAttribute('framework', Version::getFrameworkVersion(false));
     $node->setAttribute('frameworkLong', Version::getFrameworkVersion(true));
     // date
     /** @var $dateNode \DOMElement */
     $dateNode = $node->appendChild($xml->createElement('date'));
     $dateKeys = ['d', 'e', 'A', 'a', 'm', 'B', 'b', 'Y', 'y', 'c', 'x', 'H', 'M', 'S'];
     $dateValues = explode('|', strftime('%' . implode('|%', $dateKeys)));
     $dateCombined = array_combine($dateKeys, $dateValues);
     $dateNode->setAttribute('ts', time());
     foreach ($dateCombined as $k => $v) {
         $dateNode->setAttribute($k, $v);
     }
     // debug flag
     $node->setAttribute('debug', Debugger::isEnabled() ? '1' : '0');
     // config values (for js variable)
     $configNode = $node->appendChild($xml->createElement('config'));
     Envi::getStateXML($configNode);
     // menu
     if ($menuResource = Resourcer::getInstance('menu')->compile(View::$instance)) {
         $menuXML = new \DOMDocument();
         $menuXML->loadXML($menuResource);
         $node->appendChild($xml->importNode($menuXML->documentElement, true));
     }
     // auth
     Auth::getInstance()->getAuthXML($node);
     // locale
     Locales::getInstance()->getLocaleXML($node);
     // Add config js object
     $config = Envi::getState();
     $confJS = '';
     foreach ($config as $k => $v) {
         $confJS .= "config.{$k}='" . addslashes($v) . "';";
     }
     $node->setAttribute('jsConfig', $confJS);
     Debugger::addLine('Filling XML data for render: Done');
     Debugger::debugXML($node);
 }
Example #3
0
 /**
  * Resource (JS, CSS, etc.) request processor
  * @param string[] $parts
  * @throws \Difra\View\HttpError
  * @return bool
  */
 private static function getResource($parts)
 {
     if (sizeof($parts) != 2) {
         return false;
     }
     $resourcer = Resourcer::getInstance($parts[0], true);
     if ($resourcer and $resourcer->isPrintable()) {
         try {
             if (!$resourcer->view($parts[1])) {
                 throw new HttpError(404);
             }
             View::$rendered = true;
             die;
         } catch (Exception $ex) {
             throw new HttpError(404);
         }
     }
     return false;
 }
Example #4
0
 public function test_css()
 {
     $js = \Difra\Resourcer::getInstance('js')->compile('main');
     $this->assertNotEmpty($js);
 }
Example #5
0
 /**
  * Try to detect locale record usages
  * @param $xpath
  * @return int
  * @throws \Difra\Exception
  */
 public function findUsages($xpath)
 {
     static $cache = [];
     if (isset($cache[$xpath])) {
         return $cache[$xpath];
     }
     static $templates = null;
     if (is_null($templates)) {
         $resourcer = Resourcer::getInstance('xslt');
         $types = $resourcer->findInstances();
         foreach ($types as $type) {
             $templates[$type] = $resourcer->compile($type);
         }
     }
     $matches = 0;
     foreach ($templates as $tpl) {
         $matches += substr_count($tpl, '"$locale/' . $xpath . '"');
         $matches += substr_count($tpl, '{$locale/' . $xpath . '}');
     }
     static $menus = null;
     if (is_null($menus)) {
         $resourcer = Resourcer::getInstance('menu');
         $types = $resourcer->findInstances();
         foreach ($types as $type) {
             $menus[$type] = $resourcer->compile($type);
         }
     }
     foreach ($menus as $tpl) {
         $matches += substr_count($tpl, 'xpath="locale/' . $xpath . '"');
     }
     static $controllers = null;
     if (is_null($controllers)) {
         $controllers = [];
         $dirs = Action::getControllerPaths();
         foreach ($dirs as $dir) {
             $this->getAllFiles($controllers, $dir);
             $this->getAllFiles($controllers, $dir . '../lib');
         }
     }
     foreach ($controllers as $controller) {
         $matches += substr_count($controller, "'" . $xpath . "'");
         $matches += substr_count($controller, '"' . $xpath . '"');
     }
     return $cache[$xpath] = $matches;
 }