104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeaunamespace ComboStrap; 404fd306cSNickeau 504fd306cSNickeau 604fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName; 704fd306cSNickeauuse ComboStrap\Web\Url; 804fd306cSNickeauuse ComboStrap\Web\UrlEndpoint; 904fd306cSNickeauuse dokuwiki\Action\Exception\FatalException; 1004fd306cSNickeauuse dokuwiki\ActionRouter; 11*70bbd7f1Sgerardnicouse dokuwiki\Ui\PageView; 1204fd306cSNickeau 1304fd306cSNickeau/** 1404fd306cSNickeau * No Cache for the idenity forms 1504fd306cSNickeau * as if there is a cache problems, 1604fd306cSNickeau * We can't login anymore for instance 1704fd306cSNickeau */ 1804fd306cSNickeauclass FetcherAppPages extends IFetcherAbs implements IFetcherString 1904fd306cSNickeau{ 2004fd306cSNickeau 2104fd306cSNickeau const NAME = "page-app"; 2204fd306cSNickeau const CANONICAL = "page-app"; 2304fd306cSNickeau 2404fd306cSNickeau use FetcherTraitWikiPath; 2504fd306cSNickeau 2604fd306cSNickeau private string $requestedLayout; 2704fd306cSNickeau private bool $build = false; 2804fd306cSNickeau 2904fd306cSNickeau 3004fd306cSNickeau private TemplateForWebPage $pageTemplate; 3104fd306cSNickeau 3204fd306cSNickeau 3304fd306cSNickeau /** 3404fd306cSNickeau * @param Url|null $url 3504fd306cSNickeau * @return Url 3604fd306cSNickeau * 3704fd306cSNickeau * Note: The fetch url is the {@link FetcherCache keyCache} 3804fd306cSNickeau */ 3904fd306cSNickeau function getFetchUrl(Url $url = null): Url 4004fd306cSNickeau { 4104fd306cSNickeau /** 4204fd306cSNickeau * Overwrite default fetcher endpoint 4304fd306cSNickeau * that is {@link UrlEndpoint::createFetchUrl()} 4404fd306cSNickeau */ 4504fd306cSNickeau $url = UrlEndpoint::createDokuUrl(); 4604fd306cSNickeau try { 4704fd306cSNickeau $url->addQueryParameter(PageTemplateName::PROPERTY_NAME, $this->getRequestedLayout()); 4804fd306cSNickeau } catch (ExceptionNotFound $e) { 4904fd306cSNickeau // no requested layout 5004fd306cSNickeau } 5104fd306cSNickeau return parent::getFetchUrl($url) 5204fd306cSNickeau ->addQueryParameter("do", self::NAME); 5304fd306cSNickeau } 5404fd306cSNickeau 5504fd306cSNickeau 5604fd306cSNickeau /** 5704fd306cSNickeau * @return string 5804fd306cSNickeau */ 5904fd306cSNickeau public function getFetchString(): string 6004fd306cSNickeau { 6104fd306cSNickeau 6204fd306cSNickeau $contextPath = $this->getSourcePath(); 6304fd306cSNickeau if ($contextPath->hasRevision()) { 6404fd306cSNickeau /** 6504fd306cSNickeau * In the diff {@link ExecutionContext::DIFF_ACTION}, 6604fd306cSNickeau * the `rev` property is passed in the URL and we get a bad context 6704fd306cSNickeau */ 6804fd306cSNickeau $contextPath = WikiPath::createMarkupPathFromId($contextPath->getWikiId()); 6904fd306cSNickeau } 7004fd306cSNickeau 7104fd306cSNickeau 7204fd306cSNickeau if (!$this->build) { 7304fd306cSNickeau 7404fd306cSNickeau $this->build = true; 7504fd306cSNickeau $pageLang = Site::getLangObject(); 7604fd306cSNickeau $title = $this->getLabel(); 7704fd306cSNickeau 7804fd306cSNickeau $this->pageTemplate = TemplateForWebPage::create() 7904fd306cSNickeau ->setRequestedTemplateName($this->getRequestedTemplateOrDefault()) 8004fd306cSNickeau ->setRequestedLang($pageLang) 8104fd306cSNickeau ->setRequestedEnableTaskRunner(false) // no page id 8204fd306cSNickeau ->setRequestedTitle($title) 8304fd306cSNickeau ->setRequestedContextPath($contextPath); 8404fd306cSNickeau 8504fd306cSNickeau } 8604fd306cSNickeau 8704fd306cSNickeau 8804fd306cSNickeau /** 8904fd306cSNickeau * The content 9004fd306cSNickeau * 9104fd306cSNickeau * Adapted from {@link tpl_content()} 9204fd306cSNickeau * 9304fd306cSNickeau * As this is only for identifier forms, 9404fd306cSNickeau * the buffer should not be a problem 9504fd306cSNickeau * 9604fd306cSNickeau * Because all admin action are using the php buffer 9704fd306cSNickeau * We can then have an overflow 9804fd306cSNickeau */ 9904fd306cSNickeau global $ACT; 10004fd306cSNickeau ob_start(); 10104fd306cSNickeau $actionName = FetcherAppPages::class . "::tpl_content_core"; 10204fd306cSNickeau \dokuwiki\Extension\Event::createAndTrigger('TPL_ACT_RENDER', $ACT, $actionName); 10304fd306cSNickeau $mainHtml = ob_get_clean(); 10404fd306cSNickeau 10504fd306cSNickeau 10604fd306cSNickeau /** 10704fd306cSNickeau * Add css 10804fd306cSNickeau */ 10904fd306cSNickeau switch ($ACT) { 11004fd306cSNickeau case ExecutionContext::PREVIEW_ACTION: 11104fd306cSNickeau case ExecutionContext::EDIT_ACTION: 11204fd306cSNickeau $markupPath = MarkupPath::createPageFromPathObject($contextPath); 11304fd306cSNickeau if ($ACT === ExecutionContext::PREVIEW_ACTION && $markupPath->isSlot()) { 11404fd306cSNickeau try { 11504fd306cSNickeau SlotSystem::sendContextPathMessage(SlotSystem::getContextPath()); 11604fd306cSNickeau } catch (ExceptionNotFound $e) { 11704fd306cSNickeau // no history (ie no cookie or new installation) 11804fd306cSNickeau } 11904fd306cSNickeau } 12004fd306cSNickeau } 12104fd306cSNickeau 12204fd306cSNickeau 12304fd306cSNickeau /** 12404fd306cSNickeau * Generate the whole html page via the layout 12504fd306cSNickeau */ 12604fd306cSNickeau return $this->pageTemplate 12704fd306cSNickeau ->setMainContent($mainHtml) 12804fd306cSNickeau ->render(); 12904fd306cSNickeau 13004fd306cSNickeau } 13104fd306cSNickeau 13204fd306cSNickeau 13304fd306cSNickeau /** 13404fd306cSNickeau * 13504fd306cSNickeau */ 13604fd306cSNickeau function getBuster(): string 13704fd306cSNickeau { 13804fd306cSNickeau return ""; 13904fd306cSNickeau } 14004fd306cSNickeau 14104fd306cSNickeau public function getMime(): Mime 14204fd306cSNickeau { 14304fd306cSNickeau return Mime::create(Mime::HTML); 14404fd306cSNickeau } 14504fd306cSNickeau 14604fd306cSNickeau public function getFetcherName(): string 14704fd306cSNickeau { 14804fd306cSNickeau return self::NAME; 14904fd306cSNickeau } 15004fd306cSNickeau 15104fd306cSNickeau /** 15204fd306cSNickeau * We take over the {@link tpl_content_core()} of Dokuwiki 15304fd306cSNickeau * because the instance of the router is not reinit. 15404fd306cSNickeau * We get then problem on test because of the private global static {@link ActionRouter::$instance) variable 15504fd306cSNickeau * @return bool 15604fd306cSNickeau * @noinspection PhpUnused - is a callback to the event TPL_ACT_RENDER called in this class 15704fd306cSNickeau */ 15804fd306cSNickeau static public function tpl_content_core(): bool 15904fd306cSNickeau { 16004fd306cSNickeau 16104fd306cSNickeau /** 162*70bbd7f1Sgerardnico * $INFO['prependTOC'] = ''; // php8 Undefined array key "prependTOC" 163*70bbd7f1Sgerardnico * at {@link PageView} 164*70bbd7f1Sgerardnico */ 165*70bbd7f1Sgerardnico global $INFO; 166*70bbd7f1Sgerardnico if (!array_key_exists('prependTOC', $INFO)) { 167*70bbd7f1Sgerardnico $INFO['prependTOC'] = false; 168*70bbd7f1Sgerardnico } 169*70bbd7f1Sgerardnico 170*70bbd7f1Sgerardnico /** 17104fd306cSNickeau * Was false, is true 17204fd306cSNickeau */ 17304fd306cSNickeau $router = ActionRouter::getInstance(true); 17404fd306cSNickeau try { 17504fd306cSNickeau $router->getAction()->tplContent(); 17604fd306cSNickeau } catch (FatalException $e) { 17704fd306cSNickeau // there was no content for the action 17804fd306cSNickeau msg(hsc($e->getMessage()), -1); 17904fd306cSNickeau return false; 18004fd306cSNickeau } 18104fd306cSNickeau return true; 18204fd306cSNickeau } 18304fd306cSNickeau 18404fd306cSNickeau /** 18504fd306cSNickeau * @throws ExceptionNotFound 18604fd306cSNickeau */ 18704fd306cSNickeau private function getRequestedLayout(): string 18804fd306cSNickeau { 18904fd306cSNickeau if (!isset($this->requestedLayout)) { 19004fd306cSNickeau throw new ExceptionNotFound("No requested layout"); 19104fd306cSNickeau } 19204fd306cSNickeau return $this->requestedLayout; 19304fd306cSNickeau } 19404fd306cSNickeau 19504fd306cSNickeau 19604fd306cSNickeau /** 19704fd306cSNickeau * 19804fd306cSNickeau */ 19904fd306cSNickeau public function close(): FetcherAppPages 20004fd306cSNickeau { 20104fd306cSNickeau // nothing to do 20204fd306cSNickeau return $this; 20304fd306cSNickeau } 20404fd306cSNickeau 20504fd306cSNickeau 20604fd306cSNickeau private function getRequestedTemplateOrDefault(): string 20704fd306cSNickeau { 20804fd306cSNickeau try { 20904fd306cSNickeau return $this->getRequestedLayout(); 21004fd306cSNickeau } catch (ExceptionNotFound $e) { 21104fd306cSNickeau global $ACT; 21204fd306cSNickeau switch ($ACT) { 21304fd306cSNickeau case ExecutionContext::EDIT_ACTION: 21404fd306cSNickeau case ExecutionContext::PREVIEW_ACTION: 21504fd306cSNickeau return PageTemplateName::APP_EDIT; 21604fd306cSNickeau case ExecutionContext::LOGIN_ACTION: 21704fd306cSNickeau return PageTemplateName::APP_LOGIN; 21804fd306cSNickeau case ExecutionContext::REGISTER_ACTION: 21904fd306cSNickeau return PageTemplateName::APP_REGISTER; 22004fd306cSNickeau case ExecutionContext::RESEND_PWD_ACTION: 22104fd306cSNickeau return PageTemplateName::APP_RESEND_PWD; 22204fd306cSNickeau case ExecutionContext::REVISIONS_ACTION: 22304fd306cSNickeau return PageTemplateName::APP_REVISIONS; 22404fd306cSNickeau case ExecutionContext::DIFF_ACTION: 22504fd306cSNickeau return PageTemplateName::APP_DIFF; 22604fd306cSNickeau case ExecutionContext::INDEX_ACTION: 22704fd306cSNickeau return PageTemplateName::APP_INDEX; 22804fd306cSNickeau case ExecutionContext::PROFILE_ACTION: 22904fd306cSNickeau return PageTemplateName::APP_PROFILE; 23004fd306cSNickeau default: 23104fd306cSNickeau case ExecutionContext::SEARCH_ACTION: 23204fd306cSNickeau return PageTemplateName::APP_SEARCH; 23304fd306cSNickeau } 23404fd306cSNickeau 23504fd306cSNickeau } 23604fd306cSNickeau } 23704fd306cSNickeau 23804fd306cSNickeau 23904fd306cSNickeau public function getLabel(): string 24004fd306cSNickeau { 24104fd306cSNickeau global $ACT; 24204fd306cSNickeau $label = "App Pages"; 24304fd306cSNickeau switch ($ACT) { 24404fd306cSNickeau case ExecutionContext::RESEND_PWD_ACTION: 24504fd306cSNickeau $label = "Resend Password"; 24604fd306cSNickeau break; 24704fd306cSNickeau case ExecutionContext::LOGIN_ACTION: 24804fd306cSNickeau $label = "Login"; 24904fd306cSNickeau break; 25004fd306cSNickeau case ExecutionContext::REGISTER_ACTION: 25104fd306cSNickeau $label = "Register"; 25204fd306cSNickeau break; 25304fd306cSNickeau case ExecutionContext::EDIT_ACTION: 25404fd306cSNickeau case ExecutionContext::PREVIEW_ACTION: 25504fd306cSNickeau $label = "Editor"; 25604fd306cSNickeau break; 25704fd306cSNickeau case ExecutionContext::DIFF_ACTION: 25804fd306cSNickeau $label = "Diff"; 25904fd306cSNickeau break; 26004fd306cSNickeau case ExecutionContext::REVISIONS_ACTION: 26104fd306cSNickeau $label = "Log"; 26204fd306cSNickeau break; 26304fd306cSNickeau } 26404fd306cSNickeau return $label; 26504fd306cSNickeau } 26604fd306cSNickeau 26704fd306cSNickeau 26804fd306cSNickeau /** 26904fd306cSNickeau * @throws ExceptionBadArgument 27004fd306cSNickeau * @throws ExceptionBadSyntax 27104fd306cSNickeau * @throws ExceptionNotExists 27204fd306cSNickeau * @throws ExceptionNotFound 27304fd306cSNickeau */ 27404fd306cSNickeau public function buildFromTagAttributes(TagAttributes $tagAttributes): IFetcher 27504fd306cSNickeau { 27604fd306cSNickeau parent::buildFromTagAttributes($tagAttributes); 27704fd306cSNickeau $this->buildOriginalPathFromTagAttributes($tagAttributes); 27804fd306cSNickeau return $this; 27904fd306cSNickeau } 28004fd306cSNickeau} 281