xref: /plugin/combo/ComboStrap/PageTitle.php (revision 657b6da49858ff4f3676e3f57c04fe7930f9e190)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau
704fd306cSNickeauuse ComboStrap\Meta\Api\MetadataText;
804fd306cSNickeauuse ComboStrap\Meta\Field\PageH1;
904fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
1004fd306cSNickeau
11c3437056SNickeauclass PageTitle extends MetadataText
12c3437056SNickeau{
13c3437056SNickeau
14c3437056SNickeau    public const PROPERTY_NAME = 'title';
15c3437056SNickeau    public const TITLE = 'title';
16c3437056SNickeau
1704fd306cSNickeau    public static function createForMarkup($page): PageTitle
18c3437056SNickeau    {
19c3437056SNickeau        return (new PageTitle())
20c3437056SNickeau            ->setResource($page);
21c3437056SNickeau    }
22c3437056SNickeau
2304fd306cSNickeau    public static function getTab(): string
24c3437056SNickeau    {
25c3437056SNickeau        return MetaManagerForm::TAB_PAGE_VALUE;
26c3437056SNickeau    }
27c3437056SNickeau
2804fd306cSNickeau    public static function getDescription(): string
29c3437056SNickeau    {
30c3437056SNickeau        return "The page title is a description advertised to external application such as search engine and browser.";
31c3437056SNickeau    }
32c3437056SNickeau
3304fd306cSNickeau    public static function getLabel(): string
34c3437056SNickeau    {
35c3437056SNickeau        return "Title";
36c3437056SNickeau    }
37c3437056SNickeau
38c3437056SNickeau    static public function getName(): string
39c3437056SNickeau    {
40c3437056SNickeau        return self::PROPERTY_NAME;
41c3437056SNickeau    }
42c3437056SNickeau
4304fd306cSNickeau    public static function getPersistenceType(): string
44c3437056SNickeau    {
4504fd306cSNickeau        return MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY;
46c3437056SNickeau    }
47c3437056SNickeau
4804fd306cSNickeau    public static function isMutable(): bool
49c3437056SNickeau    {
50c3437056SNickeau        return true;
51c3437056SNickeau    }
52c3437056SNickeau
53c3437056SNickeau    /**
54c3437056SNickeau     * `title` is created by DokuWiki
55c3437056SNickeau     * in current but not persistent
56c3437056SNickeau     * and hold the heading 1, see {@link p_get_first_heading}
57c3437056SNickeau     */
5804fd306cSNickeau    public function getDefaultValue(): string
59c3437056SNickeau    {
60c3437056SNickeau
61c3437056SNickeau        $resource = $this->getResource();
6204fd306cSNickeau        if (!($resource instanceof MarkupPath)) {
6304fd306cSNickeau            LogUtility::internalError("Resource that are not page have no title");
6404fd306cSNickeau            return ResourceName::getFromPath($resource->getPathObject());
6504fd306cSNickeau        }
66c3437056SNickeau        if ($resource->isRootHomePage() && !empty(Site::getTagLine())) {
67c3437056SNickeau            return Site::getTagLine();
68c3437056SNickeau        }
6904fd306cSNickeau        return PageH1::createForPage($this->getResource())
7004fd306cSNickeau            ->getValueOrDefault();
71c3437056SNickeau
72c3437056SNickeau    }
73c3437056SNickeau
7423743a95Sgerardnico    public function buildFromReadStore()
7523743a95Sgerardnico    {
7623743a95Sgerardnico        $metadataStore = $this->getReadStore();
7723743a95Sgerardnico        /**
7823743a95Sgerardnico         * We got a conflict Dokuwiki stores a `title` meta in the current
7923743a95Sgerardnico         * See first line of {@link \Doku_Renderer_metadata::header()}
8023743a95Sgerardnico         */
8123743a95Sgerardnico        $isWikiDisabled = ExecutionContext::getActualOrCreateFromEnv()
8223743a95Sgerardnico            ->getConfig()
8323743a95Sgerardnico            ->isHeadingWikiComponentDisabled();
8423743a95Sgerardnico        if ($isWikiDisabled && $metadataStore instanceof MetadataDokuWikiStore) {
8523743a95Sgerardnico            $this->wasBuild = true;
8623743a95Sgerardnico            $dataCurrentAndPersistent = $metadataStore->getDataCurrentAndPersistent();
87*657b6da4Sgerardnico            $value = $dataCurrentAndPersistent[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY][$this->getName()] ?? null;
8823743a95Sgerardnico            $this->setFromStoreValueWithoutException($value);
8923743a95Sgerardnico            return $this;
9023743a95Sgerardnico        }
9123743a95Sgerardnico        return parent::buildFromReadStore();
9223743a95Sgerardnico    }
9323743a95Sgerardnico
9423743a95Sgerardnico
9523743a95Sgerardnico
9604fd306cSNickeau    /**
9704fd306cSNickeau     * @return string
9804fd306cSNickeau     */
9904fd306cSNickeau    public function getValueOrDefault(): string
10004fd306cSNickeau    {
10104fd306cSNickeau        try {
10204fd306cSNickeau            return $this->getValue();
10304fd306cSNickeau        } catch (ExceptionNotFound $e) {
10404fd306cSNickeau            return $this->getDefaultValue();
10504fd306cSNickeau        }
10604fd306cSNickeau    }
10704fd306cSNickeau
10804fd306cSNickeau
10904fd306cSNickeau    public static function getCanonical(): string
110c3437056SNickeau    {
111c3437056SNickeau        return self::TITLE;
112c3437056SNickeau    }
113c3437056SNickeau
114c3437056SNickeau
11504fd306cSNickeau    public static function isOnForm(): bool
11604fd306cSNickeau    {
11704fd306cSNickeau        return true;
11804fd306cSNickeau    }
11904fd306cSNickeau
120c3437056SNickeau}
121