1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap; 4*04fd306cSNickeau 5*04fd306cSNickeau 6*04fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName; 7*04fd306cSNickeauuse ComboStrap\Web\Url; 8*04fd306cSNickeauuse ComboStrap\Web\UrlEndpoint; 9*04fd306cSNickeauuse dokuwiki\Action\Exception\FatalException; 10*04fd306cSNickeauuse dokuwiki\ActionRouter; 11*04fd306cSNickeau 12*04fd306cSNickeau/** 13*04fd306cSNickeau * No Cache for the idenity forms 14*04fd306cSNickeau * as if there is a cache problems, 15*04fd306cSNickeau * We can't login anymore for instance 16*04fd306cSNickeau */ 17*04fd306cSNickeauclass FetcherAppPages extends IFetcherAbs implements IFetcherString 18*04fd306cSNickeau{ 19*04fd306cSNickeau 20*04fd306cSNickeau const NAME = "page-app"; 21*04fd306cSNickeau const CANONICAL = "page-app"; 22*04fd306cSNickeau 23*04fd306cSNickeau use FetcherTraitWikiPath; 24*04fd306cSNickeau 25*04fd306cSNickeau private string $requestedLayout; 26*04fd306cSNickeau private bool $build = false; 27*04fd306cSNickeau 28*04fd306cSNickeau 29*04fd306cSNickeau private TemplateForWebPage $pageTemplate; 30*04fd306cSNickeau 31*04fd306cSNickeau 32*04fd306cSNickeau /** 33*04fd306cSNickeau * @param Url|null $url 34*04fd306cSNickeau * @return Url 35*04fd306cSNickeau * 36*04fd306cSNickeau * Note: The fetch url is the {@link FetcherCache keyCache} 37*04fd306cSNickeau */ 38*04fd306cSNickeau function getFetchUrl(Url $url = null): Url 39*04fd306cSNickeau { 40*04fd306cSNickeau /** 41*04fd306cSNickeau * Overwrite default fetcher endpoint 42*04fd306cSNickeau * that is {@link UrlEndpoint::createFetchUrl()} 43*04fd306cSNickeau */ 44*04fd306cSNickeau $url = UrlEndpoint::createDokuUrl(); 45*04fd306cSNickeau try { 46*04fd306cSNickeau $url->addQueryParameter(PageTemplateName::PROPERTY_NAME, $this->getRequestedLayout()); 47*04fd306cSNickeau } catch (ExceptionNotFound $e) { 48*04fd306cSNickeau // no requested layout 49*04fd306cSNickeau } 50*04fd306cSNickeau return parent::getFetchUrl($url) 51*04fd306cSNickeau ->addQueryParameter("do", self::NAME); 52*04fd306cSNickeau } 53*04fd306cSNickeau 54*04fd306cSNickeau 55*04fd306cSNickeau /** 56*04fd306cSNickeau * @return string 57*04fd306cSNickeau */ 58*04fd306cSNickeau public function getFetchString(): string 59*04fd306cSNickeau { 60*04fd306cSNickeau 61*04fd306cSNickeau $contextPath = $this->getSourcePath(); 62*04fd306cSNickeau if($contextPath->hasRevision()) { 63*04fd306cSNickeau /** 64*04fd306cSNickeau * In the diff {@link ExecutionContext::DIFF_ACTION}, 65*04fd306cSNickeau * the `rev` property is passed in the URL and we get a bad context 66*04fd306cSNickeau */ 67*04fd306cSNickeau $contextPath = WikiPath::createMarkupPathFromId($contextPath->getWikiId()); 68*04fd306cSNickeau } 69*04fd306cSNickeau 70*04fd306cSNickeau 71*04fd306cSNickeau if (!$this->build) { 72*04fd306cSNickeau 73*04fd306cSNickeau $this->build = true; 74*04fd306cSNickeau $pageLang = Site::getLangObject(); 75*04fd306cSNickeau $title = $this->getLabel(); 76*04fd306cSNickeau 77*04fd306cSNickeau $this->pageTemplate = TemplateForWebPage::create() 78*04fd306cSNickeau ->setRequestedTemplateName($this->getRequestedTemplateOrDefault()) 79*04fd306cSNickeau ->setRequestedLang($pageLang) 80*04fd306cSNickeau ->setRequestedEnableTaskRunner(false) // no page id 81*04fd306cSNickeau ->setRequestedTitle($title) 82*04fd306cSNickeau ->setRequestedContextPath($contextPath); 83*04fd306cSNickeau 84*04fd306cSNickeau } 85*04fd306cSNickeau 86*04fd306cSNickeau 87*04fd306cSNickeau /** 88*04fd306cSNickeau * The content 89*04fd306cSNickeau * 90*04fd306cSNickeau * Adapted from {@link tpl_content()} 91*04fd306cSNickeau * 92*04fd306cSNickeau * As this is only for identifier forms, 93*04fd306cSNickeau * the buffer should not be a problem 94*04fd306cSNickeau * 95*04fd306cSNickeau * Because all admin action are using the php buffer 96*04fd306cSNickeau * We can then have an overflow 97*04fd306cSNickeau */ 98*04fd306cSNickeau global $ACT; 99*04fd306cSNickeau ob_start(); 100*04fd306cSNickeau $actionName = FetcherAppPages::class . "::tpl_content_core"; 101*04fd306cSNickeau \dokuwiki\Extension\Event::createAndTrigger('TPL_ACT_RENDER', $ACT, $actionName); 102*04fd306cSNickeau $mainHtml = ob_get_clean(); 103*04fd306cSNickeau 104*04fd306cSNickeau 105*04fd306cSNickeau /** 106*04fd306cSNickeau * Add css 107*04fd306cSNickeau */ 108*04fd306cSNickeau switch ($ACT) { 109*04fd306cSNickeau case ExecutionContext::PREVIEW_ACTION: 110*04fd306cSNickeau case ExecutionContext::EDIT_ACTION: 111*04fd306cSNickeau $markupPath = MarkupPath::createPageFromPathObject($contextPath); 112*04fd306cSNickeau if ($ACT === ExecutionContext::PREVIEW_ACTION && $markupPath->isSlot()) { 113*04fd306cSNickeau try { 114*04fd306cSNickeau SlotSystem::sendContextPathMessage(SlotSystem::getContextPath()); 115*04fd306cSNickeau } catch (ExceptionNotFound $e) { 116*04fd306cSNickeau // no history (ie no cookie or new installation) 117*04fd306cSNickeau } 118*04fd306cSNickeau } 119*04fd306cSNickeau } 120*04fd306cSNickeau 121*04fd306cSNickeau 122*04fd306cSNickeau /** 123*04fd306cSNickeau * Generate the whole html page via the layout 124*04fd306cSNickeau */ 125*04fd306cSNickeau return $this->pageTemplate 126*04fd306cSNickeau ->setMainContent($mainHtml) 127*04fd306cSNickeau ->render(); 128*04fd306cSNickeau 129*04fd306cSNickeau } 130*04fd306cSNickeau 131*04fd306cSNickeau 132*04fd306cSNickeau /** 133*04fd306cSNickeau * 134*04fd306cSNickeau */ 135*04fd306cSNickeau function getBuster(): string 136*04fd306cSNickeau { 137*04fd306cSNickeau return ""; 138*04fd306cSNickeau } 139*04fd306cSNickeau 140*04fd306cSNickeau public function getMime(): Mime 141*04fd306cSNickeau { 142*04fd306cSNickeau return Mime::create(Mime::HTML); 143*04fd306cSNickeau } 144*04fd306cSNickeau 145*04fd306cSNickeau public function getFetcherName(): string 146*04fd306cSNickeau { 147*04fd306cSNickeau return self::NAME; 148*04fd306cSNickeau } 149*04fd306cSNickeau 150*04fd306cSNickeau /** 151*04fd306cSNickeau * We take over the {@link tpl_content_core()} of Dokuwiki 152*04fd306cSNickeau * because the instance of the router is not reinit. 153*04fd306cSNickeau * We get then problem on test because of the private global static {@link ActionRouter::$instance) variable 154*04fd306cSNickeau * @return bool 155*04fd306cSNickeau * @noinspection PhpUnused - is a callback to the event TPL_ACT_RENDER called in this class 156*04fd306cSNickeau */ 157*04fd306cSNickeau static public function tpl_content_core(): bool 158*04fd306cSNickeau { 159*04fd306cSNickeau 160*04fd306cSNickeau /** 161*04fd306cSNickeau * Was false, is true 162*04fd306cSNickeau */ 163*04fd306cSNickeau $router = ActionRouter::getInstance(true); 164*04fd306cSNickeau try { 165*04fd306cSNickeau $router->getAction()->tplContent(); 166*04fd306cSNickeau } catch (FatalException $e) { 167*04fd306cSNickeau // there was no content for the action 168*04fd306cSNickeau msg(hsc($e->getMessage()), -1); 169*04fd306cSNickeau return false; 170*04fd306cSNickeau } 171*04fd306cSNickeau return true; 172*04fd306cSNickeau } 173*04fd306cSNickeau 174*04fd306cSNickeau /** 175*04fd306cSNickeau * @throws ExceptionNotFound 176*04fd306cSNickeau */ 177*04fd306cSNickeau private function getRequestedLayout(): string 178*04fd306cSNickeau { 179*04fd306cSNickeau if (!isset($this->requestedLayout)) { 180*04fd306cSNickeau throw new ExceptionNotFound("No requested layout"); 181*04fd306cSNickeau } 182*04fd306cSNickeau return $this->requestedLayout; 183*04fd306cSNickeau } 184*04fd306cSNickeau 185*04fd306cSNickeau 186*04fd306cSNickeau /** 187*04fd306cSNickeau * 188*04fd306cSNickeau */ 189*04fd306cSNickeau public function close(): FetcherAppPages 190*04fd306cSNickeau { 191*04fd306cSNickeau // nothing to do 192*04fd306cSNickeau return $this; 193*04fd306cSNickeau } 194*04fd306cSNickeau 195*04fd306cSNickeau 196*04fd306cSNickeau private function getRequestedTemplateOrDefault(): string 197*04fd306cSNickeau { 198*04fd306cSNickeau try { 199*04fd306cSNickeau return $this->getRequestedLayout(); 200*04fd306cSNickeau } catch (ExceptionNotFound $e) { 201*04fd306cSNickeau global $ACT; 202*04fd306cSNickeau switch ($ACT) { 203*04fd306cSNickeau case ExecutionContext::EDIT_ACTION: 204*04fd306cSNickeau case ExecutionContext::PREVIEW_ACTION: 205*04fd306cSNickeau return PageTemplateName::APP_EDIT; 206*04fd306cSNickeau case ExecutionContext::LOGIN_ACTION: 207*04fd306cSNickeau return PageTemplateName::APP_LOGIN; 208*04fd306cSNickeau case ExecutionContext::REGISTER_ACTION: 209*04fd306cSNickeau return PageTemplateName::APP_REGISTER; 210*04fd306cSNickeau case ExecutionContext::RESEND_PWD_ACTION: 211*04fd306cSNickeau return PageTemplateName::APP_RESEND_PWD; 212*04fd306cSNickeau case ExecutionContext::REVISIONS_ACTION: 213*04fd306cSNickeau return PageTemplateName::APP_REVISIONS; 214*04fd306cSNickeau case ExecutionContext::DIFF_ACTION: 215*04fd306cSNickeau return PageTemplateName::APP_DIFF; 216*04fd306cSNickeau case ExecutionContext::INDEX_ACTION: 217*04fd306cSNickeau return PageTemplateName::APP_INDEX; 218*04fd306cSNickeau case ExecutionContext::PROFILE_ACTION: 219*04fd306cSNickeau return PageTemplateName::APP_PROFILE; 220*04fd306cSNickeau default: 221*04fd306cSNickeau case ExecutionContext::SEARCH_ACTION: 222*04fd306cSNickeau return PageTemplateName::APP_SEARCH; 223*04fd306cSNickeau } 224*04fd306cSNickeau 225*04fd306cSNickeau } 226*04fd306cSNickeau } 227*04fd306cSNickeau 228*04fd306cSNickeau 229*04fd306cSNickeau public function getLabel(): string 230*04fd306cSNickeau { 231*04fd306cSNickeau global $ACT; 232*04fd306cSNickeau $label = "App Pages"; 233*04fd306cSNickeau switch ($ACT) { 234*04fd306cSNickeau case ExecutionContext::RESEND_PWD_ACTION: 235*04fd306cSNickeau $label = "Resend Password"; 236*04fd306cSNickeau break; 237*04fd306cSNickeau case ExecutionContext::LOGIN_ACTION: 238*04fd306cSNickeau $label = "Login"; 239*04fd306cSNickeau break; 240*04fd306cSNickeau case ExecutionContext::REGISTER_ACTION: 241*04fd306cSNickeau $label = "Register"; 242*04fd306cSNickeau break; 243*04fd306cSNickeau case ExecutionContext::EDIT_ACTION: 244*04fd306cSNickeau case ExecutionContext::PREVIEW_ACTION: 245*04fd306cSNickeau $label = "Editor"; 246*04fd306cSNickeau break; 247*04fd306cSNickeau case ExecutionContext::DIFF_ACTION: 248*04fd306cSNickeau $label = "Diff"; 249*04fd306cSNickeau break; 250*04fd306cSNickeau case ExecutionContext::REVISIONS_ACTION: 251*04fd306cSNickeau $label = "Log"; 252*04fd306cSNickeau break; 253*04fd306cSNickeau } 254*04fd306cSNickeau return $label; 255*04fd306cSNickeau } 256*04fd306cSNickeau 257*04fd306cSNickeau 258*04fd306cSNickeau /** 259*04fd306cSNickeau * @throws ExceptionBadArgument 260*04fd306cSNickeau * @throws ExceptionBadSyntax 261*04fd306cSNickeau * @throws ExceptionNotExists 262*04fd306cSNickeau * @throws ExceptionNotFound 263*04fd306cSNickeau */ 264*04fd306cSNickeau public function buildFromTagAttributes(TagAttributes $tagAttributes): IFetcher 265*04fd306cSNickeau { 266*04fd306cSNickeau parent::buildFromTagAttributes($tagAttributes); 267*04fd306cSNickeau $this->buildOriginalPathFromTagAttributes($tagAttributes); 268*04fd306cSNickeau return $this; 269*04fd306cSNickeau } 270*04fd306cSNickeau} 271