xref: /plugin/combo/ComboStrap/MetaManagerForm.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau
7*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
8*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem;
9*04fd306cSNickeauuse ComboStrap\Meta\Field\Aliases;
10*04fd306cSNickeauuse ComboStrap\Meta\Field\AncestorImage;
11*04fd306cSNickeauuse ComboStrap\Meta\Field\FacebookImage;
12*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedImage;
13*04fd306cSNickeauuse ComboStrap\Meta\Field\SocialCardImage;
14*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedRasterImage;
15*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedSvgImage;
16*04fd306cSNickeauuse ComboStrap\Meta\Field\PageH1;
17*04fd306cSNickeauuse ComboStrap\Meta\Field\PageImages;
18*04fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName;
19*04fd306cSNickeauuse ComboStrap\Meta\Field\Region;
20*04fd306cSNickeauuse ComboStrap\Meta\Field\TwitterImage;
21*04fd306cSNickeauuse ComboStrap\Meta\Form\FormMeta;
22*04fd306cSNickeauuse ComboStrap\Meta\Form\FormMetaTab;
23*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
24c3437056SNickeau
25c3437056SNickeauclass MetaManagerForm
26c3437056SNickeau{
27c3437056SNickeau
28c3437056SNickeau    public const TAB_PAGE_VALUE = "page";
29c3437056SNickeau    public const TAB_TYPE_VALUE = "type";
30c3437056SNickeau    public const TAB_CACHE_VALUE = "cache";
31c3437056SNickeau    public const TAB_REDIRECTION_VALUE = "redirection";
32c3437056SNickeau    public const TAB_LANGUAGE_VALUE = "language";
33c3437056SNickeau    public const TAB_INTEGRATION_VALUE = "integration";
34c3437056SNickeau    public const TAB_QUALITY_VALUE = "quality";
35c3437056SNickeau    public const TAB_IMAGE_VALUE = "image";
36*04fd306cSNickeau    private MarkupPath $page;
37c3437056SNickeau
38*04fd306cSNickeau
39*04fd306cSNickeau    private const META_ORDERS = [ResourceName::PROPERTY_NAME,
40c3437056SNickeau        PageTitle::PROPERTY_NAME,
41*04fd306cSNickeau        Lead::PROPERTY_NAME,
42c3437056SNickeau        PageH1::PROPERTY_NAME,
43*04fd306cSNickeau        Label::PROPERTY_NAME,
44c3437056SNickeau        PageDescription::PROPERTY_NAME,
45c3437056SNickeau        PageKeywords::PROPERTY_NAME,
46c3437056SNickeau        PagePath::PROPERTY_NAME,
47c3437056SNickeau        Canonical::PROPERTY_NAME,
48c3437056SNickeau        Slug::PROPERTY_NAME,
49c3437056SNickeau        PageUrlPath::PROPERTY_NAME,
50*04fd306cSNickeau        PageTemplateName::PROPERTY_NAME,
51c3437056SNickeau        ModificationDate::PROPERTY_NAME,
52*04fd306cSNickeau        CreationDate::PROPERTY_NAME,
53*04fd306cSNickeau        FeaturedImage::PROPERTY_NAME,
54*04fd306cSNickeau        FeaturedRasterImage::PROPERTY_NAME,
55*04fd306cSNickeau        FeaturedSvgImage::PROPERTY_NAME,
56*04fd306cSNickeau        FeaturedIcon::PROPERTY_NAME,
57*04fd306cSNickeau        TwitterImage::PROPERTY_NAME,
58*04fd306cSNickeau        FacebookImage::PROPERTY_NAME,
59*04fd306cSNickeau        AncestorImage::PROPERTY_NAME,
60*04fd306cSNickeau        FirstImage::PROPERTY_NAME,
61c3437056SNickeau        Aliases::PROPERTY_NAME,
62c3437056SNickeau        PageType::PROPERTY_NAME,
63c3437056SNickeau        PagePublicationDate::PROPERTY_NAME,
64c3437056SNickeau        StartDate::PROPERTY_NAME,
65c3437056SNickeau        EndDate::PROPERTY_NAME,
66c3437056SNickeau        LdJson::PROPERTY_NAME,
67c3437056SNickeau        LowQualityPageOverwrite::PROPERTY_NAME,
68c3437056SNickeau        QualityDynamicMonitoringOverwrite::PROPERTY_NAME,
69c3437056SNickeau        Locale::PROPERTY_NAME,
70c3437056SNickeau        Lang::PROPERTY_NAME,
71c3437056SNickeau        Region::PROPERTY_NAME,
72c3437056SNickeau        ReplicationDate::PROPERTY_NAME,
73c3437056SNickeau        PageId::PROPERTY_NAME,
74c3437056SNickeau        CacheExpirationFrequency::PROPERTY_NAME,
75*04fd306cSNickeau        CacheExpirationDate::PROPERTY_NAME,
76*04fd306cSNickeau        PageLevel::PROPERTY_NAME
77c3437056SNickeau    ];
78c3437056SNickeau
79c3437056SNickeau    /**
80c3437056SNickeau     * @var MetadataFormDataStore
81c3437056SNickeau     */
82c3437056SNickeau    private $targetFormDataStore;
83c3437056SNickeau
84c3437056SNickeau    /**
85c3437056SNickeau     * MetaManager constructor.
86c3437056SNickeau     */
87c3437056SNickeau    public function __construct($page)
88c3437056SNickeau    {
89c3437056SNickeau        $this->page = $page;
90c3437056SNickeau        $this->targetFormDataStore = MetadataFormDataStore::getOrCreateFromResource($page);
91c3437056SNickeau    }
92c3437056SNickeau
93*04fd306cSNickeau    public static function createForPage(MarkupPath $page): MetaManagerForm
94c3437056SNickeau    {
95c3437056SNickeau        return new MetaManagerForm($page);
96c3437056SNickeau    }
97c3437056SNickeau
98c3437056SNickeau    /**
99c3437056SNickeau     * @return FormMeta
100c3437056SNickeau     */
101c3437056SNickeau    function toFormMeta(): FormMeta
102c3437056SNickeau    {
103c3437056SNickeau
104c3437056SNickeau        /**
105c3437056SNickeau         * Case when the page was changed externally
106c3437056SNickeau         * with a new frontmatter
107c3437056SNickeau         * The frontmatter data should be first replicated into the metadata file
108c3437056SNickeau         */
109*04fd306cSNickeau        $fetcherMarkup = $this->page->getInstructionsDocument();
110*04fd306cSNickeau        $fetcherMarkup->getInstructions();
111*04fd306cSNickeau
112c3437056SNickeau
113c3437056SNickeau        /**
114c3437056SNickeau         * Creation
115c3437056SNickeau         */
116*04fd306cSNickeau        $name = $this->page->getPathObject()->toAbsoluteId();
117*04fd306cSNickeau        $formMeta = FormMeta::create($name)
118c3437056SNickeau            ->setType(FormMeta::FORM_NAV_TABS_TYPE);
119c3437056SNickeau
120c3437056SNickeau
121c3437056SNickeau        /**
122c3437056SNickeau         * The manager
123c3437056SNickeau         */
124c3437056SNickeau        $dokuwikiFsStore = MetadataDokuWikiStore::getOrCreateFromResource($this->page);
125*04fd306cSNickeau        $metadataNameInOrder = self::META_ORDERS;
126c3437056SNickeau
127*04fd306cSNickeau
128*04fd306cSNickeau        foreach ($metadataNameInOrder as $metadataName) {
129*04fd306cSNickeau            try {
130*04fd306cSNickeau                $metadataObject = MetadataSystem::getForName($metadataName);
131*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
132*04fd306cSNickeau                LogUtility::internalError("The metadata ($metadataName) was not found");
133c3437056SNickeau                continue;
134c3437056SNickeau            }
135*04fd306cSNickeau            if(!$metadataObject::isOnForm()){
136*04fd306cSNickeau                LogUtility::internalError("This metadata should not be on the order list as it's not for the form");
137*04fd306cSNickeau                continue;
138*04fd306cSNickeau            }
139*04fd306cSNickeau            $metadataObject
140c3437056SNickeau                ->setResource($this->page)
141c3437056SNickeau                ->setReadStore($dokuwikiFsStore)
142c3437056SNickeau                ->buildFromReadStore()
143c3437056SNickeau                ->setWriteStore($this->targetFormDataStore);
144*04fd306cSNickeau            $formMeta->addFormFieldFromMetadata($metadataObject);
145*04fd306cSNickeau        }
146*04fd306cSNickeau
147*04fd306cSNickeau        /**
148*04fd306cSNickeau         * Metadata that are not in the order list
149*04fd306cSNickeau         */
150*04fd306cSNickeau        foreach (MetadataSystem::getMetadataClasses() as $metadata) {
151*04fd306cSNickeau            if (!$metadata::isOnForm()) {
152*04fd306cSNickeau                continue;
153*04fd306cSNickeau            }
154*04fd306cSNickeau            if (!in_array($metadata::getName(), $metadataNameInOrder)) {
155*04fd306cSNickeau                $metadataObject = (new $metadata())
156*04fd306cSNickeau                    ->setResource($this->page)
157*04fd306cSNickeau                    ->setReadStore($dokuwikiFsStore)
158*04fd306cSNickeau                    ->buildFromReadStore()
159*04fd306cSNickeau                    ->setWriteStore($this->targetFormDataStore);
160*04fd306cSNickeau                $formMeta->addFormFieldFromMetadata($metadataObject);
161*04fd306cSNickeau            }
162c3437056SNickeau        }
163c3437056SNickeau
164c3437056SNickeau
165c3437056SNickeau        /**
166c3437056SNickeau         * Tabs (for whatever reason, javascript keep the order of the properties
167c3437056SNickeau         * and therefore the order of the tabs)
168c3437056SNickeau         */
169c3437056SNickeau        $formMeta
170c3437056SNickeau            ->addTab(
171c3437056SNickeau                FormMetaTab::create(self::TAB_PAGE_VALUE)
172c3437056SNickeau                    ->setLabel("Page")
173c3437056SNickeau                    ->setWidthLabel(3)
174c3437056SNickeau                    ->setWidthField(9)
175c3437056SNickeau            )
176c3437056SNickeau            ->addTab(
177c3437056SNickeau                FormMetaTab::create(self::TAB_TYPE_VALUE)
178c3437056SNickeau                    ->setLabel("Page Type")
179c3437056SNickeau                    ->setWidthLabel(3)
180c3437056SNickeau                    ->setWidthField(9)
181c3437056SNickeau            )
182c3437056SNickeau            ->addTab(
183c3437056SNickeau                FormMetaTab::create(self::TAB_REDIRECTION_VALUE)
184c3437056SNickeau                    ->setLabel("Redirection")
185c3437056SNickeau                    ->setWidthLabel(3)
186c3437056SNickeau                    ->setWidthField(9)
187c3437056SNickeau            )
188c3437056SNickeau            ->addTab(
189c3437056SNickeau                FormMetaTab::create(self::TAB_IMAGE_VALUE)
190*04fd306cSNickeau                    ->setLabel("Images")
191*04fd306cSNickeau                    ->setWidthLabel(3)
192*04fd306cSNickeau                    ->setWidthField(9)
193c3437056SNickeau            )
194c3437056SNickeau            ->addTab(
195c3437056SNickeau                FormMetaTab::create(self::TAB_QUALITY_VALUE)
196c3437056SNickeau                    ->setLabel("Quality")
197c3437056SNickeau                    ->setWidthLabel(6)
198c3437056SNickeau                    ->setWidthField(6)
199c3437056SNickeau            )->addTab(
200c3437056SNickeau                FormMetaTab::create(self::TAB_LANGUAGE_VALUE)
201c3437056SNickeau                    ->setLabel("Language")
202c3437056SNickeau                    ->setWidthLabel(2)
203c3437056SNickeau                    ->setWidthField(10)
204c3437056SNickeau            )->addTab(
205c3437056SNickeau                FormMetaTab::create(self::TAB_INTEGRATION_VALUE)
206c3437056SNickeau                    ->setLabel("Integration")
207c3437056SNickeau                    ->setWidthLabel(4)
208c3437056SNickeau                    ->setWidthField(8)
209c3437056SNickeau            )->addTab(
210c3437056SNickeau                FormMetaTab::create(self::TAB_CACHE_VALUE)
211c3437056SNickeau                    ->setLabel("Cache")
212c3437056SNickeau                    ->setWidthLabel(6)
213c3437056SNickeau                    ->setWidthField(6)
214c3437056SNickeau            );
215c3437056SNickeau
216c3437056SNickeau
217c3437056SNickeau        return $formMeta;
218c3437056SNickeau
219c3437056SNickeau    }
220c3437056SNickeau
221c3437056SNickeau
222c3437056SNickeau    public function toFormData(): array
223c3437056SNickeau    {
224c3437056SNickeau        return $this->toFormMeta()->toFormData();
225c3437056SNickeau    }
226c3437056SNickeau
227c3437056SNickeau
228c3437056SNickeau}
229