xref: /template/strap/ComboStrap/PagePublicationDate.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1c3437056SNickeau<?php
2c3437056SNickeau/**
3c3437056SNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved.
4c3437056SNickeau *
5c3437056SNickeau * This source code is licensed under the GPL license found in the
6c3437056SNickeau * COPYING  file in the root directory of this source tree.
7c3437056SNickeau *
8c3437056SNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
9c3437056SNickeau * @author   ComboStrap <support@combostrap.com>
10c3437056SNickeau *
11c3437056SNickeau */
12c3437056SNickeau
13c3437056SNickeaunamespace ComboStrap;
14c3437056SNickeau
15c3437056SNickeau
16*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
17*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataDateTime;
18*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
19*04fd306cSNickeauuse DateTime;
20*04fd306cSNickeau
21c3437056SNickeau/**
22c3437056SNickeau *
23c3437056SNickeau * Publication Date
24c3437056SNickeau * @package ComboStrap
25c3437056SNickeau *
26c3437056SNickeau */
27c3437056SNickeauclass PagePublicationDate extends MetadataDateTime
28c3437056SNickeau{
29c3437056SNickeau
30c3437056SNickeau    /**
31c3437056SNickeau     * The key that contains the published date
32c3437056SNickeau     */
33c3437056SNickeau    const PROPERTY_NAME = "date_published";
34c3437056SNickeau    const OLD_META_KEY = "published";
35c3437056SNickeau
36c3437056SNickeau    /**
37c3437056SNickeau     * Late publication protection
38c3437056SNickeau     */
39c3437056SNickeau    const LATE_PUBLICATION_PROTECTION_ACRONYM = "lpp";
40c3437056SNickeau    const CONF_LATE_PUBLICATION_PROTECTION_MODE = "latePublicationProtectionMode";
41c3437056SNickeau    const CONF_LATE_PUBLICATION_PROTECTION_ENABLE = "latePublicationProtectionEnable";
42*04fd306cSNickeau    const LATE_PUBLICATION_CLASS_PREFIX_NAME = "late-publication";
43c3437056SNickeau
44c3437056SNickeau
45c3437056SNickeau    public static function getLatePublicationProtectionMode()
46c3437056SNickeau    {
47c3437056SNickeau
48*04fd306cSNickeau        if (SiteConfig::getConfValue(PagePublicationDate::CONF_LATE_PUBLICATION_PROTECTION_ENABLE, true)) {
49*04fd306cSNickeau            return SiteConfig::getConfValue(PagePublicationDate::CONF_LATE_PUBLICATION_PROTECTION_MODE);
50c3437056SNickeau        } else {
51c3437056SNickeau            return false;
52c3437056SNickeau        }
53c3437056SNickeau
54c3437056SNickeau    }
55c3437056SNickeau
56c3437056SNickeau    public static function isLatePublicationProtectionEnabled()
57c3437056SNickeau    {
58*04fd306cSNickeau        return SiteConfig::getConfValue(PagePublicationDate::CONF_LATE_PUBLICATION_PROTECTION_ENABLE, true);
59c3437056SNickeau    }
60c3437056SNickeau
61*04fd306cSNickeau    public static function createFromPage(MarkupPath $page)
62c3437056SNickeau    {
63c3437056SNickeau        return (new PagePublicationDate())
64c3437056SNickeau            ->setResource($page);
65c3437056SNickeau    }
66c3437056SNickeau
67c3437056SNickeau
68*04fd306cSNickeau    static public function getTab(): string
69c3437056SNickeau    {
70c3437056SNickeau        return MetaManagerForm::TAB_TYPE_VALUE;
71c3437056SNickeau    }
72c3437056SNickeau
73*04fd306cSNickeau    static public function getDescription(): string
74c3437056SNickeau    {
75c3437056SNickeau        return "The publication date";
76c3437056SNickeau    }
77c3437056SNickeau
78*04fd306cSNickeau    static public function getLabel(): string
79c3437056SNickeau    {
80c3437056SNickeau        return "Publication Date";
81c3437056SNickeau    }
82c3437056SNickeau
83c3437056SNickeau    static public function getName(): string
84c3437056SNickeau    {
85c3437056SNickeau        return self::PROPERTY_NAME;
86c3437056SNickeau    }
87c3437056SNickeau
88c3437056SNickeau
89*04fd306cSNickeau    public function setFromStoreValueWithoutException($value): Metadata
90c3437056SNickeau    {
91c3437056SNickeau        $store = $this->getReadStore();
92c3437056SNickeau        if (!($store instanceof MetadataDokuWikiStore)) {
93*04fd306cSNickeau            return parent::setFromStoreValueWithoutException($value);
94c3437056SNickeau        }
95c3437056SNickeau
96c3437056SNickeau        if ($value === null) {
97c3437056SNickeau            /**
98c3437056SNickeau             * Old metadata key
99c3437056SNickeau             */
100*04fd306cSNickeau            $value = $store->getFromName(PagePublicationDate::OLD_META_KEY);
101c3437056SNickeau        }
102c3437056SNickeau
103c3437056SNickeau        try {
104c3437056SNickeau            $this->dateTimeValue = $this->fromPersistentDateTimeUtility($value);
105*04fd306cSNickeau        } catch (ExceptionCompile $e) {
106c3437056SNickeau            LogUtility::msg($e->getMessage(), LogUtility::LVL_MSG_ERROR, $e->getCanonical());
107c3437056SNickeau        }
108c3437056SNickeau
109c3437056SNickeau        return $this;
110c3437056SNickeau    }
111c3437056SNickeau
112c3437056SNickeau
113*04fd306cSNickeau    static public function getPersistenceType(): string
114c3437056SNickeau    {
115c3437056SNickeau        return Metadata::PERSISTENT_METADATA;
116c3437056SNickeau    }
117c3437056SNickeau
118*04fd306cSNickeau    static public function isMutable(): bool
119c3437056SNickeau    {
120c3437056SNickeau        return true;
121c3437056SNickeau    }
122c3437056SNickeau
123*04fd306cSNickeau    public function getDefaultValue(): DateTime
124c3437056SNickeau    {
125*04fd306cSNickeau        $lastName = $this->getResource()->getPathObject()->getLastNameWithoutExtension();
126*04fd306cSNickeau        $result = preg_match("/(\d{4}-\d{2}-\d{2}).*/i", $lastName, $matches);
127*04fd306cSNickeau        if ($result === 1) {
128*04fd306cSNickeau            $date = $matches[1];
129*04fd306cSNickeau            try {
130*04fd306cSNickeau                return Iso8601Date::createFromString($date)->getDateTime();
131*04fd306cSNickeau            } catch (ExceptionBadSyntax $e) {
132*04fd306cSNickeau                // should not happen
133*04fd306cSNickeau                LogUtility::error("Internal Error: the date format is not valid. Error: {$e->getMessage()}", self::CANONICAL);
134*04fd306cSNickeau            }
135*04fd306cSNickeau        }
136*04fd306cSNickeau
137*04fd306cSNickeau        return CreationDate::create()
138c3437056SNickeau            ->setResource($this->getResource())
139c3437056SNickeau            ->getValueOrDefault();
140c3437056SNickeau    }
141c3437056SNickeau
142c3437056SNickeau    static public function getOldPersistentNames(): array
143c3437056SNickeau    {
144c3437056SNickeau        return [PagePublicationDate::OLD_META_KEY];
145c3437056SNickeau    }
146c3437056SNickeau
147*04fd306cSNickeau    static public function getCanonical(): string
148c3437056SNickeau    {
149c3437056SNickeau        return "published";
150c3437056SNickeau    }
151c3437056SNickeau
152c3437056SNickeau
153*04fd306cSNickeau    static public function isOnForm(): bool
154*04fd306cSNickeau    {
155*04fd306cSNickeau        return true;
156*04fd306cSNickeau    }
157c3437056SNickeau}
158