release 2022.11.20

This commit is contained in:
Jean-Christian Denis 2022-11-20 21:43:32 +01:00
parent 947b0cf339
commit beb6a186d1
Signed by: JcDenis
GPG key ID: 1B5B8C5B90B6C951
9 changed files with 195 additions and 266 deletions

View file

@ -1,5 +1,6 @@
2022.04.27.1 - dev 2022.11.20
- [ ] fix wrong timezone on admin vs public expired date - fix compatibility with Dotclear 2.24 (required)
- fix wrong timezone on admin vs public expired date
2022.04.27 2022.04.27
- require Dotclear 2.21.3 - require Dotclear 2.21.3

View file

@ -3,11 +3,10 @@
[![Release](https://img.shields.io/github/v/release/JcDenis/postExpired)](https://github.com/JcDenis/postExpired/releases) [![Release](https://img.shields.io/github/v/release/JcDenis/postExpired)](https://github.com/JcDenis/postExpired/releases)
[![Date](https://img.shields.io/github/release-date/JcDenis/postExpired)](https://github.com/JcDenis/postExpired/releases) [![Date](https://img.shields.io/github/release-date/JcDenis/postExpired)](https://github.com/JcDenis/postExpired/releases)
[![Issues](https://img.shields.io/github/issues/JcDenis/postExpired)](https://github.com/JcDenis/postExpired/issues) [![Issues](https://img.shields.io/github/issues/JcDenis/postExpired)](https://github.com/JcDenis/postExpired/issues)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.20-blue.svg)](https://fr.dotclear.org/download) [![Dotclear](https://img.shields.io/badge/dotclear-v2.24-blue.svg)](https://fr.dotclear.org/download)
[![Dotaddict](https://img.shields.io/badge/dotaddict-official-green.svg)](https://plugins.dotaddict.org/dc2/details/postExpired) [![Dotaddict](https://img.shields.io/badge/dotaddict-official-green.svg)](https://plugins.dotaddict.org/dc2/details/postExpired)
[![License](https://img.shields.io/github/license/JcDenis/postExpired)](https://github.com/JcDenis/postExpired/blob/master/LICENSE) [![License](https://img.shields.io/github/license/JcDenis/postExpired)](https://github.com/JcDenis/postExpired/blob/master/LICENSE)
## WHAT IS POSTEXPIRED ? ## WHAT IS POSTEXPIRED ?
Post expired is a plugin for the open-source Post expired is a plugin for the open-source
@ -21,7 +20,7 @@ to change some options of a post at a given time.
postExpired requires: postExpired requires:
* contentadmin permissions * contentadmin permissions
* Dotclear 2.21.3 * Dotclear 2.24
## USAGE ## USAGE
@ -43,8 +42,8 @@ Notes:
* License : [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html) * License : [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html)
* Source & contribution : [GitHub Page](https://github.com/JcDenis/postExpired) * Source & contribution : [GitHub Page](https://github.com/JcDenis/postExpired)
* Packages & details: [Dotaddict Page](https://plugins.dotaddict.org/dc2/details/postExpired) * Packages & details : [Dotaddict Page](https://plugins.dotaddict.org/dc2/details/postExpired)
* Discuss & help: [Dotclear Forum](https://forum.dotclear.org/viewtopic.php?id=42305) * Discuss & help : [Dotclear Forum](https://forum.dotclear.org/viewtopic.php?id=42305)
## CONTRIBUTORS ## CONTRIBUTORS

View file

@ -1,16 +1,15 @@
<?php <?php
/** /**
* @brief postExpired, a plugin for Dotclear 2 * @brief postExpired, a plugin for Dotclear 2
* *
* @package Dotclear * @package Dotclear
* @subpackage Plugin * @subpackage Plugin
* *
* @author Jean-Christian Denis and Contributors * @author Jean-Christian Denis and Contributors
* *
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
if (!defined('DC_CONTEXT_ADMIN')) { if (!defined('DC_CONTEXT_ADMIN')) {
return null; return null;
} }
@ -22,8 +21,8 @@ if (dcCore::app()->getVersion('postExpired') != dcCore::app()->plugins->moduleIn
# Check user right # Check user right
if (!dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([ if (!dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([
dcAuth::PERMISSION_CONTENT_ADMIN, dcAuth::PERMISSION_CONTENT_ADMIN,
]), dcCore::app()->blog->id) ]), dcCore::app()->blog->id)
) { ) {
return null; return null;
} }
@ -87,33 +86,33 @@ class adminBehaviorPostExpired
{ {
/** /**
* Add actions to posts page combo * Add actions to posts page combo
* *
* @param dcPostsActionsPage $ap dcPostsActionsPage instance * @param dcPostsActionsPage $ap dcPostsActionsPage instance
*/ */
public static function adminPostsActions(dcPostsActions $pa) public static function adminPostsActions(dcPostsActions $pa)
{ {
$pa->addAction( $pa->addAction(
array( [
__('Expired entries') => array( __('Expired entries') => [
__('Add expired date') => 'post_expired_add' __('Add expired date') => 'post_expired_add',
) ],
), ],
array('adminBehaviorPostExpired', 'callbackAdd') ['adminBehaviorPostExpired', 'callbackAdd']
); );
$pa->addAction( $pa->addAction(
array( [
__('Expired entries') => array( __('Expired entries') => [
__('Remove expired date') => 'post_expired_remove' __('Remove expired date') => 'post_expired_remove',
) ],
), ],
array('adminBehaviorPostExpired', 'callbackRemove') ['adminBehaviorPostExpired', 'callbackRemove']
); );
} }
/** /**
* Add javascript for date field and toggle * Add javascript for date field and toggle
* *
* @return string HTML head * @return string HTML head
*/ */
public static function adminPostHeaders() public static function adminPostHeaders()
@ -123,7 +122,7 @@ class adminBehaviorPostExpired
/** /**
* Add form to post sidebar * Add form to post sidebar
* *
* @param ArrayObject $main_items Main items * @param ArrayObject $main_items Main items
* @param ArrayObject $sidebar_items Sidebar items * @param ArrayObject $sidebar_items Sidebar items
* @param record $post Post record or null * @param record $post Post record or null
@ -134,18 +133,18 @@ class adminBehaviorPostExpired
return null; return null;
} }
$sidebar_items['post_expired'] = array( $sidebar_items['post_expired'] = [
'title' => __('Expired date'), 'title' => __('Expired date'),
'items' => self::fieldsPostExpired( 'items' => self::fieldsPostExpired(
$post->post_type, $post->post_type,
$post->post_id $post->post_id
) ),
); ];
} }
/** /**
* Delete expired date on post edition * Delete expired date on post edition
* *
* @param integer $post_id Post id * @param integer $post_id Post id
*/ */
public static function adminBeforePostDelete($post_id) public static function adminBeforePostDelete($post_id)
@ -155,7 +154,7 @@ class adminBehaviorPostExpired
/** /**
* Add expired date on post edition * Add expired date on post edition
* *
* @param cursor $cur Current post cursor * @param cursor $cur Current post cursor
* @param integer $post_id Post id * @param integer $post_id Post id
*/ */
@ -175,7 +174,7 @@ class adminBehaviorPostExpired
/** /**
* Posts actions callback to add expired date * Posts actions callback to add expired date
* *
* @param dcPostsActions $pa dcPostsActions instance * @param dcPostsActions $pa dcPostsActions instance
* @param ArrayObject $post _POST actions * @param ArrayObject $post _POST actions
*/ */
@ -194,7 +193,7 @@ class adminBehaviorPostExpired
|| !empty($post['post_expired_selected']) || !empty($post['post_expired_selected'])
|| !empty($post['post_expired_comment']) || !empty($post['post_expired_comment'])
|| !empty($post['post_expired_trackback']))) { || !empty($post['post_expired_trackback']))) {
foreach($posts_ids as $post_id) { foreach ($posts_ids as $post_id) {
self::delPostExpired($post_id); self::delPostExpired($post_id);
self::setPostExpired($post_id, $post); self::setPostExpired($post_id, $post);
} }
@ -208,11 +207,11 @@ class adminBehaviorPostExpired
$posts = $pa->getRS(); $posts = $pa->getRS();
$pa->beginPage( $pa->beginPage(
dcPage::breadcrumb(array( dcPage::breadcrumb([
html::escapeHTML(dcCore::app()->blog->name) => '', html::escapeHTML(dcCore::app()->blog->name) => '',
$pa->getCallerTitle() => $pa->getRedirection(true), $pa->getCallerTitle() => $pa->getRedirection(true),
__('Add expired date to this selection') => '' __('Add expired date to this selection') => '',
)), ]),
//dcPage::jsDatePicker() . //dcPage::jsDatePicker() .
self::adminPostHeaders() self::adminPostHeaders()
); );
@ -225,7 +224,7 @@ class adminBehaviorPostExpired
dcCore::app()->formNonce() . dcCore::app()->formNonce() .
$pa->getHiddenFields() . $pa->getHiddenFields() .
form::hidden(array('action'), 'post_expired_add') . form::hidden(['action'], 'post_expired_add') .
'<input type="submit" value="' . __('Save') . '" /></p>' . '<input type="submit" value="' . __('Save') . '" /></p>' .
'</form>'; '</form>';
@ -235,7 +234,7 @@ class adminBehaviorPostExpired
/** /**
* Posts actions callback to add expired date * Posts actions callback to add expired date
* *
* @param dcPostsActions $pa dcPostsActions instance * @param dcPostsActions $pa dcPostsActions instance
* @param ArrayObject $post _POST actions * @param ArrayObject $post _POST actions
*/ */
@ -248,7 +247,7 @@ class adminBehaviorPostExpired
} }
# Delete expired date # Delete expired date
foreach($posts_ids as $post_id) { foreach ($posts_ids as $post_id) {
self::delPostExpired($post_id); self::delPostExpired($post_id);
} }
@ -258,7 +257,7 @@ class adminBehaviorPostExpired
/** /**
* Delete expired date * Delete expired date
* *
* @param integer $post_id Post id * @param integer $post_id Post id
*/ */
protected static function delPostExpired($post_id) protected static function delPostExpired($post_id)
@ -268,43 +267,38 @@ class adminBehaviorPostExpired
/** /**
* Save expired date * Save expired date
* *
* @param integer $post_id Post id * @param integer $post_id Post id
* @param array $post _POST fields * @param array $post _POST fields
*/ */
protected static function setPostExpired($post_id, $post) protected static function setPostExpired($post_id, $post)
{ {
$post_expired = array( $post_expired = [
'status'=> '', 'status' => '',
'category'=> '', 'category' => '',
'selected'=> '', 'selected' => '',
'comment'=> '', 'comment' => '',
'trackback' => '', 'trackback' => '',
'date'=> date( 'date' => date(
'Y-m-d H:i:00', 'Y-m-d H:i:00',
strtotime($post['post_expired_date']) strtotime($post['post_expired_date'])
) ),
); ];
if (!empty($post['post_expired_status'])) { if (!empty($post['post_expired_status'])) {
$post_expired['status'] = $post_expired['status'] = (string) $post['post_expired_status'];
(string) $post['post_expired_status'];
} }
if (!empty($post['post_expired_category'])) { if (!empty($post['post_expired_category'])) {
$post_expired['category'] = $post_expired['category'] = (string) $post['post_expired_category'];
(string) $post['post_expired_category'];
} }
if (!empty($post['post_expired_selected'])) { if (!empty($post['post_expired_selected'])) {
$post_expired['selected'] = $post_expired['selected'] = (string) $post['post_expired_selected'];
(string) $post['post_expired_selected'];
} }
if (!empty($post['post_expired_comment'])) { if (!empty($post['post_expired_comment'])) {
$post_expired['comment'] = $post_expired['comment'] = (string) $post['post_expired_comment'];
(string) $post['post_expired_comment'];
} }
if (!empty($post['post_expired_trackback'])) { if (!empty($post['post_expired_trackback'])) {
$post_expired['trackback'] = $post_expired['trackback'] = (string) $post['post_expired_trackback'];
(string) $post['post_expired_trackback'];
} }
dcCore::app()->meta->setPostMeta( dcCore::app()->meta->setPostMeta(
@ -316,20 +310,19 @@ class adminBehaviorPostExpired
/** /**
* Expired date form fields * Expired date form fields
* *
* @param string $post_type Posts type * @param string $post_type Posts type
* @return array Array of HTML form fields * @return array Array of HTML form fields
*/ */
protected static function fieldsPostExpired($post_type, $post_id = null) protected static function fieldsPostExpired($post_type, $post_id = null)
{ {
$fields = $post_expired = array(); $fields = $post_expired = [];
if ($post_id) { if ($post_id) {
$rs = dcCore::app()->meta->getMetadata([ $rs = dcCore::app()->meta->getMetadata([
'meta_type' => 'post_expired', 'meta_type' => 'post_expired',
'post_id' => $post_id, 'post_id' => $post_id,
'limit' => 1 'limit' => 1,
]); ]);
if (!$rs->isEmpty()) { if (!$rs->isEmpty()) {
@ -337,8 +330,7 @@ class adminBehaviorPostExpired
} }
} }
$fields['post_expired_date'] = $fields['post_expired_date'] = '<p><label for="post_expired_date">' .
'<p><label for="post_expired_date">' .
__('Date:') . '</label>' . __('Date:') . '</label>' .
form::datetime('post_expired_date', [ form::datetime('post_expired_date', [
'default' => html::escapeHTML(dt::str('%Y-%m-%dT%H:%M', strtotime($post_expired['date'] ?? 0))), 'default' => html::escapeHTML(dt::str('%Y-%m-%dT%H:%M', strtotime($post_expired['date'] ?? 0))),
@ -346,61 +338,55 @@ class adminBehaviorPostExpired
]) ])
. '</p>'; . '</p>';
$fields['post_expired_status'] = $fields['post_expired_status'] = '<h5>' . __('On this date, change:') . '</h5>' .
'<h5>' . __('On this date, change:') . '</h5>' .
'<p><label for="post_expired_status">' . '<p><label for="post_expired_status">' .
__('Status:') . '</label>' . __('Status:') . '</label>' .
form::combo( form::combo(
'post_expired_status', 'post_expired_status',
self::statusCombo(), self::statusCombo(),
empty($post_expired['status']) ? empty($post_expired['status']) ?
'' : $post_expired['status'] '' : $post_expired['status']
) . '</p>'; ) . '</p>';
if ($post_type == 'post') { if ($post_type == 'post') {
$fields['post_expired_category'] = '<p><label for="post_expired_category">' .
$fields['post_expired_category'] =
'<p><label for="post_expired_category">' .
__('Category:') . '</label>' . __('Category:') . '</label>' .
form::combo( form::combo(
'post_expired_category', 'post_expired_category',
self::categoriesCombo( self::categoriesCombo(
dcCore::app()->blog->getCategories( dcCore::app()->blog->getCategories(
array('post_type' => 'post') ['post_type' => 'post']
) )
), ),
empty($post_expired['category']) ? empty($post_expired['category']) ?
'' : $post_expired['category'] '' : $post_expired['category']
) . '</p>'; ) . '</p>';
$fields['post_expired_selected'] = $fields['post_expired_selected'] = '<p><label for="post_expired_selected">' .
'<p><label for="post_expired_selected">' .
__('Selection:') . '</label>' . __('Selection:') . '</label>' .
form::combo( form::combo(
'post_expired_selected', 'post_expired_selected',
self::selectedCombo(), self::selectedCombo(),
empty($post_expired['selected']) ? empty($post_expired['selected']) ?
'' : $post_expired['selected'] '' : $post_expired['selected']
) . '</p>'; ) . '</p>';
} }
$fields['post_expired_comment'] = $fields['post_expired_comment'] = '<p><label for="post_expired_comment">' .
'<p><label for="post_expired_comment">' .
__('Comments status:') . '</label>' . __('Comments status:') . '</label>' .
form::combo( form::combo(
'post_expired_comment', 'post_expired_comment',
self::commentCombo(), self::commentCombo(),
empty($post_expired['comment']) ? empty($post_expired['comment']) ?
'' : $post_expired['comment'] '' : $post_expired['comment']
) . '</p>'; ) . '</p>';
$fields['post_expired_trackback'] = $fields['post_expired_trackback'] = '<p><label for="post_expired_trackback">' .
'<p><label for="post_expired_trackback">' .
__('Trackbacks status:') . '</label>' . __('Trackbacks status:') . '</label>' .
form::combo( form::combo(
'post_expired_trackback', 'post_expired_trackback',
self::trackbackCombo(), self::trackbackCombo(),
empty($post_expired['trackback']) ? empty($post_expired['trackback']) ?
'' : $post_expired['trackback'] '' : $post_expired['trackback']
) . '</p>'; ) . '</p>';
@ -409,29 +395,30 @@ class adminBehaviorPostExpired
/** /**
* Custom categories combo * Custom categories combo
* *
* @param dcRecord $categories Categories recordset * @param dcRecord $categories Categories recordset
* @return array Categorires combo * @return array Categorires combo
*/ */
protected static function categoriesCombo(dcRecord $categories) protected static function categoriesCombo(dcRecord $categories)
{ {
# Getting categories # Getting categories
$categories_combo = array( $categories_combo = [
__('Not changed') => '', __('Not changed') => '',
__('Uncategorized') => '!' __('Uncategorized') => '!',
); ];
try { try {
$categories = dcCore::app()->blog->getCategories( $categories = dcCore::app()->blog->getCategories(
array('post_type' => 'post') ['post_type' => 'post']
); );
while ($categories->fetch()) { while ($categories->fetch()) {
$categories_combo[] = new formSelectOption( $categories_combo[] = new formSelectOption(
str_repeat('&nbsp;&nbsp;', $categories->level - 1) . '&bull; '. html::escapeHTML($categories->cat_title), str_repeat('&nbsp;&nbsp;', $categories->level - 1) . '&bull; ' . html::escapeHTML($categories->cat_title),
'!'.$categories->cat_id '!' . $categories->cat_id
); );
} }
} catch (Exception $e) { } catch (Exception $e) {
return array(); return [];
} }
return $categories_combo; return $categories_combo;
@ -439,58 +426,58 @@ class adminBehaviorPostExpired
/** /**
* Custom status combo * Custom status combo
* *
* @return array Status combo * @return array Status combo
*/ */
protected static function statusCombo() protected static function statusCombo()
{ {
return array( return [
__('Not changed') => '', __('Not changed') => '',
__('Published') => '!1', __('Published') => '!1',
__('Pending') => '!-2', __('Pending') => '!-2',
__('Unpublished') => '!0' __('Unpublished') => '!0',
); ];
} }
/** /**
* Custom selection combo * Custom selection combo
* *
* @return array Selection combo * @return array Selection combo
*/ */
protected static function selectedCombo() protected static function selectedCombo()
{ {
return array( return [
__('Not changed') => '', __('Not changed') => '',
__('Selected') => '!1', __('Selected') => '!1',
__('Not selected') => '!0' __('Not selected') => '!0',
); ];
} }
/** /**
* Custom comment status combo * Custom comment status combo
* *
* @return array Comment status combo * @return array Comment status combo
*/ */
protected static function commentCombo() protected static function commentCombo()
{ {
return array( return [
__('Not changed') => '', __('Not changed') => '',
__('Opened') => '!1', __('Opened') => '!1',
__('Closed') => '!0' __('Closed') => '!0',
); ];
} }
/** /**
* Custom trackback status combo * Custom trackback status combo
* *
* @return array Trackback status combo * @return array Trackback status combo
*/ */
protected static function trackbackCombo() protected static function trackbackCombo()
{ {
return array( return [
__('Not changed') => '', __('Not changed') => '',
__('Opened') => '!1', __('Opened') => '!1',
__('Closed') => '!0' __('Closed') => '!0',
); ];
} }
} }

View file

@ -1,34 +1,33 @@
<?php <?php
/** /**
* @brief postExpired, a plugin for Dotclear 2 * @brief postExpired, a plugin for Dotclear 2
* *
* @package Dotclear * @package Dotclear
* @subpackage Plugin * @subpackage Plugin
* *
* @author Jean-Christian Denis and Contributors * @author Jean-Christian Denis and Contributors
* *
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
if (!defined('DC_RC_PATH')) { if (!defined('DC_RC_PATH')) {
return null; return null;
} }
$this->registerModule( $this->registerModule(
'Expired entries', 'Expired entries',
'Change entries options at a given date', 'Change entries options at a given date',
'Jean-Christian Denis and Contributors', 'Jean-Christian Denis and Contributors',
'2022.11.12', '2022.11.12',
[ [
'requires' => [['core', '2.24']], 'requires' => [['core', '2.24']],
'permissions' => dcCore::app()->auth->makePermissions([ 'permissions' => dcCore::app()->auth->makePermissions([
dcAuth::PERMISSION_USAGE, dcAuth::PERMISSION_USAGE,
dcAuth::PERMISSION_CONTENT_ADMIN, dcAuth::PERMISSION_CONTENT_ADMIN,
]), ]),
'type' => 'plugin', 'type' => 'plugin',
'support' => 'https://github.com/JcDenis/postExpired', 'support' => 'https://github.com/JcDenis/postExpired',
'details' => 'https://plugins.dotaddict.org/dc2/details/postExpired', 'details' => 'https://plugins.dotaddict.org/dc2/details/postExpired',
'repository' => 'https://raw.githubusercontent.com/JcDenis/postExpired/master/dcstore.xml' 'repository' => 'https://raw.githubusercontent.com/JcDenis/postExpired/master/dcstore.xml',
] ]
); );

View file

@ -1,16 +1,15 @@
<?php <?php
/** /**
* @brief postExpired, a plugin for Dotclear 2 * @brief postExpired, a plugin for Dotclear 2
* *
* @package Dotclear * @package Dotclear
* @subpackage Plugin * @subpackage Plugin
* *
* @author Jean-Christian Denis and Contributors * @author Jean-Christian Denis and Contributors
* *
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
if (!defined('DC_CONTEXT_ADMIN')) { if (!defined('DC_CONTEXT_ADMIN')) {
return null; return null;
} }
@ -31,10 +30,12 @@ try {
} }
# Check Dotclear version # Check Dotclear version
if (!method_exists('dcUtils', 'versionsCompare') if (!method_exists('dcUtils', 'versionsCompare')
|| dcUtils::versionsCompare(DC_VERSION, $dc_min, '<', false)) { || dcUtils::versionsCompare(DC_VERSION, $dc_min, '<', false)) {
throw new Exception(sprintf( throw new Exception(sprintf(
'%s requires Dotclear %s', $mod_id, $dc_min '%s requires Dotclear %s',
$mod_id,
$dc_min
)); ));
} }
@ -49,4 +50,4 @@ try {
dcCore::app()->error->add($e->getMessage()); dcCore::app()->error->add($e->getMessage());
return false; return false;
} }

View file

@ -1,16 +1,15 @@
<?php <?php
/** /**
* @brief postExpired, a plugin for Dotclear 2 * @brief postExpired, a plugin for Dotclear 2
* *
* @package Dotclear * @package Dotclear
* @subpackage Plugin * @subpackage Plugin
* *
* @author Jean-Christian Denis and Contributors * @author Jean-Christian Denis and Contributors
* *
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
if (!defined('DC_RC_PATH')) { if (!defined('DC_RC_PATH')) {
return null; return null;
} }
@ -20,14 +19,14 @@ if (!defined('DC_RC_PATH')) {
* *
* This is saved into post_meta as meta_id value, * This is saved into post_meta as meta_id value,
* so this must be less than 255 caracters. * so this must be less than 255 caracters.
* *
* @param array $in Array of options * @param array $in Array of options
* @return string "Serialized" options * @return string "Serialized" options
*/ */
function encodePostExpired($in) function encodePostExpired($in)
{ {
$out = array(); $out = [];
foreach($in as $k => $v) { foreach ($in as $k => $v) {
$out[] = $k . '|' . $v; $out[] = $k . '|' . $v;
} }
@ -36,17 +35,17 @@ function encodePostExpired($in)
/** /**
* Decode Expired Date settings * Decode Expired Date settings
* *
* @param string $in "Serialized" options * @param string $in "Serialized" options
* @return array Array of options * @return array Array of options
*/ */
function decodePostExpired($in) function decodePostExpired($in)
{ {
$out = array(); $out = [];
foreach(explode(';', $in) as $v) { foreach (explode(';', $in) as $v) {
$v = explode('|', $v); $v = explode('|', $v);
$out[$v[0]] = $v[1]; $out[$v[0]] = $v[1];
} }
return $out; return $out;
} }

View file

@ -1,16 +1,15 @@
<?php <?php
/** /**
* @brief postExpired, a plugin for Dotclear 2 * @brief postExpired, a plugin for Dotclear 2
* *
* @package Dotclear * @package Dotclear
* @subpackage Plugin * @subpackage Plugin
* *
* @author Jean-Christian Denis and Contributors * @author Jean-Christian Denis and Contributors
* *
* @copyright Jean-Christian Denis * @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
if (!defined('DC_RC_PATH')) { if (!defined('DC_RC_PATH')) {
return null; return null;
} }
@ -23,7 +22,7 @@ __('Expired on');
__('This entry has no expiration date'); __('This entry has no expiration date');
# launch update only on public home page and feed # launch update only on public home page and feed
if (in_array(dcCore::app()->url->type, array('default', 'feed'))) { if (in_array(dcCore::app()->url->type, ['default', 'feed'])) {
dcCore::app()->addBehavior( dcCore::app()->addBehavior(
'publicBeforeDocumentV2', 'publicBeforeDocumentV2',
['publicBehaviorPostExpired', 'publicBeforeDocument'] ['publicBehaviorPostExpired', 'publicBeforeDocument']
@ -55,7 +54,6 @@ class publicBehaviorPostExpired
{ {
/** /**
* Check if there are expired dates * Check if there are expired dates
*
*/ */
public static function publicBeforeDocument() public static function publicBeforeDocument()
{ {
@ -67,7 +65,7 @@ class publicBehaviorPostExpired
'ON META.post_id = P.post_id ' . 'ON META.post_id = P.post_id ' .
"WHERE blog_id = '" . dcCore::app()->con->escape(dcCore::app()->blog->id) . "' " . "WHERE blog_id = '" . dcCore::app()->con->escape(dcCore::app()->blog->id) . "' " .
// Removed for quick compatibility with some plugins // Removed for quick compatibility with some plugins
//"AND P.post_type = 'post' " . //"AND P.post_type = 'post' " .
"AND META.meta_type = 'post_expired' " "AND META.meta_type = 'post_expired' "
); );
@ -84,18 +82,17 @@ class publicBehaviorPostExpired
# Loop through marked posts # Loop through marked posts
$updated = false; $updated = false;
while($posts->fetch()) { while ($posts->fetch()) {
# Decode meta record # Decode meta record
$post_expired = decodePostExpired($posts->meta_id); $post_expired = decodePostExpired($posts->meta_id);
# Check if post is outdated # Check if post is outdated
$now_tz = $now + dt::getTimeOffset($posts->post_tz, $now); $now_tz = $now + dt::getTimeOffset($posts->post_tz, $now);
$meta_tz = strtotime($post_expired['date']); $meta_tz = strtotime($post_expired['date']);
if ($now_tz > $meta_tz) { if ($now_tz > $meta_tz) {
# Delete meta for expired date # Delete meta for expired date
dcCore::app()->auth->sudo( dcCore::app()->auth->sudo(
array(dcCore::app()->meta, 'delPostMeta'), [dcCore::app()->meta, 'delPostMeta'],
$posts->post_id, $posts->post_id,
'post_expired' 'post_expired'
); );
@ -105,36 +102,40 @@ class publicBehaviorPostExpired
$post_cur->post_upddt = date('Y-m-d H:i:s', $now_tz); $post_cur->post_upddt = date('Y-m-d H:i:s', $now_tz);
# Loop through actions # Loop through actions
foreach($post_expired as $k => $v) { foreach ($post_expired as $k => $v) {
if (empty($v)) { if (empty($v)) {
continue; continue;
} }
# values are prefixed by "!" # values are prefixed by "!"
$v = (integer) substr($v, 1); $v = (int) substr($v, 1);
# Put value in post cursor # Put value in post cursor
switch($k) switch($k) {
{
case 'status': case 'status':
$post_cur->post_status = $v; $post_cur->post_status = $v;
break;
break;
case 'category': case 'category':
$post_cur->cat_id = $v ? $v : null; $post_cur->cat_id = $v ? $v : null;
break;
break;
case 'selected': case 'selected':
$post_cur->post_selected = $v; $post_cur->post_selected = $v;
break;
break;
case 'comment': case 'comment':
$post_cur->post_open_comment = $v; $post_cur->post_open_comment = $v;
break;
break;
case 'trackback': case 'trackback':
$post_cur->post_open_tb = $v; $post_cur->post_open_tb = $v;
break;
break;
} }
} }
@ -156,7 +157,7 @@ class publicBehaviorPostExpired
/** /**
* Extends posts record with expired date * Extends posts record with expired date
* *
* @param dcRecord $rs Post recordset * @param dcRecord $rs Post recordset
*/ */
public static function coreBlogGetPosts(dcRecord $rs) public static function coreBlogGetPosts(dcRecord $rs)
@ -174,7 +175,7 @@ class rsExtPostExpiredPublic extends rsExtPost
{ {
/** /**
* Retrieve expired date of a post * Retrieve expired date of a post
* *
* @param record $rs Post recordset * @param record $rs Post recordset
* @return string Expired date or null * @return string Expired date or null
*/ */
@ -183,15 +184,15 @@ class rsExtPostExpiredPublic extends rsExtPost
if (!$rs->postexpired[$rs->post_id]) { //memory if (!$rs->postexpired[$rs->post_id]) { //memory
$rs_date = $rs->core->meta->getMetadata([ $rs_date = $rs->core->meta->getMetadata([
'meta_type' => 'post_expired', 'meta_type' => 'post_expired',
'post_id'=> $rs->post_id, 'post_id' => $rs->post_id,
'limit'=> 1 'limit' => 1,
]); ]);
if ($rs_date->isEmpty()) { if ($rs_date->isEmpty()) {
return null; return null;
} }
$v = decodePostExpired($rs_date->meta_id); $v = decodePostExpired($rs_date->meta_id);
$rs->postexpired[$rs->post_id] = $v['date']; $rs->postexpired[$rs->post_id] = $v['date'];
} }
@ -208,48 +209,48 @@ class tplPostExpired
{ {
/** /**
* Template condition to check if there is an expired date * Template condition to check if there is an expired date
* *
* @param array $attr Block attributes * @param array $attr Block attributes
* @param string $content Block content * @param string $content Block content
*/ */
public static function EntryExpiredIf($attr, $content) public static function EntryExpiredIf($attr, $content)
{ {
$if = array(); $if = [];
$operator = isset($attr['operator']) ? $operator = isset($attr['operator']) ?
self::getOperator($attr['operator']) : '&&'; self::getOperator($attr['operator']) : '&&';
if (isset($attr['has_date'])) { if (isset($attr['has_date'])) {
$sign = (boolean) $attr['has_date'] ? '!' : '='; $sign = (bool) $attr['has_date'] ? '!' : '=';
$if[] = '(null ' . $sign . '== dcCore::app()->ctx->posts->postExpiredDate())'; $if[] = '(null ' . $sign . '== dcCore::app()->ctx->posts->postExpiredDate())';
} else { } else {
$if[] = '(null !== dcCore::app()->ctx->posts->postExpiredDate())'; $if[] = '(null !== dcCore::app()->ctx->posts->postExpiredDate())';
} }
return return
"<?php if(" . implode(' ' . $operator . ' ', $if) . ") : ?>\n" . '<?php if(' . implode(' ' . $operator . ' ', $if) . ") : ?>\n" .
$content . $content .
"<?php endif; ?>\n"; "<?php endif; ?>\n";
} }
/** /**
* Template for expired date * Template for expired date
* *
* @param array $attr Value attributes * @param array $attr Value attributes
*/ */
public static function EntryExpiredDate($attr) public static function EntryExpiredDate($attr)
{ {
$format = !empty($attr['format']) ? $format = !empty($attr['format']) ?
addslashes($attr['format']) : ''; addslashes($attr['format']) : '';
$f = dcCore::app()->tpl->getFilters($attr); $f = dcCore::app()->tpl->getFilters($attr);
if (!empty($attr['rfc822'])) { if (!empty($attr['rfc822'])) {
$res = sprintf($f, "dt::rfc822(strtotime(dcCore::app()->ctx->posts->postExpiredDate()),dcCore::app()->ctx->posts->post_tz)"); $res = sprintf($f, 'dt::rfc822(strtotime(dcCore::app()->ctx->posts->postExpiredDate()),dcCore::app()->ctx->posts->post_tz)');
} elseif (!empty($attr['iso8601'])) { } elseif (!empty($attr['iso8601'])) {
$res = sprintf($f, "dt::iso8601(strtotime(dcCore::app()->ctx->posts->postExpiredDate(),dcCore::app()->ctx->posts->post_tz)"); $res = sprintf($f, 'dt::iso8601(strtotime(dcCore::app()->ctx->posts->postExpiredDate(),dcCore::app()->ctx->posts->post_tz)');
} elseif ($format) { } elseif ($format) {
$res = sprintf($f, "dt::dt2str('" . $format . "',dcCore::app()->ctx->posts->postExpiredDate())"); $res = sprintf($f, "dt::dt2str('" . $format . "',dcCore::app()->ctx->posts->postExpiredDate())");
} else { } else {
$res = sprintf($f, "dt::dt2str(dcCore::app()->blog->settings->system->date_format,dcCore::app()->ctx->posts->postExpiredDate())"); $res = sprintf($f, 'dt::dt2str(dcCore::app()->blog->settings->system->date_format,dcCore::app()->ctx->posts->postExpiredDate())');
} }
return '<?php if (null !== dcCore::app()->ctx->posts->postExpiredDate()) { echo ' . $res . '; } ?>'; return '<?php if (null !== dcCore::app()->ctx->posts->postExpiredDate()) { echo ' . $res . '; } ?>';
@ -257,29 +258,30 @@ class tplPostExpired
/** /**
* Template for expired time * Template for expired time
* *
* @param array $attr Value attributes * @param array $attr Value attributes
*/ */
public static function EntryExpiredTime($attr) public static function EntryExpiredTime($attr)
{ {
return return
'<?php if (null !== dcCore::app()->ctx->posts->postExpiredDate()) { echo ' . sprintf( '<?php if (null !== dcCore::app()->ctx->posts->postExpiredDate()) { echo ' . sprintf(
dcCore::app()->tpl->getFilters($attr), "dt::dt2str(" . dcCore::app()->tpl->getFilters($attr),
(!empty($attr['format']) ? 'dt::dt2str(' .
"'" . addslashes($attr['format']) . "'" : "dcCore::app()->blog->settings->system->time_format" (
) . ",dcCore::app()->ctx->posts->postExpiredDate())" !empty($attr['format']) ?
"'" . addslashes($attr['format']) . "'" : 'dcCore::app()->blog->settings->system->time_format'
) . ',dcCore::app()->ctx->posts->postExpiredDate())'
) . '; } ?>'; ) . '; } ?>';
} }
/** /**
* Parse tempalte attributes oprerator * Parse tempalte attributes oprerator
* *
* @param string $op Operator * @param string $op Operator
*/ */
protected static function getOperator($op) protected static function getOperator($op)
{ {
switch (strtolower($op)) switch (strtolower($op)) {
{
case 'or': case 'or':
case '||': case '||':
return '||'; return '||';
@ -289,4 +291,4 @@ class tplPostExpired
return '&&'; return '&&';
} }
} }
} }

View file

@ -1,12 +1,13 @@
<?xml version="1.0"?>
<modules xmlns:da="http://dotaddict.org/da/"> <modules xmlns:da="http://dotaddict.org/da/">
<module id="postExpired"> <module id="postExpired">
<name>Billets périmés</name> <name>Expired entries</name>
<version>2022.04.27</version> <version>2022.11.12</version>
<author>Jean-Christian Denis and Contributors</author> <author>Jean-Christian Denis and Contributors</author>
<desc>Change entries options at a given date</desc> <desc>Change entries options at a given date</desc>
<file>https://github.com/JcDenis/postExpired/releases/download/v2022.04.27/plugin-postExpired.zip</file> <file>https://github.com/JcDenis/postExpired/releases/download/v2022.11.12/plugin-postExpired.zip</file>
<da:dcmin>2.121</da:dcmin> <da:dcmin>2.24</da:dcmin>
<da:details>https://plugins.dotaddict.org/dc2/details/postExpired</da:details> <da:details>https://plugins.dotaddict.org/dc2/details/postExpired</da:details>
<da:support>https://github.com/JcDenis/postExpired</da:support> <da:support>https://github.com/JcDenis/postExpired</da:support>
</module> </module>
</modules> </modules>

View file

@ -1,60 +0,0 @@
<?php
// Language: Français
// Module: postExpired - 2013.11.03
// Date: 2013-11-03 22:12:31
// Translated with dcTranslater - 2013.05.11
#_admin.php:100
#_admin.php:110
$GLOBALS['__l10n']['Expired entries'] = 'Billets périmés';
#_admin.php:101
$GLOBALS['__l10n']['Add expired date'] = 'Ajouter une date de péremption';
#_admin.php:111
$GLOBALS['__l10n']['Remove expired date'] = 'Retirer une date de péremption';
#_admin.php:139
$GLOBALS['__l10n']['Expired date'] = 'Date de péremption';
#_admin.php:209
$GLOBALS['__l10n']['Expired date added.'] = 'Date de péremption ajoutée.';
#_admin.php:222
$GLOBALS['__l10n']['Add expired date to this selection'] = 'Ajouter une date de péremtion à cette sélection';
#_admin.php:269
$GLOBALS['__l10n']['Expired date deleted.'] = 'Dtae de péremtion supprimé';
#_admin.php:370
$GLOBALS['__l10n']['On this date, change:'] = 'Á cette date, changer :';
#_admin.php:398
$GLOBALS['__l10n']['Selection:'] = 'Séléction :';
#_admin.php:409
$GLOBALS['__l10n']['Comments status:'] = 'Status des commentaires :';
#_admin.php:419
$GLOBALS['__l10n']['Trackbacks status:'] = 'Status des rétroliens :';
#_admin.php:440
#_admin.php:470
#_admin.php:485
#_admin.php:499
#_admin.php:513
$GLOBALS['__l10n']['Not changed'] = 'Inchangé';
#_admin.php:500
#_admin.php:514
$GLOBALS['__l10n']['Opened'] = 'Ouvert';
#_admin.php:501
#_admin.php:515
$GLOBALS['__l10n']['Closed'] = 'Fermé';
#_public.php:25
$GLOBALS['__l10n']['Expired on'] = 'Expire le';
#_public.php:26
$GLOBALS['__l10n']['This entry has no expiration date'] = 'Ce billet n\'a pas de date de péremption';