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