xref: /template/strap/ComboStrap/FetcherAppPages.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
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