xref: /plugin/combo/ComboStrap/MetaManagerForm.php (revision 856130dcfcce576f256e6b3445cac3779912ce64)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau
704fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem;
804fd306cSNickeauuse ComboStrap\Meta\Field\Aliases;
904fd306cSNickeauuse ComboStrap\Meta\Field\AncestorImage;
1004fd306cSNickeauuse ComboStrap\Meta\Field\FacebookImage;
1104fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedImage;
1204fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedRasterImage;
1304fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedSvgImage;
1404fd306cSNickeauuse ComboStrap\Meta\Field\PageH1;
1504fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName;
1604fd306cSNickeauuse ComboStrap\Meta\Field\Region;
1704fd306cSNickeauuse ComboStrap\Meta\Field\TwitterImage;
1804fd306cSNickeauuse ComboStrap\Meta\Form\FormMeta;
1904fd306cSNickeauuse ComboStrap\Meta\Form\FormMetaTab;
20*856130dcSgerardnicouse ComboStrap\Meta\Store\MetadataDbStore;
2104fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
22c3437056SNickeau
23c3437056SNickeauclass MetaManagerForm
24c3437056SNickeau{
25c3437056SNickeau
26c3437056SNickeau    public const TAB_PAGE_VALUE = "page";
27c3437056SNickeau    public const TAB_TYPE_VALUE = "type";
28c3437056SNickeau    public const TAB_CACHE_VALUE = "cache";
29c3437056SNickeau    public const TAB_REDIRECTION_VALUE = "redirection";
30c3437056SNickeau    public const TAB_LANGUAGE_VALUE = "language";
31c3437056SNickeau    public const TAB_INTEGRATION_VALUE = "integration";
32c3437056SNickeau    public const TAB_QUALITY_VALUE = "quality";
33c3437056SNickeau    public const TAB_IMAGE_VALUE = "image";
3404fd306cSNickeau    private MarkupPath $page;
35c3437056SNickeau
3604fd306cSNickeau
3704fd306cSNickeau    private const META_ORDERS = [ResourceName::PROPERTY_NAME,
38c3437056SNickeau        PageTitle::PROPERTY_NAME,
3904fd306cSNickeau        Lead::PROPERTY_NAME,
40c3437056SNickeau        PageH1::PROPERTY_NAME,
4104fd306cSNickeau        Label::PROPERTY_NAME,
42c3437056SNickeau        PageDescription::PROPERTY_NAME,
43c3437056SNickeau        PageKeywords::PROPERTY_NAME,
44c3437056SNickeau        PagePath::PROPERTY_NAME,
45c3437056SNickeau        Canonical::PROPERTY_NAME,
46c3437056SNickeau        Slug::PROPERTY_NAME,
47c3437056SNickeau        PageUrlPath::PROPERTY_NAME,
4804fd306cSNickeau        PageTemplateName::PROPERTY_NAME,
49c3437056SNickeau        ModificationDate::PROPERTY_NAME,
5004fd306cSNickeau        CreationDate::PROPERTY_NAME,
5104fd306cSNickeau        FeaturedImage::PROPERTY_NAME,
5204fd306cSNickeau        FeaturedRasterImage::PROPERTY_NAME,
5304fd306cSNickeau        FeaturedSvgImage::PROPERTY_NAME,
5404fd306cSNickeau        FeaturedIcon::PROPERTY_NAME,
5504fd306cSNickeau        TwitterImage::PROPERTY_NAME,
5604fd306cSNickeau        FacebookImage::PROPERTY_NAME,
5704fd306cSNickeau        AncestorImage::PROPERTY_NAME,
5804fd306cSNickeau        FirstImage::PROPERTY_NAME,
59c3437056SNickeau        Aliases::PROPERTY_NAME,
60c3437056SNickeau        PageType::PROPERTY_NAME,
61c3437056SNickeau        PagePublicationDate::PROPERTY_NAME,
62c3437056SNickeau        StartDate::PROPERTY_NAME,
63c3437056SNickeau        EndDate::PROPERTY_NAME,
64c3437056SNickeau        LdJson::PROPERTY_NAME,
65c3437056SNickeau        LowQualityPageOverwrite::PROPERTY_NAME,
66c3437056SNickeau        QualityDynamicMonitoringOverwrite::PROPERTY_NAME,
67c3437056SNickeau        Locale::PROPERTY_NAME,
68c3437056SNickeau        Lang::PROPERTY_NAME,
69c3437056SNickeau        Region::PROPERTY_NAME,
70c3437056SNickeau        ReplicationDate::PROPERTY_NAME,
71c3437056SNickeau        PageId::PROPERTY_NAME,
72c3437056SNickeau        CacheExpirationFrequency::PROPERTY_NAME,
7304fd306cSNickeau        CacheExpirationDate::PROPERTY_NAME,
7404fd306cSNickeau        PageLevel::PROPERTY_NAME
75c3437056SNickeau    ];
76c3437056SNickeau
77c3437056SNickeau    /**
78c3437056SNickeau     * @var MetadataFormDataStore
79c3437056SNickeau     */
80c3437056SNickeau    private $targetFormDataStore;
81c3437056SNickeau
82c3437056SNickeau    /**
83c3437056SNickeau     * MetaManager constructor.
84c3437056SNickeau     */
85c3437056SNickeau    public function __construct($page)
86c3437056SNickeau    {
87c3437056SNickeau        $this->page = $page;
88c3437056SNickeau        $this->targetFormDataStore = MetadataFormDataStore::getOrCreateFromResource($page);
89c3437056SNickeau    }
90c3437056SNickeau
9104fd306cSNickeau    public static function createForPage(MarkupPath $page): MetaManagerForm
92c3437056SNickeau    {
93c3437056SNickeau        return new MetaManagerForm($page);
94c3437056SNickeau    }
95c3437056SNickeau
96c3437056SNickeau    /**
97c3437056SNickeau     * @return FormMeta
98c3437056SNickeau     */
99c3437056SNickeau    function toFormMeta(): FormMeta
100c3437056SNickeau    {
101c3437056SNickeau
102c3437056SNickeau        /**
103c3437056SNickeau         * Case when the page was changed externally
104c3437056SNickeau         * with a new frontmatter
105c3437056SNickeau         * The frontmatter data should be first replicated into the metadata file
106c3437056SNickeau         */
10704fd306cSNickeau        $fetcherMarkup = $this->page->getInstructionsDocument();
10804fd306cSNickeau        $fetcherMarkup->getInstructions();
10904fd306cSNickeau
110c3437056SNickeau
111c3437056SNickeau        /**
112c3437056SNickeau         * Creation
113c3437056SNickeau         */
11404fd306cSNickeau        $name = $this->page->getPathObject()->toAbsoluteId();
11504fd306cSNickeau        $formMeta = FormMeta::create($name)
116c3437056SNickeau            ->setType(FormMeta::FORM_NAV_TABS_TYPE);
117c3437056SNickeau
118c3437056SNickeau
119c3437056SNickeau        /**
120c3437056SNickeau         * The manager
121c3437056SNickeau         */
122c3437056SNickeau        $dokuwikiFsStore = MetadataDokuWikiStore::getOrCreateFromResource($this->page);
123*856130dcSgerardnico        try {
124*856130dcSgerardnico            $dbStore = MetadataDbStore::getOrCreateFromResource($this->page);
125*856130dcSgerardnico        } catch (ExceptionNotExists|ExceptionSqliteNotAvailable $e) {
126*856130dcSgerardnico            LogUtility::error("Error with the db store" . $e->getMessage(), "metamanageform", $e);
127*856130dcSgerardnico            $dbStore = $dokuwikiFsStore;
128*856130dcSgerardnico        }
12904fd306cSNickeau        $metadataNameInOrder = self::META_ORDERS;
130c3437056SNickeau
13104fd306cSNickeau
13204fd306cSNickeau        foreach ($metadataNameInOrder as $metadataName) {
13304fd306cSNickeau            try {
13404fd306cSNickeau                $metadataObject = MetadataSystem::getForName($metadataName);
13504fd306cSNickeau            } catch (ExceptionNotFound $e) {
13604fd306cSNickeau                LogUtility::internalError("The metadata ($metadataName) was not found");
137c3437056SNickeau                continue;
138c3437056SNickeau            }
13904fd306cSNickeau            if (!$metadataObject::isOnForm()) {
14004fd306cSNickeau                LogUtility::internalError("This metadata should not be on the order list as it's not for the form");
14104fd306cSNickeau                continue;
14204fd306cSNickeau            }
143*856130dcSgerardnico            $store = $dokuwikiFsStore;
144*856130dcSgerardnico            if ($metadataName == ReplicationDate::PROPERTY_NAME) {
145*856130dcSgerardnico                /**
146*856130dcSgerardnico                 * Date is only written in the database
147*856130dcSgerardnico                 * to not trigger a new rendering
148*856130dcSgerardnico                 * (every metadata updates trigger a new rendering)
149*856130dcSgerardnico                 */
150*856130dcSgerardnico                $store = $dbStore;
151*856130dcSgerardnico            }
15204fd306cSNickeau            $metadataObject
153c3437056SNickeau                ->setResource($this->page)
154*856130dcSgerardnico                ->setReadStore($store)
155c3437056SNickeau                ->buildFromReadStore()
156c3437056SNickeau                ->setWriteStore($this->targetFormDataStore);
15704fd306cSNickeau            $formMeta->addFormFieldFromMetadata($metadataObject);
15804fd306cSNickeau        }
15904fd306cSNickeau
16004fd306cSNickeau        /**
16104fd306cSNickeau         * Metadata that are not in the order list
16204fd306cSNickeau         */
16304fd306cSNickeau        foreach (MetadataSystem::getMetadataClasses() as $metadata) {
16404fd306cSNickeau            if (!$metadata::isOnForm()) {
16504fd306cSNickeau                continue;
16604fd306cSNickeau            }
16704fd306cSNickeau            if (!in_array($metadata::getName(), $metadataNameInOrder)) {
16804fd306cSNickeau                $metadataObject = (new $metadata())
16904fd306cSNickeau                    ->setResource($this->page)
17004fd306cSNickeau                    ->setReadStore($dokuwikiFsStore)
17104fd306cSNickeau                    ->buildFromReadStore()
17204fd306cSNickeau                    ->setWriteStore($this->targetFormDataStore);
17304fd306cSNickeau                $formMeta->addFormFieldFromMetadata($metadataObject);
17404fd306cSNickeau            }
175c3437056SNickeau        }
176c3437056SNickeau
177c3437056SNickeau
178c3437056SNickeau        /**
179c3437056SNickeau         * Tabs (for whatever reason, javascript keep the order of the properties
180c3437056SNickeau         * and therefore the order of the tabs)
181c3437056SNickeau         */
182c3437056SNickeau        $formMeta
183c3437056SNickeau            ->addTab(
184c3437056SNickeau                FormMetaTab::create(self::TAB_PAGE_VALUE)
185c3437056SNickeau                    ->setLabel("Page")
186c3437056SNickeau                    ->setWidthLabel(3)
187c3437056SNickeau                    ->setWidthField(9)
188c3437056SNickeau            )
189c3437056SNickeau            ->addTab(
190c3437056SNickeau                FormMetaTab::create(self::TAB_TYPE_VALUE)
191c3437056SNickeau                    ->setLabel("Page Type")
192c3437056SNickeau                    ->setWidthLabel(3)
193c3437056SNickeau                    ->setWidthField(9)
194c3437056SNickeau            )
195c3437056SNickeau            ->addTab(
196c3437056SNickeau                FormMetaTab::create(self::TAB_REDIRECTION_VALUE)
197c3437056SNickeau                    ->setLabel("Redirection")
198c3437056SNickeau                    ->setWidthLabel(3)
199c3437056SNickeau                    ->setWidthField(9)
200c3437056SNickeau            )
201c3437056SNickeau            ->addTab(
202c3437056SNickeau                FormMetaTab::create(self::TAB_IMAGE_VALUE)
20304fd306cSNickeau                    ->setLabel("Images")
20404fd306cSNickeau                    ->setWidthLabel(3)
20504fd306cSNickeau                    ->setWidthField(9)
206c3437056SNickeau            )
207c3437056SNickeau            ->addTab(
208c3437056SNickeau                FormMetaTab::create(self::TAB_QUALITY_VALUE)
209c3437056SNickeau                    ->setLabel("Quality")
210c3437056SNickeau                    ->setWidthLabel(6)
211c3437056SNickeau                    ->setWidthField(6)
212c3437056SNickeau            )->addTab(
213c3437056SNickeau                FormMetaTab::create(self::TAB_LANGUAGE_VALUE)
214c3437056SNickeau                    ->setLabel("Language")
215c3437056SNickeau                    ->setWidthLabel(2)
216c3437056SNickeau                    ->setWidthField(10)
217c3437056SNickeau            )->addTab(
218c3437056SNickeau                FormMetaTab::create(self::TAB_INTEGRATION_VALUE)
219c3437056SNickeau                    ->setLabel("Integration")
220c3437056SNickeau                    ->setWidthLabel(4)
221c3437056SNickeau                    ->setWidthField(8)
222c3437056SNickeau            )->addTab(
223c3437056SNickeau                FormMetaTab::create(self::TAB_CACHE_VALUE)
224c3437056SNickeau                    ->setLabel("Cache")
225c3437056SNickeau                    ->setWidthLabel(6)
226c3437056SNickeau                    ->setWidthField(6)
227c3437056SNickeau            );
228c3437056SNickeau
229c3437056SNickeau
230c3437056SNickeau        return $formMeta;
231c3437056SNickeau
232c3437056SNickeau    }
233c3437056SNickeau
234c3437056SNickeau
235c3437056SNickeau    public function toFormData(): array
236c3437056SNickeau    {
237c3437056SNickeau        return $this->toFormMeta()->toFormData();
238c3437056SNickeau    }
239c3437056SNickeau
240c3437056SNickeau
241c3437056SNickeau}
242