1*c3437056SNickeau<?php 2*c3437056SNickeau 3*c3437056SNickeau 4*c3437056SNickeaunamespace ComboStrap; 5*c3437056SNickeau 6*c3437056SNickeau 7*c3437056SNickeauclass MetadataStoreTransfer 8*c3437056SNickeau{ 9*c3437056SNickeau 10*c3437056SNickeau /** 11*c3437056SNickeau * @var MetadataStore 12*c3437056SNickeau */ 13*c3437056SNickeau private $sourceStore; 14*c3437056SNickeau /** 15*c3437056SNickeau * @var MetadataStore 16*c3437056SNickeau */ 17*c3437056SNickeau private $targetStore; 18*c3437056SNickeau 19*c3437056SNickeau /** 20*c3437056SNickeau * @var Page 21*c3437056SNickeau */ 22*c3437056SNickeau private $page; 23*c3437056SNickeau /** 24*c3437056SNickeau * @var array - the normalized data after processing 25*c3437056SNickeau * Name of metadata may be deprecated 26*c3437056SNickeau * After processing, this array will have the new keys 27*c3437056SNickeau * Use in a frontmatter to send correct data to the rendering metadata phase 28*c3437056SNickeau */ 29*c3437056SNickeau private $normalizedData; 30*c3437056SNickeau /** 31*c3437056SNickeau * @var array - the processing messages 32*c3437056SNickeau */ 33*c3437056SNickeau private $messages; 34*c3437056SNickeau 35*c3437056SNickeau /** 36*c3437056SNickeau * MetadataStoreTransfer constructor. 37*c3437056SNickeau * @param Page $resource 38*c3437056SNickeau */ 39*c3437056SNickeau public function __construct(ResourceCombo $resource) 40*c3437056SNickeau { 41*c3437056SNickeau $this->page = $resource; 42*c3437056SNickeau } 43*c3437056SNickeau 44*c3437056SNickeau 45*c3437056SNickeau public static function createForPage($page): MetadataStoreTransfer 46*c3437056SNickeau { 47*c3437056SNickeau return new MetadataStoreTransfer($page); 48*c3437056SNickeau } 49*c3437056SNickeau 50*c3437056SNickeau public function fromStore(MetadataStore $sourceStore): MetadataStoreTransfer 51*c3437056SNickeau { 52*c3437056SNickeau $this->sourceStore = $sourceStore; 53*c3437056SNickeau return $this; 54*c3437056SNickeau } 55*c3437056SNickeau 56*c3437056SNickeau public function toStore(MetadataStore $targetStore): MetadataStoreTransfer 57*c3437056SNickeau { 58*c3437056SNickeau $this->targetStore = $targetStore; 59*c3437056SNickeau return $this; 60*c3437056SNickeau } 61*c3437056SNickeau 62*c3437056SNickeau /** 63*c3437056SNickeau * @param array $data 64*c3437056SNickeau * @return $this 65*c3437056SNickeau */ 66*c3437056SNickeau public function process(array $data): MetadataStoreTransfer 67*c3437056SNickeau { 68*c3437056SNickeau $messages = []; 69*c3437056SNickeau 70*c3437056SNickeau /** 71*c3437056SNickeau * Pre-processing 72*c3437056SNickeau * Check/ validity and list of metadata building 73*c3437056SNickeau */ 74*c3437056SNickeau $metadatas = []; 75*c3437056SNickeau foreach ($data as $persistentName => $value) { 76*c3437056SNickeau 77*c3437056SNickeau 78*c3437056SNickeau $metadata = Metadata::getForName($persistentName); 79*c3437056SNickeau 80*c3437056SNickeau /** 81*c3437056SNickeau * Take old name or renaming into account 82*c3437056SNickeau * 83*c3437056SNickeau * ie The old key should be replace by the new one 84*c3437056SNickeau * (ie {@link \ComboStrap\PagePublicationDate::OLD_META_KEY} 85*c3437056SNickeau * by {@link \ComboStrap\PagePublicationDate::PROPERTY_NAME} 86*c3437056SNickeau */ 87*c3437056SNickeau $name = $persistentName; 88*c3437056SNickeau if ($metadata !== null) { 89*c3437056SNickeau $name = $metadata::getName(); 90*c3437056SNickeau $persistentName = $metadata::getPersistentName(); 91*c3437056SNickeau } 92*c3437056SNickeau $this->normalizedData[$persistentName] = $value; 93*c3437056SNickeau 94*c3437056SNickeau /** 95*c3437056SNickeau * Not modifiable meta check 96*c3437056SNickeau */ 97*c3437056SNickeau if (in_array($name, Metadata::NOT_MODIFIABLE_METAS)) { 98*c3437056SNickeau $messages[] = Message::createWarningMessage("The metadata ($name) is a protected metadata and cannot be modified") 99*c3437056SNickeau ->setCanonical(Metadata::CANONICAL); 100*c3437056SNickeau continue; 101*c3437056SNickeau } 102*c3437056SNickeau 103*c3437056SNickeau /** 104*c3437056SNickeau * Unknown meta 105*c3437056SNickeau */ 106*c3437056SNickeau if ($metadata === null) { 107*c3437056SNickeau $this->targetStore->setFromPersistentName($persistentName, $value); 108*c3437056SNickeau continue; 109*c3437056SNickeau } 110*c3437056SNickeau 111*c3437056SNickeau /** 112*c3437056SNickeau * Valid meta to proceed in the next phase 113*c3437056SNickeau */ 114*c3437056SNickeau $metadatas[$name] = $metadata; 115*c3437056SNickeau 116*c3437056SNickeau } 117*c3437056SNickeau 118*c3437056SNickeau 119*c3437056SNickeau foreach ($metadatas as $metadata) { 120*c3437056SNickeau 121*c3437056SNickeau 122*c3437056SNickeau /** 123*c3437056SNickeau * Persistent ? 124*c3437056SNickeau */ 125*c3437056SNickeau if ($metadata->getPersistenceType() !== Metadata::PERSISTENT_METADATA) { 126*c3437056SNickeau $messages[] = Message::createWarningMessage("The metadata ({$metadata->getName()}) is not persistent and cannot be modified") 127*c3437056SNickeau ->setCanonical($metadata->getCanonical()); 128*c3437056SNickeau continue; 129*c3437056SNickeau } 130*c3437056SNickeau 131*c3437056SNickeau /** 132*c3437056SNickeau * Sync 133*c3437056SNickeau */ 134*c3437056SNickeau try { 135*c3437056SNickeau $metadata 136*c3437056SNickeau ->setResource($this->page) 137*c3437056SNickeau ->setReadStore($this->sourceStore) 138*c3437056SNickeau ->buildFromReadStore() 139*c3437056SNickeau ->setWriteStore($this->targetStore) 140*c3437056SNickeau ->sendToWriteStore(); 141*c3437056SNickeau } catch (ExceptionCombo $e) { 142*c3437056SNickeau $messages[] = Message::createErrorMessage("Error while replicating the meta ($metadata) from the store ($this->sourceStore) to the store ($this->targetStore). Message: " . $e->getMessage()) 143*c3437056SNickeau ->setCanonical($metadata->getCanonical()); 144*c3437056SNickeau } 145*c3437056SNickeau } 146*c3437056SNickeau $this->targetStore->persist(); 147*c3437056SNickeau 148*c3437056SNickeau $this->messages = $messages; 149*c3437056SNickeau return $this; 150*c3437056SNickeau } 151*c3437056SNickeau 152*c3437056SNickeau /** 153*c3437056SNickeau * @return Message[] 154*c3437056SNickeau */ 155*c3437056SNickeau public function getMessages(): array 156*c3437056SNickeau { 157*c3437056SNickeau return $this->messages; 158*c3437056SNickeau } 159*c3437056SNickeau 160*c3437056SNickeau public function getNormalizedDataArray(): array 161*c3437056SNickeau { 162*c3437056SNickeau return $this->normalizedData; 163*c3437056SNickeau } 164*c3437056SNickeau 165*c3437056SNickeau 166*c3437056SNickeau} 167