xref: /plugin/combo/ComboStrap/ModificationDate.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1c3437056SNickeau<?php
2c3437056SNickeau
3*04fd306cSNickeaunamespace ComboStrap;
4c3437056SNickeau
5*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
6*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataDateTime;
7*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
8*04fd306cSNickeauuse DateTime;
9c3437056SNickeau
10c3437056SNickeauclass ModificationDate extends MetadataDateTime
11c3437056SNickeau{
12c3437056SNickeau
13c3437056SNickeau    public const PROPERTY_NAME = 'date_modified';
14c3437056SNickeau
15*04fd306cSNickeau    public static function createForPage(MarkupPath $page)
16c3437056SNickeau    {
17c3437056SNickeau        return (new ModificationDate())
18c3437056SNickeau            ->setResource($page);
19c3437056SNickeau    }
20c3437056SNickeau
21*04fd306cSNickeau    static public function getTab(): string
22c3437056SNickeau    {
23c3437056SNickeau        return MetaManagerForm::TAB_PAGE_VALUE;
24c3437056SNickeau    }
25c3437056SNickeau
26c3437056SNickeau    public function buildFromReadStore(): MetadataDateTime
27c3437056SNickeau    {
28c3437056SNickeau        $store = $this->getReadStore();
29c3437056SNickeau        if (!($store instanceof MetadataDokuWikiStore)) {
30c3437056SNickeau            return parent::buildFromReadStore();
31c3437056SNickeau        }
32c3437056SNickeau
33*04fd306cSNickeau        try {
34*04fd306cSNickeau            $modificationTime = FileSystems::getModifiedTime($this->getResource()->getPathObject());
35c3437056SNickeau            $this->setValue($modificationTime);
36c3437056SNickeau            return $this;
37*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
38c3437056SNickeau
39c3437056SNickeau            /**
40c3437056SNickeau             * Dokuwiki
41c3437056SNickeau             * Why do they store the date of the file while it's in the file system ?
42c3437056SNickeau             */
43c3437056SNickeau            $createdMeta = $store->getCurrentFromName('date')['modified'];
44c3437056SNickeau            if (empty($createdMeta)) {
45*04fd306cSNickeau                $createdMeta = $store->getFromName('date')['modified'];
46c3437056SNickeau                if (empty($createdMeta)) {
47c3437056SNickeau                    return $this;
48c3437056SNickeau                }
49c3437056SNickeau            }
50c3437056SNickeau            // the data in dokuwiki is saved as timestamp
51c3437056SNickeau            $datetime = new DateTime();
52c3437056SNickeau            if (!is_int($createdMeta)) {
53c3437056SNickeau                LogUtility::msg("The modification time in the dokuwiki meta is not an integer");
54c3437056SNickeau                return $this;
55c3437056SNickeau            }
56c3437056SNickeau            $datetime->setTimestamp($createdMeta);
57c3437056SNickeau            $this->setValue($datetime);
58c3437056SNickeau            return $this;
59*04fd306cSNickeau
60c3437056SNickeau        }
61c3437056SNickeau
62c3437056SNickeau
63*04fd306cSNickeau    }
64*04fd306cSNickeau
65*04fd306cSNickeau
66*04fd306cSNickeau    static public function getDescription(): string
67c3437056SNickeau    {
68c3437056SNickeau        return "The last modification date of the page"; // resource
69c3437056SNickeau    }
70c3437056SNickeau
71*04fd306cSNickeau    static public function getLabel(): string
72c3437056SNickeau    {
73c3437056SNickeau        return "Modification Date";
74c3437056SNickeau    }
75c3437056SNickeau
76c3437056SNickeau    static public function getName(): string
77c3437056SNickeau    {
78c3437056SNickeau        return self::PROPERTY_NAME;
79c3437056SNickeau    }
80c3437056SNickeau
81*04fd306cSNickeau    static public function getPersistenceType(): string
82c3437056SNickeau    {
83c3437056SNickeau        return Metadata::DERIVED_METADATA;
84c3437056SNickeau    }
85c3437056SNickeau
86*04fd306cSNickeau    static public function isMutable(): bool
87c3437056SNickeau    {
88c3437056SNickeau        return false;
89c3437056SNickeau    }
90c3437056SNickeau
91*04fd306cSNickeau    /**
92*04fd306cSNickeau     * @throws ExceptionNotFound - if the file does not exists
93*04fd306cSNickeau     */
94*04fd306cSNickeau    public function getDefaultValue(): DateTime
95c3437056SNickeau    {
96c3437056SNickeau
97*04fd306cSNickeau        try {
98*04fd306cSNickeau            return FileSystems::getModifiedTime($this->getResource()->getPathObject());
99*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
100*04fd306cSNickeau            return CreationDate::createForPage($this->getResource())->getValue();
101c3437056SNickeau        }
102c3437056SNickeau
103c3437056SNickeau    }
104c3437056SNickeau
105*04fd306cSNickeau    static public function getCanonical(): string
106c3437056SNickeau    {
107c3437056SNickeau        return Metadata::CANONICAL;
108c3437056SNickeau    }
109c3437056SNickeau
110c3437056SNickeau
111*04fd306cSNickeau    static public function isOnForm(): bool
112*04fd306cSNickeau    {
113*04fd306cSNickeau        return true;
114*04fd306cSNickeau    }
115c3437056SNickeau}
116