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