/** *@desc Transform an XMLDocument object with an XSLFile *@param DOMDocument $xml *@param XSLFilenameProcessor $xslFile XSL File *@return string - The transformation string */ public function TransformDocument($xml, $xslFile) { // Add a custom XML based on attribute xmlobjet inside root // Example: // <page xmlobject="plugin.name(param1, param2)"> $pattern = "/(?P<plugin>.*?)\\s*\\((?P<param>([#']?.*?[#']?\\s*,?\\s*)+)?\\)/"; $xmlRoot = $xml->documentElement; $xmlRootAttributes = $xmlRoot->attributes; if ($xmlRootAttributes != null) { foreach ($xmlRootAttributes as $attr) { if ($attr->nodeName == "xmlobject") { $match = preg_match_all($pattern, $attr->value, $matches); for ($iCount = 0; $iCount < $match; $iCount++) { $param = explode(",", $matches["param"][$iCount]); for ($i = 0; $i <= 4; $i++) { if (count($param) < $i + 1) { $param[] = null; } elseif ($param[$i] == "#CONTEXT#") { $param[$i] = $this->_context; } else { $param[$i] = trim($param[$i]); } } $className = str_replace('.', '\\', $matches["plugin"][$iCount]); if ($className[0] != '\\') { $className = "\\{$className}"; } $plugin = new $className($param[0], $param[1], $param[2], $param[3], $param[4]); if ($plugin instanceof IXmlnukeDocumentObject) { $plugin->generateObject($xmlRoot); } else { $handler = new ObjectHandler($xmlRoot, $plugin); $handler->CreateObjectFromModel(); } } } else { if ($attr->nodeName == 'xsl') { $xslFile = new XSLFilenameProcessor($attr->value); } } } } // Check if there is no XSL template if ($this->_outputResult != OutputData::Xslt) { if ($this->_extractNodes == "") { $outDocument = $xml; } else { $nodes = XmlUtil::selectNodes($xml->documentElement, "/" . $this->_extractNodes); $retDocument = XmlUtil::CreateXmlDocumentFromStr("<" . $this->_extractNodesRoot . "/>", false); $nodeRoot = $retDocument->documentElement; XmlUtil::AddAttribute($nodeRoot, "xpath", $this->_extractNodes); foreach ($nodes as $node) { $nodeToAdd = XmlUtil::CreateChild($nodeRoot, $node->nodeName, ""); $attributes = $node->attributes; foreach ($attributes as $value) { XmlUtil::AddAttribute($nodeToAdd, $value->nodeName, $value->nodeValue); } XmlUtil::AddNodeFromNode($nodeToAdd, $node); } $outDocument = $retDocument; } if ($this->_outputResult == OutputData::Json) { return ObjectHandler::xml2json($outDocument, $this->_extraParams["json_function"]); } else { return $outDocument->saveXML(); } } $this->_context->setXsl($xslFile->ToString()); // Set up a transform object with the XSLT file //XslTransform xslTran = new XslTransform(); $xslTran = new XSLTProcessor(); $snippetProcessor = new SnippetProcessor($xslFile); //Uri try { $uri = $snippetProcessor->getUriFromXsl($xslFile, $this->_context); } catch (XMLNukeException $ex) { throw new EngineException("Cannot load XSL file. The following error occured: " . $ex->getMessage(), 751); } //Process smipets and put teh xsl StyleShet try { $xsl = $snippetProcessor->IncludeSnippet($uri); } catch (XMLNukeException $ex) { throw new EngineException("Cannot load XSL cache file. The following error occured: " . $ex->getMessage(), 752); } $xsl = FileUtil::fixUTF8($xsl); $xslDom = new DOMDocument(); $xslDom->loadXML($xsl); $xslTran->importStyleSheet($xslDom); // Create Argument List $xslTran->setParameter("", "xml", $this->_context->getXml()); $xslTran->setParameter("", "xsl", $this->_context->getXsl()); $xslTran->setParameter("", "site", '_all'); $xslTran->setParameter("", "lang", $this->_context->Language()->getName()); $xslTran->setParameter("", "module", $this->_context->getModule()); $xslTran->setParameter("", "transformdate", date("Y-m-d H:i:s")); $xslTran->setParameter("", "urlbase", $this->_context->get("xmlnuke.URLBASE")); $xslTran->setParameter("", "engine", "PHP"); $xslTran->setParameter("", "url", $this->_context->getServerName(false, true) . $this->_context->get('REQUEST_URI')); //Transform and output $xtw = $xslTran->transformToXML($xml); $xhtml = new DOMDocument(); $xhtml->loadXML($xtw); // Reload XHTML result to process PARAM and HREFs $paramProcessor = new ParamProcessor(); $paramProcessor->AdjustToFullLink($xhtml, "A", "HREF"); $paramProcessor->AdjustToFullLink($xhtml, "FORM", "ACTION"); $paramProcessor->AdjustToFullLink($xhtml, "AREA", "HREF"); $paramProcessor->AdjustToFullLink($xhtml, "LINK", "HREF"); if ($this->_context->get("xmlnuke.ENABLEPARAMPROCESSOR")) { $paramProcessor->ProcessParameters($xhtml); } // ATENCAO: O codigo gerado pelo saveXML faz com que elementos vazios sejam // comprimidos. Exemplo: <table /> // para o HTML isso eh ruim. Logo o metodo deve ser saveHTML que deixa o tag // assim: <table></table> $arrCt = $this->_context->getSuggestedContentType(); if ($arrCt["content-type"] == "text/html") { return FileUtil::fixUTF8(strtr($xhtml->saveHTML(), array("></br>" => "/>"))); } else { return FileUtil::fixUTF8($xhtml->saveXML()); } }
/** *@param string $strHref *@return string - Return the new string if exists engine:xmlnuke or module:... Otherwise returns the original value *@desc Replace a HREF value with XMLNuke context values. */ public function GetFullLink($strHref) { $arResult = array(); $result = ""; $pattern = "(?:(?P<protocol>module|admin|engine):)?(?P<host>[\\w\\d\\-\\.]*)(?P<port>:\\d*)?(?:\\?(?P<param>(([\\w\\d\\W]*=[\\w\\d\\W]*)(?:&(?:amp;)?)?)*))?"; preg_match_all("/{$pattern}/", $strHref, $arResult); $sep = "?"; switch ($arResult["protocol"][0]) { case "engine": if ($arResult["host"][0] == "xmlnuke") { $result = $this->_context->UrlXmlnukeEngine() . $arResult["port"][0]; } else { $result = "Unknow Engine " . $arResult["host"][0]; } break; case "module": if ($arResult['host'][0] == '__self__') { $result = $this->_context->UrlModule() . $arResult["port"][0] . "?module=" . $this->_context->getModule(); } else { $result = $this->_context->UrlModule() . $arResult["port"][0] . "?module=" . $arResult["host"][0]; } $sep = "&"; break; case "admin": if ($arResult["host"] == "engine") { $result = $this->_context->UrlXmlNukeAdmin() . $arResult["port"][0]; } else { $result = $this->_context->UrlModule() . $arResult["port"][0] . "?module=" . (strpos($arResult["host"][0], ".") === false ? "Xmlnuke.Admin." : "") . $arResult["host"][0]; $sep = "&"; } break; default: return $strHref; } $arParam = array(); $xmlnukeParam = array(); $fullLink = $this->_context->get("xmlnuke.USEFULLPARAMETER") == "true"; if ($fullLink || $this->_context->getXsl() != $this->_context->get("xmlnuke.DEFAULTPAGE")) { $xmlnukeParam["xsl"] = $this->_context->getXsl() == "index" ? $this->_context->get("xmlnuke.DEFAULTPAGE") : $this->_context->getXsl(); } if ($fullLink) { $xmlnukeParam["xml"] = $this->_context->getXml(); } if ($fullLink || array_key_exists("lang", $_REQUEST) && $_REQUEST["lang"] == strtolower($this->_context->Language()->getName())) { $xmlnukeParam["lang"] = strtolower($this->_context->Language()->getName()); } $paramsTmp = explode("&", str_replace("&", "&", $arResult["param"][0])); foreach ($paramsTmp as $value) { $arTmp = explode("=", $value); switch ($arTmp[0]) { case "xml": case "xsl": case "lang": $xmlnukeParam[$arTmp[0]] = $arTmp[1]; break; default: if ($value != "") { $arParam[] = $value; } } } $strParam = implode("&", $arParam); $arParam2 = array(); foreach ($xmlnukeParam as $key => $value) { $arParam2[] = $key . "=" . $value; } $strParam2 = implode("&", $arParam2); $paramsFinal = $strParam2 . (!empty($strParam2) && !empty($strParam) ? "&" : "") . $strParam; return $this->_context->VirtualPathAbsolute($result . ($paramsFinal != "" ? $sep . $paramsFinal : "")); }