Compare commits

..

No commits in common. "master" and "v1.4" have entirely different histories.
master ... v1.4

13 changed files with 290 additions and 249 deletions

View File

@ -1,15 +1,3 @@
fac 1.5.1 - 2023.10.24
===========================================================
* Require Dotclear 2.28
* Require PHP 8.1+
* Code review
fac 1.5 - 2023.10.16
===========================================================
* Require Dotclear 2.28
* Require PHP 8.1+
* Upgrade to Dotclear 2.28
fac 1.4 - 2023.08.12 fac 1.4 - 2023.08.12
=========================================================== ===========================================================
* Require Dotclear 2.27 * Require Dotclear 2.27

View File

@ -1,25 +1,29 @@
# README # README
[![Release](https://img.shields.io/badge/release-1.5.1-a2cbe9.svg)](https://git.dotclear.watch/JcDenis/fac/releases) [![Release](https://img.shields.io/badge/release-1.4-a2cbe9.svg)](https://git.dotclear.watch/JcDenis/fac/releases)
![Date](https://img.shields.io/badge/date-2023.10.24-c44d58.svg) [![Date](https://img.shields.io/badge/date-2023.08.12-c44d58.svg)](https://git.dotclear.watch/JcDenis/fac/releases)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.28-137bbb.svg)](https://fr.dotclear.org/download) [![Dotclear](https://img.shields.io/badge/dotclear-v2.27-137bbb.svg)](https://fr.dotclear.org/download)
[![Dotaddict](https://img.shields.io/badge/dotaddict-official-9ac123.svg)](https://plugins.dotaddict.org/dc2/details/fac) [![Dotaddict](https://img.shields.io/badge/dotaddict-official-9ac123.svg)](https://plugins.dotaddict.org/dc2/details/fac)
[![License](https://img.shields.io/badge/license-GPL--2.0-ececec.svg)](https://git.dotclear.watch/JcDenis/fac/src/branch/master/LICENSE) [![License](https://img.shields.io/github/license/JcDenis/fac)](https://git.dotclear.watch/JcDenis/fac/blob/master/LICENSE)
## ABOUT ## WHAT IS FAC ?
_fac_ is a plugin for the open-source web publishing software called [Dotclear](https://www.dotclear.org). _fac_ "Feed After Content" is a plugin for the open-source
web publishing software called Dotclear.
> Add options to the sidebar of post edition page to link en extenal feed to the bottom of an entry. It add options to the sidebar of post edition page
to link en extenal feed to the bottom of an entry.
## REQUIREMENTS ## REQUIREMENTS
* Dotclear 2.28 _fac_ requires:
* PHP 8.1+
* superadmin to configure feeds formats
* admin permissions to configure plugin
* usage,contentadmin permissions to link feeds
* Dotclear 2.27
* PHP 7.4+
* A theme that contents behavior publicEntryAfterContent * A theme that contents behavior publicEntryAfterContent
* Dotclear superadmin to configure feeds formats
* Dotclear admin permissions to configure plugin
* Dotclear usage or contentadmin permissions to link feeds
## USAGE ## USAGE
@ -37,13 +41,12 @@ This plugins also supports pages from plugin "muppet".
## LINKS ## LINKS
* [License](https://git.dotclear.watch/JcDenis/fac/src/branch/master/LICENSE) * License : [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html)
* [Packages & details](https://git.dotclear.watch/JcDenis/fac/releases) (or on [Dotaddict](https://plugins.dotaddict.org/dc2/details/fac)) * Source & contribution : [Gitea Page](https://git.dotclear.watch/JcDenis/fac) or [GitHub Page](https://github.com/JcDenis/fac)
* [Sources & contributions](https://git.dotclear.watch/JcDenis/fac) (or on [GitHub](https://github.com/JcDenis/fac)) * Packages & details: [Gitea Page](https://git.dotclear.watch/JcDenis/fac/releases) or [Dotaddict Page](https://plugins.dotaddict.org/dc2/details/fac)
* [Issues & security](https://git.dotclear.watch/JcDenis/fac/issues) (or on [GitHub](https://github.com/JcDenis/fac/issues))
## CONTRIBUTORS ## CONTRIBUTORS
* Jean-Christian Denis (author) * Jean-Christian Denis
You are welcome to contribute to this code. You are welcome to contribute to this code.

View File

@ -1,27 +1,33 @@
<?php <?php
/** /**
* @file * @brief fac, a plugin for Dotclear 2
* @brief The plugin fac definition
* @ingroup fac
* *
* @defgroup fac Plugin fac. * @package Dotclear
* @subpackage Plugin
* *
* Add RSS/Atom feeds after entries content. * @author Jean-Christian Denis and Contributors
* *
* @author Jean-Christian Denis (author) * @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
*/ */
declare(strict_types=1); if (!defined('DC_RC_PATH')) {
return null;
}
$this->registerModule( $this->registerModule(
'Feed after content', 'Feed after content',
'Add RSS/Atom feeds after entries content', 'Add RSS/Atom feeds after entries content',
'Jean-Christian Denis and Contributors', 'Jean-Christian Denis and Contributors',
'1.5.1', '1.4',
[ [
'requires' => [['core', '2.28']], 'requires' => [['core', '2.27']],
'permissions' => 'My', 'permissions' => dcCore::app()->auth->makePermissions([
'settings' => ['blog' => '#params.' . basename(__DIR__) . '_params'], dcAuth::PERMISSION_USAGE,
dcAuth::PERMISSION_CONTENT_ADMIN,
]),
'settings' => [
'blog' => '#params.' . basename(__DIR__) . '_params',
],
'type' => 'plugin', 'type' => 'plugin',
'support' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/issues', 'support' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/issues',
'details' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/src/branch/master/README.md', 'details' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/src/branch/master/README.md',

View File

@ -2,11 +2,11 @@
<modules xmlns:da="http://dotaddict.org/da/"> <modules xmlns:da="http://dotaddict.org/da/">
<module id="fac"> <module id="fac">
<name>Feed after content</name> <name>Feed after content</name>
<version>1.5.1</version> <version>1.4</version>
<author>Jean-Christian Denis and Contributors</author> <author>Jean-Christian Denis and Contributors</author>
<desc>Add RSS/Atom feeds after entries content</desc> <desc>Add RSS/Atom feeds after entries content</desc>
<file>https://git.dotclear.watch/JcDenis/fac/releases/download/v1.5.1/plugin-fac.zip</file> <file>https://git.dotclear.watch/JcDenis/fac/releases/download/v1.4/plugin-fac.zip</file>
<da:dcmin>2.28</da:dcmin> <da:dcmin>2.27</da:dcmin>
<da:details>https://git.dotclear.watch/JcDenis/fac/src/branch/master/README.md</da:details> <da:details>https://git.dotclear.watch/JcDenis/fac/src/branch/master/README.md</da:details>
<da:support>https://git.dotclear.watch/JcDenis/fac/issues</da:support> <da:support>https://git.dotclear.watch/JcDenis/fac/issues</da:support>
</module> </module>

View File

@ -1,10 +1,17 @@
<?php <?php
/** /**
* @file * @brief fac, a plugin for Dotclear 2
* @brief The plugin fac resources
* @ingroup fac
* *
* @author Jean-Christian Denis * @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @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
*/ */
\Dotclear\App::backend()->resources()->set('help', 'fac', __DIR__ . '/help/fac.html'); if (!defined('DC_RC_PATH')) {
return;
}
dcCore::app()->resources['help']['fac'] = __DIR__ . '/help/fac.html';

View File

@ -1,10 +1,17 @@
<?php <?php
/** /**
* @file * @brief fac, a plugin for Dotclear 2
* @brief The plugin fac resources
* @ingroup fac
* *
* @author Jean-Christian Denis * @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @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
*/ */
\Dotclear\App::backend()->resources()->set('help', 'fac', __DIR__ . '/help/fac.html'); if (!defined('DC_RC_PATH')) {
return;
}
dcCore::app()->resources['help']['fac'] = __DIR__ . '/help/fac.html';

View File

@ -1,19 +1,22 @@
<?php <?php
/**
* @brief fac, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1); declare(strict_types=1);
namespace Dotclear\Plugin\fac; namespace Dotclear\Plugin\fac;
use Dotclear\App; use dcCore;
use Dotclear\Core\Process; use Dotclear\Core\Process;
/**
* @brief fac backend class.
* @ingroup fac
*
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Backend extends Process class Backend extends Process
{ {
public static function init(): bool public static function init(): bool
@ -23,19 +26,21 @@ class Backend extends Process
public static function process(): bool public static function process(): bool
{ {
if (self::status()) { if (!self::status()) {
App::behavior()->addBehaviors([ return false;
'adminBlogPreferencesFormV2' => BackendBehaviors::adminBlogPreferencesFormV2(...),
'adminBeforeBlogSettingsUpdate' => BackendBehaviors::adminBeforeBlogSettingsUpdate(...),
'adminPostHeaders' => BackendBehaviors::adminPostHeaders(...),
'adminPostFormItems' => BackendBehaviors::adminPostFormItems(...),
'adminAfterPostCreate' => BackendBehaviors::adminAfterPostSave(...),
'adminAfterPostUpdate' => BackendBehaviors::adminAfterPostSave(...),
'adminBeforePostDelete' => BackendBehaviors::adminBeforePostDelete(...),
'adminPostsActions' => BackendBehaviors::adminPostsActions(...),
]);
} }
return self::status(); dcCore::app()->addBehaviors([
'adminBlogPreferencesFormV2' => [BackendBehaviors::class, 'adminBlogPreferencesFormV2'],
'adminBeforeBlogSettingsUpdate' => [BackendBehaviors::class, 'adminBeforeBlogSettingsUpdate'],
'adminPostHeaders' => [BackendBehaviors::class, 'adminPostHeaders'],
'adminPostFormItems' => [BackendBehaviors::class, 'adminPostFormItems'],
'adminAfterPostCreate' => [BackendBehaviors::class, 'adminAfterPostSave'],
'adminAfterPostUpdate' => [BackendBehaviors::class, 'adminAfterPostSave'],
'adminBeforePostDelete' => [BackendBehaviors::class, 'adminBeforePostDelete'],
'adminPostsActions' => [BackendBehaviors::class, 'adminPostsActions'],
]);
return true;
} }
} }

View File

@ -1,11 +1,22 @@
<?php <?php
/**
* @brief fac, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1); declare(strict_types=1);
namespace Dotclear\Plugin\fac; namespace Dotclear\Plugin\fac;
use ArrayObject; use ArrayObject;
use Dotclear\App; use dcCore;
use dcSettings;
use Dotclear\Core\Backend\{ use Dotclear\Core\Backend\{
Notices, Notices,
Page Page
@ -29,22 +40,19 @@ use Dotclear\Helper\Html\Form\{
Submit, Submit,
Text Text
}; };
use Dotclear\Interface\Core\BlogSettingsInterface;
use Exception; use Exception;
/** /**
* @brief fac backend behaviors class. * @ingroup DC_PLUGIN_FAC
* @ingroup fac * @brief Linked feed to entries - admin methods.
* * @since 2.6
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class BackendBehaviors class BackendBehaviors
{ {
/** /**
* Get combos of types of supported public pages. * Get combos of types of supported public pages
* *
* @return array<string, string> List of post type and name * @return array List of post type and name
*/ */
public static function getPostsTypes(): array public static function getPostsTypes(): array
{ {
@ -56,12 +64,12 @@ class BackendBehaviors
__('category pages') => 'category', __('category pages') => 'category',
__('entries feed') => 'feed', __('entries feed') => 'feed',
]; ];
if (App::plugins()->getDefine('muppet')->isDefined() && class_exists('\muppet')) { if (dcCore::app()->plugins->getDefine('muppet')->isDefined() && class_exists('\muppet')) {
foreach (\muppet::getPostTypes() as $k => $v) { foreach (\muppet::getPostTypes() as $k => $v) {
$types[sprintf( $types[sprintf(
__('"%s" pages from extension muppet'), __('"%s" pages from extension muppet'),
$v['name'] $v['name']
)] = (string) $k; )] = $k;
} }
} }
@ -69,11 +77,11 @@ class BackendBehaviors
} }
/** /**
* Add settings to blog preference. * Add settings to blog preference
* *
* @param BlogSettingsInterface $blog_settings Blog settings instance * @param dcSettings $blog_settings dcSettings instance
*/ */
public static function adminBlogPreferencesFormV2(BlogSettingsInterface $blog_settings): void public static function adminBlogPreferencesFormV2(dcSettings $blog_settings): void
{ {
$lines = ''; $lines = '';
$fac_public_tpltypes = json_decode($blog_settings->get(My::id())->get('public_tpltypes'), true); $fac_public_tpltypes = json_decode($blog_settings->get(My::id())->get('public_tpltypes'), true);
@ -92,11 +100,11 @@ class BackendBehaviors
'<p class="form-note">' . '<p class="form-note">' .
__('To add feed to an entry edit this entry and put in sidebar the url of the feed and select a format.') . __('To add feed to an entry edit this entry and put in sidebar the url of the feed and select a format.') .
'</p>'; '</p>';
if (App::auth()->isSuperAdmin()) { if (dcCore::app()->auth->isSuperAdmin()) {
echo '<p><a href="' . App::backend()->url()->get('admin.plugins', [ echo '<p><a href="' . dcCore::app()->admin->url->get('admin.plugins', [
'module' => My::id(), 'module' => My::id(),
'conf' => 1, 'conf' => 1,
'redir' => App::backend()->url()->get('admin.blog.pref') . '#params.' . My::id() . '_params', 'redir' => dcCore::app()->admin->url->get('admin.blog.pref') . '#params.' . My::id() . '_params',
]) . '">' . __('Configure formats') . '</a></p>'; ]) . '">' . __('Configure formats') . '</a></p>';
} }
@ -114,7 +122,7 @@ class BackendBehaviors
// defaultfeedtitle // defaultfeedtitle
(new Para())->items([ (new Para())->items([
(new Label(__('Default title')))->for('fac_defaultfeedtitle'), (new Label(__('Default title')))->for('fac_defaultfeedtitle'),
(new Input('fac_defaultfeedtitle'))->size(70)->maxlength(255)->value((string) $blog_settings->get(My::id())->get('defaultfeedtitle')), (new Input('fac_defaultfeedtitle'))->size(70)->maxlenght(255)->value((string) $blog_settings->get(My::id())->get('defaultfeedtitle')),
]), ]),
(new Note())->text(__('Use %T to insert title of feed.'))->class('form-note'), (new Note())->text(__('Use %T to insert title of feed.'))->class('form-note'),
// showfeeddesc // showfeeddesc
@ -133,11 +141,11 @@ class BackendBehaviors
} }
/** /**
* Save blog settings. * Save blog settings
* *
* @param BlogSettingsInterface $blog_settings Blog settings instance * @param dcSettings $blog_settings dcSettings instance
*/ */
public static function adminBeforeBlogSettingsUpdate(BlogSettingsInterface $blog_settings): void public static function adminBeforeBlogSettingsUpdate(dcSettings $blog_settings): void
{ {
$blog_settings->get(My::id())->put('active', !empty($_POST['fac_active'])); $blog_settings->get(My::id())->put('active', !empty($_POST['fac_active']));
$blog_settings->get(My::id())->put('public_tpltypes', json_encode($_POST['fac_public_tpltypes'])); $blog_settings->get(My::id())->put('public_tpltypes', json_encode($_POST['fac_public_tpltypes']));
@ -146,7 +154,7 @@ class BackendBehaviors
} }
/** /**
* Add javascript (toggle). * Add javascript (toggle)
* *
* @return string HTML head * @return string HTML head
*/ */
@ -156,29 +164,29 @@ class BackendBehaviors
} }
/** /**
* Add form to post sidebar. * Add form to post sidebar
* *
* @param ArrayObject<string, string> $main_items Main items * @param ArrayObject $main_items Main items
* @param ArrayObject<string, array<string, mixed>> $sidebar_items Sidebar items * @param ArrayObject $sidebar_items Sidebar items
* @param null|MetaRecord $post Post record or null * @param null|MetaRecord $post Post record or null
*/ */
public static function adminPostFormItems(ArrayObject $main_items, ArrayObject $sidebar_items, ?MetaRecord $post): void public static function adminPostFormItems(ArrayObject $main_items, ArrayObject $sidebar_items, ?MetaRecord $post): void
{ {
if (!App::blog()->isDefined() || !My::settings()->get('active')) { if (is_null(dcCore::app()->blog) || !My::settings()->get('active')) {
return; return;
} }
# Get existing linked feed # Get existing linked feed
$fac_url = $fac_format = ''; $fac_url = $fac_format = '';
if ($post) { if ($post) {
$rs = App::meta()->getMetadata([ $rs = dcCore::app()->meta->getMetadata([
'meta_type' => 'fac', 'meta_type' => 'fac',
'post_id' => $post->f('post_id'), 'post_id' => $post->f('post_id'),
'limit' => 1, 'limit' => 1,
]); ]);
$fac_url = $rs->isEmpty() ? '' : $rs->f('meta_id'); $fac_url = $rs->isEmpty() ? '' : $rs->f('meta_id');
$rs = App::meta()->getMetadata([ $rs = dcCore::app()->meta->getMetadata([
'meta_type' => 'facformat', 'meta_type' => 'facformat',
'post_id' => $post->f('post_id'), 'post_id' => $post->f('post_id'),
'limit' => 1, 'limit' => 1,
@ -191,10 +199,10 @@ class BackendBehaviors
} }
/** /**
* Save linked feed. * Save linked feed
* *
* @param Cursor $cur Current post Cursor * @param Cursor $cur Current post Cursor
* @param int $post_id Post id * @param integer $post_id Post id
*/ */
public static function adminAfterPostSave(Cursor $cur, int $post_id): void public static function adminAfterPostSave(Cursor $cur, int $post_id): void
{ {
@ -211,9 +219,9 @@ class BackendBehaviors
} }
/** /**
* Delete linked feed on post edition. * Delete linked feed on post edition
* *
* @param int $post_id Post id * @param integer $post_id Post id
*/ */
public static function adminBeforePostDelete(int $post_id): void public static function adminBeforePostDelete(int $post_id): void
{ {
@ -221,42 +229,42 @@ class BackendBehaviors
} }
/** /**
* Add actions to posts page combo. * Add actions to posts page combo
* *
* @param ActionsPosts $pa ActionsPostsPage instance * @param ActionsPosts $pa ActionsPostsPage instance
*/ */
public static function adminPostsActions(ActionsPosts $pa): void public static function adminPostsActions(ActionsPosts $pa): void
{ {
if (!App::blog()->isDefined() || !My::settings()->get('active')) { if (is_null(dcCore::app()->blog) || !My::settings()->get('active')) {
return; return;
} }
$pa->addAction( $pa->addAction(
[__('Linked feed') => [__('Add feed') => 'fac_add']], [__('Linked feed') => [__('Add feed') => 'fac_add']],
self::callbackAdd(...) [self::class, 'callbackAdd']
); );
if (!App::auth()->check(App::auth()->makePermissions([ if (!dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([
App::auth()::PERMISSION_DELETE, dcCore::app()->auth::PERMISSION_DELETE,
App::auth()::PERMISSION_CONTENT_ADMIN, dcCore::app()->auth::PERMISSION_CONTENT_ADMIN,
]), App::blog()->id())) { ]), dcCore::app()->blog->id)) {
return; return;
} }
$pa->addAction( $pa->addAction(
[__('Linked feed') => [__('Remove feed') => 'fac_remove']], [__('Linked feed') => [__('Remove feed') => 'fac_remove']],
self::callbackRemove(...) [self::class, 'callbackRemove']
); );
} }
/** /**
* Posts actions callback to remove linked feed. * Posts actions callback to remove linked feed
* *
* @param ActionsPosts $pa ActionsPosts instance * @param ActionsPosts $pa ActionsPosts instance
* @param ArrayObject<string, mixed> $post _POST actions * @param ArrayObject $post _POST actions
*/ */
public static function callbackRemove(ActionsPosts $pa, ArrayObject $post): void public static function callbackRemove(ActionsPosts $pa, ArrayObject $post): void
{ {
if (!App::blog()->isDefined()) { if (is_null(dcCore::app()->blog)) {
return; return;
} }
# No entry # No entry
@ -266,16 +274,16 @@ class BackendBehaviors
} }
# No right # No right
if (!App::auth()->check(App::auth()->makePermissions([ if (!dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([
App::auth()::PERMISSION_DELETE, dcCore::app()->auth::PERMISSION_DELETE,
App::auth()::PERMISSION_CONTENT_ADMIN, dcCore::app()->auth::PERMISSION_CONTENT_ADMIN,
]), App::blog()->id())) { ]), dcCore::app()->blog->id)) {
throw new Exception(__('No enough right')); throw new Exception(__('No enough right'));
} }
# Delete unused feed # Delete unused feed
foreach ($posts_ids as $post_id) { foreach ($posts_ids as $post_id) {
self::delFeed((int) $post_id); self::delFeed($post_id);
} }
Notices::addSuccessNotice(__('Linked feed deleted.')); Notices::addSuccessNotice(__('Linked feed deleted.'));
@ -283,14 +291,14 @@ class BackendBehaviors
} }
/** /**
* Posts actions callback to add linked feed. * Posts actions callback to add linked feed
* *
* @param ActionsPosts $pa ActionsPosts instance * @param ActionsPosts $pa ActionsPosts instance
* @param ArrayObject<string, mixed> $post _POST actions * @param ArrayObject $post _POST actions
*/ */
public static function callbackAdd(ActionsPosts $pa, ArrayObject $post): void public static function callbackAdd(ActionsPosts $pa, ArrayObject $post): void
{ {
if (!App::blog()->isDefined()) { if (is_null(dcCore::app()->blog)) {
return; return;
} }
# No entry # No entry
@ -303,8 +311,8 @@ class BackendBehaviors
if (!empty($post['fac_url']) if (!empty($post['fac_url'])
&& !empty($post['fac_format'])) { && !empty($post['fac_format'])) {
foreach ($posts_ids as $post_id) { foreach ($posts_ids as $post_id) {
self::delFeed((int) $post_id); self::delFeed($post_id);
self::addFeed((int) $post_id, $post); self::addFeed($post_id, $post);
} }
Notices::addSuccessNotice(__('Linked feed added.')); Notices::addSuccessNotice(__('Linked feed added.'));
@ -314,7 +322,7 @@ class BackendBehaviors
} else { } else {
$pa->beginPage( $pa->beginPage(
Page::breadcrumb([ Page::breadcrumb([
Html::escapeHTML(App::blog()->name()) => '', Html::escapeHTML(dcCore::app()->blog->name) => '',
$pa->getCallerTitle() => $pa->getRedirection(true), $pa->getCallerTitle() => $pa->getRedirection(true),
__('Linked feed to this selection') => '', __('Linked feed to this selection') => '',
]) ])
@ -324,8 +332,7 @@ class BackendBehaviors
(new Form('fac_form'))->action($pa->getURI())->method('post')->fields([ (new Form('fac_form'))->action($pa->getURI())->method('post')->fields([
(new Text('', $pa->getCheckboxes() . self::formFeed())), (new Text('', $pa->getCheckboxes() . self::formFeed())),
(new Para())->items([ (new Para())->items([
App::nonce()->formNonce(), (new Text('', dcCore::app()->formNonce() . $pa->getHiddenFields())),
... $pa->hiddenFields(),
(new Hidden(['action'], 'fac_add')), (new Hidden(['action'], 'fac_add')),
(new Submit(['save']))->value(__('Save')), (new Submit(['save']))->value(__('Save')),
]), ]),
@ -336,16 +343,15 @@ class BackendBehaviors
} }
/** /**
* Linked feed form field. * Linked feed form field
* *
* @param string $url Feed URL * @param string $url Feed URL
* @param string $format Feed format * @param string $format Feed format
*
* @return string Feed form content * @return string Feed form content
*/ */
protected static function formFeed(string $url = '', string $format = ''): string protected static function formFeed(string $url = '', string $format = ''): string
{ {
if (!App::blog()->isDefined() || !My::settings()->get('active')) { if (is_null(dcCore::app()->blog) || !My::settings()->get('active')) {
return ''; return '';
} }
@ -355,7 +361,7 @@ class BackendBehaviors
// fac_url // fac_url
(new Para())->items([ (new Para())->items([
(new Label(__('Feed URL:')))->for('fac_url')->class('required'), (new Label(__('Feed URL:')))->for('fac_url')->class('required'),
(new Input('fac_url'))->size(60)->maxlength(255)->value($url), (new Input('fac_url'))->size(60)->maxlenght(255)->value($url),
]), ]),
// fac_format // fac_format
(new Para())->items([ (new Para())->items([
@ -367,13 +373,13 @@ class BackendBehaviors
} }
/** /**
* List of fac formats. * List of fac formats
* *
* @return array<string, string> List of fac formats * @return array List of fac formats
*/ */
protected static function comboFac(): array protected static function comboFac(): array
{ {
if (!App::blog()->isDefined()) { if (is_null(dcCore::app()->blog)) {
return []; return [];
} }
$formats = json_decode((string) My::settings()->get('formats'), true); $formats = json_decode((string) My::settings()->get('formats'), true);
@ -383,29 +389,29 @@ class BackendBehaviors
$res = []; $res = [];
foreach ($formats as $uid => $f) { foreach ($formats as $uid => $f) {
$res[(string) $f['name']] = (string) $uid; $res[$f['name']] = $uid;
} }
return $res; return $res;
} }
/** /**
* Delete linked feed. * Delete linked feed
* *
* @param int $post_id Post id * @param integer $post_id Post id
*/ */
protected static function delFeed(int $post_id): void protected static function delFeed(int $post_id): void
{ {
$post_id = (int) $post_id; $post_id = (int) $post_id;
App::meta()->delPostMeta($post_id, 'fac'); dcCore::app()->meta->delPostMeta($post_id, 'fac');
App::meta()->delPostMeta($post_id, 'facformat'); dcCore::app()->meta->delPostMeta($post_id, 'facformat');
} }
/** /**
* Add linked feed. * Add linked feed
* *
* @param int $post_id Post id * @param integer $post_id Post id
* @param array<string, mixed>|ArrayObject<string, mixed> $options Feed options * @param array|ArrayObject $options Feed options
*/ */
protected static function addFeed(int $post_id, $options): void protected static function addFeed(int $post_id, $options): void
{ {
@ -416,12 +422,12 @@ class BackendBehaviors
$post_id = (int) $post_id; $post_id = (int) $post_id;
App::meta()->setPostMeta( dcCore::app()->meta->setPostMeta(
$post_id, $post_id,
'fac', 'fac',
$options['fac_url'] $options['fac_url']
); );
App::meta()->setPostMeta( dcCore::app()->meta->setPostMeta(
$post_id, $post_id,
'facformat', 'facformat',
$options['fac_format'] $options['fac_format']

View File

@ -1,10 +1,20 @@
<?php <?php
/**
* @brief fac, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1); declare(strict_types=1);
namespace Dotclear\Plugin\fac; namespace Dotclear\Plugin\fac;
use Dotclear\App; use dcCore;
use Dotclear\Core\Process; use Dotclear\Core\Process;
use Dotclear\Core\Backend\{ use Dotclear\Core\Backend\{
Notices, Notices,
@ -23,13 +33,6 @@ use Dotclear\Helper\Html\Form\{
}; };
use Exception; use Exception;
/**
* @brief fac configuration class.
* @ingroup fac
*
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Config extends Process class Config extends Process
{ {
public static function init(): bool public static function init(): bool
@ -43,12 +46,13 @@ class Config extends Process
return false; return false;
} }
if (!App::blog()->isDefined()) { //nullsafe
if (is_null(dcCore::app()->blog)) {
return false; return false;
} }
$redir = empty($_REQUEST['redir']) ? $redir = empty($_REQUEST['redir']) ?
App::backend()->__get('list')->getURL() . '#plugins' : $_REQUEST['redir']; dcCore::app()->admin->__get('list')->getURL() . '#plugins' : $_REQUEST['redir'];
# -- Get settings -- # -- Get settings --
$s = My::settings(); $s = My::settings();
@ -81,17 +85,17 @@ class Config extends Process
true true
); );
App::blog()->triggerBlog(); dcCore::app()->blog->triggerBlog();
Notices::addSuccessNotice( Notices::addSuccessNotice(
__('Configuration successfully updated.') __('Configuration successfully updated.')
); );
App::backend()->url()->redirect( dcCore::app()->admin->url->redirect(
'admin.plugins', 'admin.plugins',
['module' => My::id(), 'conf' => 1, 'redir' => App::backend()->__get('list')->getRedir()] ['module' => My::id(), 'conf' => 1, 'redir' => dcCore::app()->admin->__get('list')->getRedir()]
); );
} catch (Exception $e) { } catch (Exception $e) {
App::error()->add($e->getMessage()); dcCore::app()->error->add($e->getMessage());
} }
} }
@ -169,9 +173,6 @@ class Config extends Process
Page::helpBlock('fac'); Page::helpBlock('fac');
} }
/**
* @param array<string, string> $format
*/
private static function displayFacFormat(string $title, string $uid, array $format): void private static function displayFacFormat(string $title, string $uid, array $format): void
{ {
echo echo
@ -185,7 +186,7 @@ class Config extends Process
(new Input([ (new Input([
'fac_formats[' . $uid . '][name]', 'fac_formats[' . $uid . '][name]',
'fac_formats_' . $uid . '_name', 'fac_formats_' . $uid . '_name',
]))->value(empty($format['name']) ? '' : $format['name'])->size(20)->maxlength(255)->class('maximal'), ]))->value(empty($format['name']) ? '' : $format['name'])->size(20)->maxlenght(255)->class('maximal'),
]), ]),
(new Note())->text(__('In order to remove a format, leave its name empty.'))->class('form-note'), (new Note())->text(__('In order to remove a format, leave its name empty.'))->class('form-note'),
// dateformat // dateformat
@ -194,7 +195,7 @@ class Config extends Process
(new Input([ (new Input([
'fac_formats[' . $uid . '][dateformat]', 'fac_formats[' . $uid . '][dateformat]',
'fac_formats_' . $uid . '_dateformat', 'fac_formats_' . $uid . '_dateformat',
]))->value(empty($format['dateformat']) ? '' : $format['dateformat'])->size(20)->maxlength(255)->class('maximal'), ]))->value(empty($format['dateformat']) ? '' : $format['dateformat'])->size(20)->maxlenght(255)->class('maximal'),
]), ]),
(new Note())->text(__('Use date format of Dotclear or leave empty to use default date format of blog.'))->class('form-note'), (new Note())->text(__('Use date format of Dotclear or leave empty to use default date format of blog.'))->class('form-note'),
// dateformat //todo: use Number // dateformat //todo: use Number
@ -203,7 +204,7 @@ class Config extends Process
(new Input([ (new Input([
'fac_formats[' . $uid . '][lineslimit]', 'fac_formats[' . $uid . '][lineslimit]',
'fac_formats_' . $uid . '_lineslimit', 'fac_formats_' . $uid . '_lineslimit',
]))->value(empty($format['lineslimit']) ? '' : $format['lineslimit'])->size(4)->maxlength(5), ]))->value(empty($format['lineslimit']) ? '' : $format['lineslimit'])->size(4)->maxlenght(5),
]), ]),
(new Note())->text(__('Leave lengh empty for no limit.'))->class('form-note'), (new Note())->text(__('Leave lengh empty for no limit.'))->class('form-note'),
]), ]),
@ -215,7 +216,7 @@ class Config extends Process
(new Input([ (new Input([
'fac_formats[' . $uid . '][linestitletext]', 'fac_formats[' . $uid . '][linestitletext]',
'fac_formats_' . $uid . '_linestitletext', 'fac_formats_' . $uid . '_linestitletext',
]))->value(empty($format['linestitletext']) ? '' : $format['linestitletext'])->size(20)->maxlength(255)->class('maximal'), ]))->value(empty($format['linestitletext']) ? '' : $format['linestitletext'])->size(20)->maxlenght(255)->class('maximal'),
]), ]),
(new Note())->text( (new Note())->text(
__('Format can be:') . __('Format can be:') .
@ -231,7 +232,7 @@ class Config extends Process
(new Input([ (new Input([
'fac_formats[' . $uid . '][linestitleover]', 'fac_formats[' . $uid . '][linestitleover]',
'fac_formats_' . $uid . '_linestitleover', 'fac_formats_' . $uid . '_linestitleover',
]))->value(empty($format['linestitleover']) ? '' : $format['linestitleover'])->size(20)->maxlength(255)->class('maximal'), ]))->value(empty($format['linestitleover']) ? '' : $format['linestitleover'])->size(20)->maxlenght(255)->class('maximal'),
]), ]),
(new Note())->text( (new Note())->text(
__('Format can be:') . __('Format can be:') .
@ -247,7 +248,7 @@ class Config extends Process
(new Input([ (new Input([
'fac_formats[' . $uid . '][linestitlelength]', 'fac_formats[' . $uid . '][linestitlelength]',
'fac_formats_' . $uid . '_linestitlelength', 'fac_formats_' . $uid . '_linestitlelength',
]))->value(empty($format['linestitlelength']) ? '' : $format['linestitlelength'])->size(4)->maxlength(5), ]))->value(empty($format['linestitlelength']) ? '' : $format['linestitlelength'])->size(4)->maxlenght(5),
]), ]),
(new Note())->text(__('Leave lengh empty for no limit.'))->class('form-note'), (new Note())->text(__('Leave lengh empty for no limit.'))->class('form-note'),
]), ]),
@ -275,7 +276,7 @@ class Config extends Process
(new Input([ (new Input([
'fac_formats[' . $uid . '][linesdescriptionlength]', 'fac_formats[' . $uid . '][linesdescriptionlength]',
'fac_formats_' . $uid . '_linesdescriptionlength', 'fac_formats_' . $uid . '_linesdescriptionlength',
]))->value(empty($format['linesdescriptionlength']) ? '' : $format['linesdescriptionlength'])->size(4)->maxlength(5), ]))->value(empty($format['linesdescriptionlength']) ? '' : $format['linesdescriptionlength'])->size(4)->maxlenght(5),
]), ]),
(new Note())->text(__('Leave lengh empty for no limit.'))->class('form-note'), (new Note())->text(__('Leave lengh empty for no limit.'))->class('form-note'),
]), ]),
@ -303,7 +304,7 @@ class Config extends Process
(new Input([ (new Input([
'fac_formats[' . $uid . '][linescontentlength]', 'fac_formats[' . $uid . '][linescontentlength]',
'fac_formats_' . $uid . '_linescontentlength', 'fac_formats_' . $uid . '_linescontentlength',
]))->value(empty($format['linescontentlength']) ? '' : $format['linescontentlength'])->size(4)->maxlength(5), ]))->value(empty($format['linescontentlength']) ? '' : $format['linescontentlength'])->size(4)->maxlenght(5),
]), ]),
(new Note())->text(__('Leave lengh empty for no limit.'))->class('form-note'), (new Note())->text(__('Leave lengh empty for no limit.'))->class('form-note'),
]), ]),

View File

@ -1,23 +1,27 @@
<?php <?php
/**
* @brief fac, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1); declare(strict_types=1);
namespace Dotclear\Plugin\fac; namespace Dotclear\Plugin\fac;
use Dotclear\App; use context;
use dcCore;
use Dotclear\Core\Process; use Dotclear\Core\Process;
use Dotclear\Helper\Date; use Dotclear\Helper\Date;
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
use Dotclear\Helper\Network\Feed\Reader; use Dotclear\Helper\Network\Feed\Reader;
use Exception; use Exception;
/**
* @brief fac frontend class.
* @ingroup fac
*
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Frontend extends Process class Frontend extends Process
{ {
public static function init(): bool public static function init(): bool
@ -27,31 +31,32 @@ class Frontend extends Process
public static function process(): bool public static function process(): bool
{ {
if (!self::status() || !App::blog()->isDefined() || !My::settings()->get('active')) { if (!self::status() || is_null(dcCore::app()->blog) || !My::settings()->get('active')) {
return false; return false;
} }
App::behavior()->addBehavior('publicEntryAfterContent', function ($___, $_____): void { dcCore::app()->addBehavior('publicEntryAfterContent', function (dcCore $core, context $_ctx): void {
if (!App::blog()->isDefined()) { //nullsafe
if (is_null(dcCore::app()->blog) || is_null(dcCore::app()->ctx)) {
return; return;
} }
// Not a post // Not a post
if (!App::frontend()->context()->exists('posts')) { if (!dcCore::app()->ctx->exists('posts')) {
return; return;
} }
// Not in page to show // Not in page to show
$types = json_decode((string) My::settings()->get('public_tpltypes'), true); $types = json_decode((string) My::settings()->get('public_tpltypes'), true);
if (!is_array($types) if (!is_array($types)
|| !in_array(App::url()->type, $types)) { || !in_array(dcCore::app()->url->type, $types)) {
return; return;
} }
// Get related feed // Get related feed
$fac_url = App::meta()->getMetadata([ $fac_url = dcCore::app()->meta->getMetadata([
'meta_type' => 'fac', 'meta_type' => 'fac',
'post_id' => App::frontend()->context()->__get('posts')->f('post_id'), 'post_id' => dcCore::app()->ctx->__get('posts')->f('post_id'),
'limit' => 1, 'limit' => 1,
]); ]);
if ($fac_url->isEmpty()) { if ($fac_url->isEmpty()) {
@ -59,9 +64,9 @@ class Frontend extends Process
} }
// Get related format // Get related format
$fac_format = App::meta()->getMetadata([ $fac_format = dcCore::app()->meta->getMetadata([
'meta_type' => 'facformat', 'meta_type' => 'facformat',
'post_id' => App::frontend()->context()->__get('posts')->f('post_id'), 'post_id' => dcCore::app()->ctx->__get('posts')->f('post_id'),
'limit' => 1, 'limit' => 1,
]); ]);
if ($fac_format->isEmpty()) { if ($fac_format->isEmpty()) {
@ -97,7 +102,7 @@ class Frontend extends Process
} }
// Read feed url // Read feed url
$cache = is_dir(App::config()->cacheRoot() . '/fac') ? App::config()->cacheRoot() . '/fac' : null; $cache = is_dir(DC_TPL_CACHE . '/fac') ? DC_TPL_CACHE . '/fac' : null;
try { try {
$feed = Reader::quickParse($fac_url->f('meta_id'), $cache); $feed = Reader::quickParse($fac_url->f('meta_id'), $cache);
@ -132,7 +137,7 @@ class Frontend extends Process
$feeddesc = ''; $feeddesc = '';
if (My::settings()->get('showfeeddesc') if (My::settings()->get('showfeeddesc')
&& '' != $feed->description) { && '' != $feed->description) {
$feeddesc = '<p>' . App::frontend()->context()->global_filters( $feeddesc = '<p>' . context::global_filters(
$feed->description, $feed->description,
['encode_xml', 'remove_html'] ['encode_xml', 'remove_html']
) . '</p>'; ) . '</p>';
@ -141,7 +146,7 @@ class Frontend extends Process
// Date format // Date format
$dateformat = '' != $format['dateformat'] ? $dateformat = '' != $format['dateformat'] ?
$format['dateformat'] : $format['dateformat'] :
App::blog()->settings()->get('system')->get('date_format') . ',' . App::blog()->settings()->get('system')->get('time_format'); dcCore::app()->blog->settings->get('system')->get('date_format') . ',' . dcCore::app()->blog->settings->get('system')->get('time_format');
// Enrties limit // Enrties limit
$entrieslimit = abs((int) $format['lineslimit']); $entrieslimit = abs((int) $format['lineslimit']);
@ -158,7 +163,7 @@ class Frontend extends Process
$date = Date::dt2str($dateformat, $item->pubdate); $date = Date::dt2str($dateformat, $item->pubdate);
// Entries title // Entries title
$title = App::frontend()->context()->global_filters( $title = context::global_filters(
str_replace( str_replace(
[ [
'%D', '%D',
@ -174,13 +179,13 @@ class Frontend extends Process
$item->description, $item->description,
$item->content, $item->content,
], ],
(string) $format['linestitletext'] $format['linestitletext']
), ),
['remove_html', 'cut_string' => abs((int) $format['linestitlelength'])], ['remove_html', 'cut_string' => abs((int) $format['linestitlelength'])],
); );
// Entries over title // Entries over title
$overtitle = App::frontend()->context()->global_filters( $overtitle = context::global_filters(
str_replace( str_replace(
[ [
'%D', '%D',
@ -196,7 +201,7 @@ class Frontend extends Process
$item->description, $item->description,
$item->content, $item->content,
], ],
(string) $format['linestitleover'] $format['linestitleover']
), ),
['remove_html', 'cut_string' => 350], ['remove_html', 'cut_string' => 350],
); );
@ -206,7 +211,7 @@ class Frontend extends Process
if ($format['showlinesdescription'] if ($format['showlinesdescription']
&& '' != $item->description) { && '' != $item->description) {
$description = '<dd>' . $description = '<dd>' .
App::frontend()->context()->global_filters( context::global_filters(
$item->description, $item->description,
['remove_html' => (int) $format['linesdescriptionnohtml'], 'cut_string' => abs((int) $format['linesdescriptionlength'])] ['remove_html' => (int) $format['linesdescriptionnohtml'], 'cut_string' => abs((int) $format['linesdescriptionlength'])]
) . '</dd>'; ) . '</dd>';
@ -217,7 +222,7 @@ class Frontend extends Process
if ($format['showlinescontent'] if ($format['showlinescontent']
&& '' != $item->content) { && '' != $item->content) {
$content = '<dd>' . $content = '<dd>' .
App::frontend()->context()->global_filters( context::global_filters(
$item->content, $item->content,
['remove_html' => (int) $format['linescontentnohtml'], 'cut_string' => abs((int) $format['linescontentlength'])] ['remove_html' => (int) $format['linescontentnohtml'], 'cut_string' => abs((int) $format['linescontentlength'])]
) . '</dd>'; ) . '</dd>';

View File

@ -1,20 +1,24 @@
<?php <?php
/**
* @brief fac, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1); declare(strict_types=1);
namespace Dotclear\Plugin\fac; namespace Dotclear\Plugin\fac;
use Dotclear\App; use dcCore;
use dcNamespace;
use Dotclear\Core\Process; use Dotclear\Core\Process;
use Exception; use Exception;
/**
* @brief fac installation class.
* @ingroup fac
*
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Install extends Process class Install extends Process
{ {
public static function init(): bool public static function init(): bool
@ -109,7 +113,7 @@ class Install extends Process
); );
} }
} catch (Exception $e) { } catch (Exception $e) {
App::error()->add($e->getMessage()); dcCore::app()->error->add($e->getMessage());
} }
return true; return true;
@ -118,15 +122,15 @@ class Install extends Process
private static function growUp(): void private static function growUp(): void
{ {
// version < 1.0 : upgrade settings id and ns and array // version < 1.0 : upgrade settings id and ns and array
$current = App::version()->getVersion(My::id()); $current = dcCore::app()->getVersion(My::id());
if ($current && version_compare($current, '1.0', '<')) { if ($current && version_compare($current, '1.0', '<')) {
$record = App::con()->select( $record = dcCore::app()->con->select(
'SELECT * FROM ' . App::con()->prefix() . App::blogWorkspace()::NS_TABLE_NAME . ' ' . 'SELECT * FROM ' . dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME . ' ' .
"WHERE setting_ns = 'fac' " "WHERE setting_ns = 'fac' "
); );
while ($record->fetch()) { while ($record->fetch()) {
if (preg_match('/^fac_(.*?)$/', $record->f('setting_id'), $match)) { if (preg_match('/^fac_(.*?)$/', $record->f('setting_id'), $match)) {
$cur = App::blogWorkspace()->openBlogWorkspaceCursor(); $cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME);
if (in_array($record->f('setting_id'), ['fac_public_tpltypes', 'fac_formats'])) { if (in_array($record->f('setting_id'), ['fac_public_tpltypes', 'fac_formats'])) {
$cur->setField('setting_value', json_encode(@unserialize($record->f('setting_value')))); $cur->setField('setting_value', json_encode(@unserialize($record->f('setting_value'))));
} }
@ -134,7 +138,7 @@ class Install extends Process
$cur->SetField('setting_ns', My::id()); $cur->SetField('setting_ns', My::id());
$cur->update( $cur->update(
"WHERE setting_id = '" . $record->f('setting_id') . "' and setting_ns = 'fac' " . "WHERE setting_id = '" . $record->f('setting_id') . "' and setting_ns = 'fac' " .
'AND blog_id ' . (null === $record->f('blog_id') ? 'IS NULL ' : ("= '" . App::con()->escapeStr($record->f('blog_id')) . "' ")) 'AND blog_id ' . (null === $record->f('blog_id') ? 'IS NULL ' : ("= '" . dcCore::app()->con->escapeStr($record->f('blog_id')) . "' "))
); );
} }
} }

View File

@ -1,5 +1,15 @@
<?php <?php
/**
* @brief fac, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1); declare(strict_types=1);
namespace Dotclear\Plugin\fac; namespace Dotclear\Plugin\fac;
@ -7,13 +17,8 @@ namespace Dotclear\Plugin\fac;
use Dotclear\Module\MyPlugin; use Dotclear\Module\MyPlugin;
/** /**
* @brief fac My helper. * This module definitions.
* @ingroup fac
*
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class My extends MyPlugin class My extends MyPlugin
{ {
// Use default permissions
} }

View File

@ -1,19 +1,23 @@
<?php <?php
/**
* @brief fac, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1); declare(strict_types=1);
namespace Dotclear\Plugin\fac; namespace Dotclear\Plugin\fac;
use dcCore;
use Dotclear\Core\Process; use Dotclear\Core\Process;
use Dotclear\Plugin\Uninstaller\Uninstaller; use Dotclear\Plugin\Uninstaller\Uninstaller;
/**
* @brief fac uninstall class.
* @ingroup fac
*
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
class Uninstall extends Process class Uninstall extends Process
{ {
public static function init(): bool public static function init(): bool
@ -23,7 +27,7 @@ class Uninstall extends Process
public static function process(): bool public static function process(): bool
{ {
if (!self::status()) { if (!self::status() || !dcCore::app()->plugins->moduleExists('Uninstaller')) {
return false; return false;
} }