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