/** *@param XSLFilenameProcessor $xslFile *@param Context $context *@return Uri *@desc */ public static function getUriFromXsl($xslFile, $context) { //System.Uri uri = snippetProcessor.ResolveUri(null, xslFile.FullQualifiedNameAndPath()); if (!$xslFile->Exists()) { if (!$xslFile->UseFileFromAnyLanguage()) { throw new EngineException("XSL document \"" . $xslFile->FullQualifiedName() . "\" not found in local site or shared locations.", 754); } } return FileUtil::getUriFromFile($xslFile->FullQualifiedNameAndPath()); }
/** * Create and show the list of Xsl Templates * * @param String $caption * @param XmlParagraphCollection $paragraph * @param Array $filelist * @param Array $xslUsed * @param XSLFilenameProcessor $xsl */ private function generateList($caption, $paragraph, $filelist, $xslUsed, $xsl) { $paragraph->addXmlnukeObject(new XmlnukeText($caption, true)); $listCollection = new XmlListCollection(XmlListType::UnorderedList); $paragraph->addXmlnukeObject($listCollection); foreach ($filelist as $file) { $xslname = FileUtil::ExtractFileName($file); $xslname = $xsl->removeLanguage($xslname); if (!in_array($xslname, $xslUsed)) { $objectList = new XmlnukeSpanCollection(); $listCollection->addXmlnukeObject($objectList); $xslUsed[] = $xslname; if ($xslname == "index") { $anchor = new XmlAnchorCollection("engine:xmlnuke?xml=index&xsl=index"); $anchor->addXmlnukeObject(new XmlnukeText($xslname, true)); $objectList->addXmlnukeObject($anchor); } else { $anchor = new XmlAnchorCollection("module:Xmlnuke.XSLTheme?xsl=" . $xslname); $anchor->addXmlnukeObject(new XmlnukeText($xslname, true)); $objectList->addXmlnukeObject($anchor); } } } }
public function CreatePage() { parent::CreatePage(); // Doesnt necessary get PX, because PX is protected! $deleteMode = false; $action = strtolower($this->_action); $id = $this->_context->get("id"); $contents = ""; $myWords = $this->WordCollection(); $this->setHelp($myWords->Value("DESCRIPTION")); $this->setTitlePage($myWords->Value("TITLE")); //XmlNodes $block = $this->_px->addBlockCenter($myWords->Value("WORKINGAREA")); /* XmlNode paragraph; XmlNode form; XmlNode boxButton; */ //processor.XSLFilenameProcessor xslFile; // -------------------------------------- // CHECK ACTION // -------------------------------------- if ($action == "edit" || $action == "new") { $contents = $this->_context->get("contents"); $contents = stripslashes($contents); try { // It is necessary only to load the document to check if it is OK. // If OK, use the original raw file $xsl = XmlUtil::CreateXmlDocumentFromStr($contents); $xslFile = new XSLFilenameProcessor($id); FileUtil::QuickFileWrite($xslFile->FullQualifiedNameAndPath(), str_replace("&#", "&#", $contents)); $paragraph = $this->_px->addParagraph($block); FileUtil::DeleteFilesFromPath($this->_cacheFile); FileUtil::DeleteFilesFromPath(new XSLCacheFilenameProcessor("")); $this->_px->addBold($paragraph, $myWords->Value("SAVED")); } catch (Exception $ex) { $paragraph = $this->_px->addParagraph($block); $this->_px->AddErrorMessage($paragraph, $contents, $ex); } } if ($action == "delete") { $paragraph = $this->_px->addParagraph($block); $this->_px->addHref($paragraph, "module:Xmlnuke.Admin.ManageXSL?id=" . $this->_context->get("id") . "&action=confirmdelete", $myWords->Value("CONFIRMDELETE", $this->_context->get("id")), null); $deleteMode = true; } if ($action == "confirmdelete") { $paragraph = $this->_px->addParagraph($block); FileUtil::DeleteFile(new XSLFilenameProcessor($this->_context->get("id"))); $this->_px->addBold($paragraph, $myWords->Value("DELETED")); $deleteMode = true; } // -------------------------------------- // EDIT XSL PAGE // -------------------------------------- // If doesnt have an ID, list all pages or add new! if ($id == "") { //XmlNode list; //XmlNode optlist; $xslFile = new XSLFilenameProcessor("page"); //array $templates = FileUtil::RetrieveFilesFromFolder($xslFile->PathSuggested(), "." . strtolower($this->_context->Language()->getName() . $xslFile->Extension())); $paragraph = $this->_px->addParagraph($block); $this->_px->addText($paragraph, $myWords->Value("SELECTPAGE")); $list = $this->_px->addUnorderedList($paragraph); foreach ($templates as $key) { $optlist = $this->_px->addOptionList($list); //$xslKey = substr($key, strlen($xslFile->PathSuggested())); $xslKey = basename($key); $xslKey = FilenameProcessor::StripLanguageInfo($xslKey); $this->_px->addHref($optlist, "module:Xmlnuke.Admin.ManageXSL?id=" . $xslKey, $xslKey, null); $this->_px->addText($optlist, " ["); $this->_px->addHref($optlist, "module:Xmlnuke.Admin.ManageXSL?id=" . $xslKey . "&action=delete", $myWords->Value("TXT_DELETE"), null); $this->_px->addText($optlist, "]"); } $action = "new"; } else { $this->addMenuOption($myWords->Value("NEWPAGE"), "module:Xmlnuke.Admin.ManageXSL", null); $this->addMenuOption($myWords->Value("PREVIEWPAGE"), "engine:xmlnuke?xml=home&xsl=" . $id . "&lang=" . $this->_context->Language()->getName(), null); //array $langAvail = $this->_context->LanguagesAvailable(); foreach ($langAvail as $key => $value) { if ($key != strtolower($this->_context->Language()->getName())) { } $this->addMenuOption($myWords->ValueArgs("EDITXSLMENU", array($value)), "module:Xmlnuke.Admin.ManageXSL?id=" . $id . "&lang=" . $key, null); } $action = "edit"; } if (!$deleteMode) { $paragraph = $this->_px->addParagraph($block); //XMLNodes $table = $this->_px->addTable($paragraph); $row = $this->_px->addTableRow($table); $col = $this->_px->addTableColumn($row); $form = $this->_px->addForm($col, "module:Xmlnuke.Admin.ManageXSL", "", "form", true); if ($action == "new") { $this->_px->addTextBox($form, $myWords->Value("XSLBOX"), "id", "", 20, true, INPUTTYPE::TEXT); } else { $this->_px->addLabelField($form, $myWords->Value("XSLBOX"), $id); $this->_px->addHidden($form, "id", $id); $xslFile = new XSLFilenameProcessor($id); if (FileUtil::Exists($xslFile->FullQualifiedNameAndPath())) { //XmlDocument $xsl = XmlUtil::CreateXmlDocumentFromFile($xslFile->FullQualifiedNameAndPath()); $contents = XmlUtil::GetFormattedDocument($xsl); } } $this->_px->addLabelField($form, $myWords->Value("LANGUAGEBOX"), strtolower($this->_context->Language()->getName())); $this->_px->addMemo($form, $myWords->Value("LABEL_CONTENT"), "contents", $contents, 80, 30, "soft"); $this->_px->addHidden($form, "action", $action); $boxButton = $this->_px->addBoxButtons($form); $this->_px->addSubmit($boxButton, "", $myWords->Value("TXT_SAVE")); } return $this->_px; }
public function getXsl() { $xslFile = new XSLFilenameProcessor("admin"); $xslFile->UseFileFromAnyLanguage(); return $xslFile; }
/** *@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()); } }