1c3437056SNickeau<?php 2c3437056SNickeau 3c3437056SNickeau 4c3437056SNickeaunamespace ComboStrap; 5c3437056SNickeau 6c3437056SNickeau 7*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 8*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataText; 9*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore; 10*04fd306cSNickeau 11c3437056SNickeauclass CacheExpirationFrequency extends MetadataText 12c3437056SNickeau{ 13c3437056SNickeau 14c3437056SNickeau /** 15c3437056SNickeau * The meta that has the cron expression 16c3437056SNickeau */ 17c3437056SNickeau public const PROPERTY_NAME = "cache_expiration_frequency"; 18c3437056SNickeau public const CANONICAL = "page-cache-expiration-frequency"; 19c3437056SNickeau 20c3437056SNickeau public static function createForPage(ResourceCombo $page): CacheExpirationFrequency 21c3437056SNickeau { 22c3437056SNickeau return (new CacheExpirationFrequency()) 23c3437056SNickeau ->setResource($page); 24c3437056SNickeau } 25c3437056SNickeau 26*04fd306cSNickeau public static function getTab(): string 27c3437056SNickeau { 28c3437056SNickeau return MetaManagerForm::TAB_CACHE_VALUE; 29c3437056SNickeau } 30c3437056SNickeau 31c3437056SNickeau /** 32c3437056SNickeau * @param string|null $value 33c3437056SNickeau * @return Metadata 34*04fd306cSNickeau * @throws ExceptionBadArgument - if the value cannot be persisted 35*04fd306cSNickeau * @throws ExceptionBadSyntax - if the frequency has not the good syntax 36c3437056SNickeau */ 37c3437056SNickeau public function setValue($value): Metadata 38c3437056SNickeau { 39c3437056SNickeau 40c3437056SNickeau if ($value === null) { 41c3437056SNickeau parent::setValue($value); 42c3437056SNickeau return $this; 43c3437056SNickeau } 44c3437056SNickeau 45c3437056SNickeau $value = trim($value); 46c3437056SNickeau if ($value === "") { 47c3437056SNickeau // html form send an empty string 48c3437056SNickeau return $this; 49c3437056SNickeau } 50c3437056SNickeau 51c3437056SNickeau try { 52c3437056SNickeau $cacheExpirationCalculatedDate = Cron::getDate($value); 53*04fd306cSNickeau } catch (ExceptionBadSyntax $e) { 54*04fd306cSNickeau throw new ExceptionBadSyntax("The cache frequency expression ($value) is not a valid cron expression. <a href=\"https://crontab.guru/\">Validate it on this website</a>", CacheExpirationFrequency::PROPERTY_NAME, 0, $e); 55*04fd306cSNickeau } 56c3437056SNickeau $cacheExpirationDate = CacheExpirationDate::createForPage($this->getResource()); 57c3437056SNickeau $cacheExpirationDate 58c3437056SNickeau ->setValue($cacheExpirationCalculatedDate) 59c3437056SNickeau ->persist(); 60c3437056SNickeau parent::setValue($value); 61c3437056SNickeau return $this; 62*04fd306cSNickeau 63c3437056SNickeau 64c3437056SNickeau } 65c3437056SNickeau 66c3437056SNickeau 67*04fd306cSNickeau public static function getDescription(): string 68c3437056SNickeau { 69c3437056SNickeau return "A page expiration frequency expressed as a cron expression"; 70c3437056SNickeau } 71c3437056SNickeau 72*04fd306cSNickeau public static function getLabel(): string 73c3437056SNickeau { 74c3437056SNickeau return "Cache Expiration Frequency"; 75c3437056SNickeau } 76c3437056SNickeau 77c3437056SNickeau public static function getName(): string 78c3437056SNickeau { 79c3437056SNickeau return self::PROPERTY_NAME; 80c3437056SNickeau } 81c3437056SNickeau 82*04fd306cSNickeau public static function getPersistenceType(): string 83c3437056SNickeau { 84*04fd306cSNickeau return MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY; 85c3437056SNickeau } 86c3437056SNickeau 87*04fd306cSNickeau public static function isMutable(): bool 88c3437056SNickeau { 89c3437056SNickeau return true; 90c3437056SNickeau } 91c3437056SNickeau 92c3437056SNickeau public function getDefaultValue() 93c3437056SNickeau { 94c3437056SNickeau return null; 95c3437056SNickeau } 96c3437056SNickeau 97*04fd306cSNickeau public static function getCanonical(): string 98c3437056SNickeau { 99c3437056SNickeau return self::CANONICAL; 100c3437056SNickeau } 101c3437056SNickeau 102c3437056SNickeau 103*04fd306cSNickeau public static function isOnForm(): bool 104*04fd306cSNickeau { 105*04fd306cSNickeau return true; 106*04fd306cSNickeau } 107c3437056SNickeau} 108