xref: /plugin/combo/ComboStrap/ModificationDate.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
1c3437056SNickeau<?php
2c3437056SNickeau
304fd306cSNickeaunamespace ComboStrap;
4c3437056SNickeau
504fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
604fd306cSNickeauuse ComboStrap\Meta\Api\MetadataDateTime;
704fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
804fd306cSNickeauuse DateTime;
9c3437056SNickeau
10c3437056SNickeauclass ModificationDate extends MetadataDateTime
11c3437056SNickeau{
12c3437056SNickeau
13c3437056SNickeau    public const PROPERTY_NAME = 'date_modified';
14c3437056SNickeau
1504fd306cSNickeau    public static function createForPage(MarkupPath $page)
16c3437056SNickeau    {
17c3437056SNickeau        return (new ModificationDate())
18c3437056SNickeau            ->setResource($page);
19c3437056SNickeau    }
20c3437056SNickeau
2104fd306cSNickeau    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
3304fd306cSNickeau        try {
3404fd306cSNickeau            $modificationTime = FileSystems::getModifiedTime($this->getResource()->getPathObject());
35c3437056SNickeau            $this->setValue($modificationTime);
36c3437056SNickeau            return $this;
3704fd306cSNickeau        } 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             */
43*70bbd7f1Sgerardnico            $currentDateMeta = $store->getCurrentFromName('date');
44*70bbd7f1Sgerardnico            $createdMeta = null;
45*70bbd7f1Sgerardnico            if ($currentDateMeta !== null) {
46*70bbd7f1Sgerardnico                $createdMeta = $currentDateMeta['modified'] ?? null;
47*70bbd7f1Sgerardnico            }
48c3437056SNickeau            if (empty($createdMeta)) {
49*70bbd7f1Sgerardnico                $createdMeta = $currentDateMeta['modified'] ?? null;
50c3437056SNickeau                if (empty($createdMeta)) {
51c3437056SNickeau                    return $this;
52c3437056SNickeau                }
53c3437056SNickeau            }
54c3437056SNickeau            // the data in dokuwiki is saved as timestamp
55c3437056SNickeau            $datetime = new DateTime();
56c3437056SNickeau            if (!is_int($createdMeta)) {
57c3437056SNickeau                LogUtility::msg("The modification time in the dokuwiki meta is not an integer");
58c3437056SNickeau                return $this;
59c3437056SNickeau            }
60c3437056SNickeau            $datetime->setTimestamp($createdMeta);
61c3437056SNickeau            $this->setValue($datetime);
62c3437056SNickeau            return $this;
6304fd306cSNickeau
64c3437056SNickeau        }
65c3437056SNickeau
66c3437056SNickeau
6704fd306cSNickeau    }
6804fd306cSNickeau
6904fd306cSNickeau
7004fd306cSNickeau    static public function getDescription(): string
71c3437056SNickeau    {
72c3437056SNickeau        return "The last modification date of the page"; // resource
73c3437056SNickeau    }
74c3437056SNickeau
7504fd306cSNickeau    static public function getLabel(): string
76c3437056SNickeau    {
77c3437056SNickeau        return "Modification Date";
78c3437056SNickeau    }
79c3437056SNickeau
80c3437056SNickeau    static public function getName(): string
81c3437056SNickeau    {
82c3437056SNickeau        return self::PROPERTY_NAME;
83c3437056SNickeau    }
84c3437056SNickeau
8504fd306cSNickeau    static public function getPersistenceType(): string
86c3437056SNickeau    {
87c3437056SNickeau        return Metadata::DERIVED_METADATA;
88c3437056SNickeau    }
89c3437056SNickeau
9004fd306cSNickeau    static public function isMutable(): bool
91c3437056SNickeau    {
92c3437056SNickeau        return false;
93c3437056SNickeau    }
94c3437056SNickeau
9504fd306cSNickeau    /**
9604fd306cSNickeau     * @throws ExceptionNotFound - if the file does not exists
9704fd306cSNickeau     */
9804fd306cSNickeau    public function getDefaultValue(): DateTime
99c3437056SNickeau    {
100c3437056SNickeau
10104fd306cSNickeau        try {
10204fd306cSNickeau            return FileSystems::getModifiedTime($this->getResource()->getPathObject());
10304fd306cSNickeau        } catch (ExceptionNotFound $e) {
10404fd306cSNickeau            return CreationDate::createForPage($this->getResource())->getValue();
105c3437056SNickeau        }
106c3437056SNickeau
107c3437056SNickeau    }
108c3437056SNickeau
10904fd306cSNickeau    static public function getCanonical(): string
110c3437056SNickeau    {
111c3437056SNickeau        return Metadata::CANONICAL;
112c3437056SNickeau    }
113c3437056SNickeau
114c3437056SNickeau
11504fd306cSNickeau    static public function isOnForm(): bool
11604fd306cSNickeau    {
11704fd306cSNickeau        return true;
11804fd306cSNickeau    }
119c3437056SNickeau}
120