xref: /template/strap/ComboStrap/CacheExpirationFrequency.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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