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
===========================================================
* Require Dotclear 2.27

View File

@ -1,25 +1,29 @@
# README
[![Release](https://img.shields.io/badge/release-1.5.1-a2cbe9.svg)](https://git.dotclear.watch/JcDenis/fac/releases)
![Date](https://img.shields.io/badge/date-2023.10.24-c44d58.svg)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.28-137bbb.svg)](https://fr.dotclear.org/download)
[![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.08.12-c44d58.svg)](https://git.dotclear.watch/JcDenis/fac/releases)
[![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)
[![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
* Dotclear 2.28
* PHP 8.1+
_fac_ requires:
* 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
* Dotclear superadmin to configure feeds formats
* Dotclear admin permissions to configure plugin
* Dotclear usage or contentadmin permissions to link feeds
## USAGE
@ -37,13 +41,12 @@ This plugins also supports pages from plugin "muppet".
## LINKS
* [License](https://git.dotclear.watch/JcDenis/fac/src/branch/master/LICENSE)
* [Packages & details](https://git.dotclear.watch/JcDenis/fac/releases) (or on [Dotaddict](https://plugins.dotaddict.org/dc2/details/fac))
* [Sources & contributions](https://git.dotclear.watch/JcDenis/fac) (or on [GitHub](https://github.com/JcDenis/fac))
* [Issues & security](https://git.dotclear.watch/JcDenis/fac/issues) (or on [GitHub](https://github.com/JcDenis/fac/issues))
* License : [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html)
* Source & contribution : [Gitea Page](https://git.dotclear.watch/JcDenis/fac) or [GitHub Page](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)
## CONTRIBUTORS
* Jean-Christian Denis (author)
* Jean-Christian Denis
You are welcome to contribute to this code.

View File

@ -1,30 +1,36 @@
<?php
/**
* @file
* @brief The plugin fac definition
* @ingroup fac
* @brief fac, a plugin for Dotclear 2
*
* @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 GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
* @copyright Jean-Christian Denis
* @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(
'Feed after content',
'Add RSS/Atom feeds after entries content',
'Jean-Christian Denis and Contributors',
'1.5.1',
'1.4',
[
'requires' => [['core', '2.28']],
'permissions' => 'My',
'settings' => ['blog' => '#params.' . basename(__DIR__) . '_params'],
'type' => 'plugin',
'support' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/issues',
'details' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/src/branch/master/README.md',
'repository' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/raw/branch/master/dcstore.xml',
'requires' => [['core', '2.27']],
'permissions' => dcCore::app()->auth->makePermissions([
dcAuth::PERMISSION_USAGE,
dcAuth::PERMISSION_CONTENT_ADMIN,
]),
'settings' => [
'blog' => '#params.' . basename(__DIR__) . '_params',
],
'type' => 'plugin',
'support' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/issues',
'details' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/src/branch/master/README.md',
'repository' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/raw/branch/master/dcstore.xml',
]
);

View File

@ -2,11 +2,11 @@
<modules xmlns:da="http://dotaddict.org/da/">
<module id="fac">
<name>Feed after content</name>
<version>1.5.1</version>
<version>1.4</version>
<author>Jean-Christian Denis and Contributors</author>
<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>
<da:dcmin>2.28</da:dcmin>
<file>https://git.dotclear.watch/JcDenis/fac/releases/download/v1.4/plugin-fac.zip</file>
<da:dcmin>2.27</da:dcmin>
<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>
</module>

View File

@ -1,10 +1,17 @@
<?php
/**
* @file
* @brief The plugin fac resources
* @ingroup fac
* @brief fac, a plugin for Dotclear 2
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
* @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
*/
\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
/**
* @file
* @brief The plugin fac resources
* @ingroup fac
* @brief fac, a plugin for Dotclear 2
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
* @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
*/
\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
/**
* @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);
namespace Dotclear\Plugin\fac;
use Dotclear\App;
use dcCore;
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
{
public static function init(): bool
@ -23,19 +26,21 @@ class Backend extends Process
public static function process(): bool
{
if (self::status()) {
App::behavior()->addBehaviors([
'adminBlogPreferencesFormV2' => BackendBehaviors::adminBlogPreferencesFormV2(...),
'adminBeforeBlogSettingsUpdate' => BackendBehaviors::adminBeforeBlogSettingsUpdate(...),
'adminPostHeaders' => BackendBehaviors::adminPostHeaders(...),
'adminPostFormItems' => BackendBehaviors::adminPostFormItems(...),
'adminAfterPostCreate' => BackendBehaviors::adminAfterPostSave(...),
'adminAfterPostUpdate' => BackendBehaviors::adminAfterPostSave(...),
'adminBeforePostDelete' => BackendBehaviors::adminBeforePostDelete(...),
'adminPostsActions' => BackendBehaviors::adminPostsActions(...),
]);
if (!self::status()) {
return false;
}
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
/**
* @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);
namespace Dotclear\Plugin\fac;
use ArrayObject;
use Dotclear\App;
use dcCore;
use dcSettings;
use Dotclear\Core\Backend\{
Notices,
Page
@ -29,22 +40,19 @@ use Dotclear\Helper\Html\Form\{
Submit,
Text
};
use Dotclear\Interface\Core\BlogSettingsInterface;
use Exception;
/**
* @brief fac backend behaviors class.
* @ingroup fac
*
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
* @ingroup DC_PLUGIN_FAC
* @brief Linked feed to entries - admin methods.
* @since 2.6
*/
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
{
@ -56,12 +64,12 @@ class BackendBehaviors
__('category pages') => 'category',
__('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) {
$types[sprintf(
__('"%s" pages from extension muppet'),
$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 = '';
$fac_public_tpltypes = json_decode($blog_settings->get(My::id())->get('public_tpltypes'), true);
@ -92,11 +100,11 @@ class BackendBehaviors
'<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.') .
'</p>';
if (App::auth()->isSuperAdmin()) {
echo '<p><a href="' . App::backend()->url()->get('admin.plugins', [
if (dcCore::app()->auth->isSuperAdmin()) {
echo '<p><a href="' . dcCore::app()->admin->url->get('admin.plugins', [
'module' => My::id(),
'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>';
}
@ -114,7 +122,7 @@ class BackendBehaviors
// defaultfeedtitle
(new Para())->items([
(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'),
// 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('public_tpltypes', json_encode($_POST['fac_public_tpltypes']));
@ -146,7 +154,7 @@ class BackendBehaviors
}
/**
* Add javascript (toggle).
* Add javascript (toggle)
*
* @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<string, array<string, mixed>> $sidebar_items Sidebar items
* @param null|MetaRecord $post Post record or null
* @param ArrayObject $main_items Main items
* @param ArrayObject $sidebar_items Sidebar items
* @param null|MetaRecord $post Post record or null
*/
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;
}
# Get existing linked feed
$fac_url = $fac_format = '';
if ($post) {
$rs = App::meta()->getMetadata([
$rs = dcCore::app()->meta->getMetadata([
'meta_type' => 'fac',
'post_id' => $post->f('post_id'),
'limit' => 1,
]);
$fac_url = $rs->isEmpty() ? '' : $rs->f('meta_id');
$rs = App::meta()->getMetadata([
$rs = dcCore::app()->meta->getMetadata([
'meta_type' => 'facformat',
'post_id' => $post->f('post_id'),
'limit' => 1,
@ -191,10 +199,10 @@ class BackendBehaviors
}
/**
* Save linked feed.
* Save linked feed
*
* @param Cursor $cur Current post Cursor
* @param int $post_id Post id
* @param Cursor $cur Current post Cursor
* @param integer $post_id Post id
*/
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
{
@ -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
{
if (!App::blog()->isDefined() || !My::settings()->get('active')) {
if (is_null(dcCore::app()->blog) || !My::settings()->get('active')) {
return;
}
$pa->addAction(
[__('Linked feed') => [__('Add feed') => 'fac_add']],
self::callbackAdd(...)
[self::class, 'callbackAdd']
);
if (!App::auth()->check(App::auth()->makePermissions([
App::auth()::PERMISSION_DELETE,
App::auth()::PERMISSION_CONTENT_ADMIN,
]), App::blog()->id())) {
if (!dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([
dcCore::app()->auth::PERMISSION_DELETE,
dcCore::app()->auth::PERMISSION_CONTENT_ADMIN,
]), dcCore::app()->blog->id)) {
return;
}
$pa->addAction(
[__('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 ArrayObject<string, mixed> $post _POST actions
* @param ActionsPosts $pa ActionsPosts instance
* @param ArrayObject $post _POST actions
*/
public static function callbackRemove(ActionsPosts $pa, ArrayObject $post): void
{
if (!App::blog()->isDefined()) {
if (is_null(dcCore::app()->blog)) {
return;
}
# No entry
@ -266,16 +274,16 @@ class BackendBehaviors
}
# No right
if (!App::auth()->check(App::auth()->makePermissions([
App::auth()::PERMISSION_DELETE,
App::auth()::PERMISSION_CONTENT_ADMIN,
]), App::blog()->id())) {
if (!dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([
dcCore::app()->auth::PERMISSION_DELETE,
dcCore::app()->auth::PERMISSION_CONTENT_ADMIN,
]), dcCore::app()->blog->id)) {
throw new Exception(__('No enough right'));
}
# Delete unused feed
foreach ($posts_ids as $post_id) {
self::delFeed((int) $post_id);
self::delFeed($post_id);
}
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 ArrayObject<string, mixed> $post _POST actions
* @param ActionsPosts $pa ActionsPosts instance
* @param ArrayObject $post _POST actions
*/
public static function callbackAdd(ActionsPosts $pa, ArrayObject $post): void
{
if (!App::blog()->isDefined()) {
if (is_null(dcCore::app()->blog)) {
return;
}
# No entry
@ -303,8 +311,8 @@ class BackendBehaviors
if (!empty($post['fac_url'])
&& !empty($post['fac_format'])) {
foreach ($posts_ids as $post_id) {
self::delFeed((int) $post_id);
self::addFeed((int) $post_id, $post);
self::delFeed($post_id);
self::addFeed($post_id, $post);
}
Notices::addSuccessNotice(__('Linked feed added.'));
@ -314,9 +322,9 @@ class BackendBehaviors
} else {
$pa->beginPage(
Page::breadcrumb([
Html::escapeHTML(App::blog()->name()) => '',
$pa->getCallerTitle() => $pa->getRedirection(true),
__('Linked feed to this selection') => '',
Html::escapeHTML(dcCore::app()->blog->name) => '',
$pa->getCallerTitle() => $pa->getRedirection(true),
__('Linked feed to this selection') => '',
])
);
@ -324,8 +332,7 @@ class BackendBehaviors
(new Form('fac_form'))->action($pa->getURI())->method('post')->fields([
(new Text('', $pa->getCheckboxes() . self::formFeed())),
(new Para())->items([
App::nonce()->formNonce(),
... $pa->hiddenFields(),
(new Text('', dcCore::app()->formNonce() . $pa->getHiddenFields())),
(new Hidden(['action'], 'fac_add')),
(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 $format Feed format
*
* @return string Feed form content
* @param string $url Feed URL
* @param string $format Feed format
* @return string Feed form content
*/
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 '';
}
@ -355,7 +361,7 @@ class BackendBehaviors
// fac_url
(new Para())->items([
(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
(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
{
if (!App::blog()->isDefined()) {
if (is_null(dcCore::app()->blog)) {
return [];
}
$formats = json_decode((string) My::settings()->get('formats'), true);
@ -383,29 +389,29 @@ class BackendBehaviors
$res = [];
foreach ($formats as $uid => $f) {
$res[(string) $f['name']] = (string) $uid;
$res[$f['name']] = $uid;
}
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
{
$post_id = (int) $post_id;
App::meta()->delPostMeta($post_id, 'fac');
App::meta()->delPostMeta($post_id, 'facformat');
dcCore::app()->meta->delPostMeta($post_id, 'fac');
dcCore::app()->meta->delPostMeta($post_id, 'facformat');
}
/**
* Add linked feed.
* Add linked feed
*
* @param int $post_id Post id
* @param array<string, mixed>|ArrayObject<string, mixed> $options Feed options
* @param integer $post_id Post id
* @param array|ArrayObject $options Feed options
*/
protected static function addFeed(int $post_id, $options): void
{
@ -416,12 +422,12 @@ class BackendBehaviors
$post_id = (int) $post_id;
App::meta()->setPostMeta(
dcCore::app()->meta->setPostMeta(
$post_id,
'fac',
$options['fac_url']
);
App::meta()->setPostMeta(
dcCore::app()->meta->setPostMeta(
$post_id,
'facformat',
$options['fac_format']

View File

@ -1,10 +1,20 @@
<?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);
namespace Dotclear\Plugin\fac;
use Dotclear\App;
use dcCore;
use Dotclear\Core\Process;
use Dotclear\Core\Backend\{
Notices,
@ -23,13 +33,6 @@ use Dotclear\Helper\Html\Form\{
};
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
{
public static function init(): bool
@ -43,12 +46,13 @@ class Config extends Process
return false;
}
if (!App::blog()->isDefined()) {
//nullsafe
if (is_null(dcCore::app()->blog)) {
return false;
}
$redir = empty($_REQUEST['redir']) ?
App::backend()->__get('list')->getURL() . '#plugins' : $_REQUEST['redir'];
dcCore::app()->admin->__get('list')->getURL() . '#plugins' : $_REQUEST['redir'];
# -- Get settings --
$s = My::settings();
@ -81,17 +85,17 @@ class Config extends Process
true
);
App::blog()->triggerBlog();
dcCore::app()->blog->triggerBlog();
Notices::addSuccessNotice(
__('Configuration successfully updated.')
);
App::backend()->url()->redirect(
dcCore::app()->admin->url->redirect(
'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) {
App::error()->add($e->getMessage());
dcCore::app()->error->add($e->getMessage());
}
}
@ -169,9 +173,6 @@ class Config extends Process
Page::helpBlock('fac');
}
/**
* @param array<string, string> $format
*/
private static function displayFacFormat(string $title, string $uid, array $format): void
{
echo
@ -185,7 +186,7 @@ class Config extends Process
(new Input([
'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'),
// dateformat
@ -194,7 +195,7 @@ class Config extends Process
(new Input([
'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'),
// dateformat //todo: use Number
@ -203,7 +204,7 @@ class Config extends Process
(new Input([
'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'),
]),
@ -215,7 +216,7 @@ class Config extends Process
(new Input([
'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(
__('Format can be:') .
@ -231,7 +232,7 @@ class Config extends Process
(new Input([
'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(
__('Format can be:') .
@ -247,7 +248,7 @@ class Config extends Process
(new Input([
'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'),
]),
@ -275,7 +276,7 @@ class Config extends Process
(new Input([
'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'),
]),
@ -303,7 +304,7 @@ class Config extends Process
(new Input([
'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'),
]),

View File

@ -1,23 +1,27 @@
<?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);
namespace Dotclear\Plugin\fac;
use Dotclear\App;
use context;
use dcCore;
use Dotclear\Core\Process;
use Dotclear\Helper\Date;
use Dotclear\Helper\Html\Html;
use Dotclear\Helper\Network\Feed\Reader;
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
{
public static function init(): bool
@ -27,31 +31,32 @@ class Frontend extends Process
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;
}
App::behavior()->addBehavior('publicEntryAfterContent', function ($___, $_____): void {
if (!App::blog()->isDefined()) {
dcCore::app()->addBehavior('publicEntryAfterContent', function (dcCore $core, context $_ctx): void {
//nullsafe
if (is_null(dcCore::app()->blog) || is_null(dcCore::app()->ctx)) {
return;
}
// Not a post
if (!App::frontend()->context()->exists('posts')) {
if (!dcCore::app()->ctx->exists('posts')) {
return;
}
// Not in page to show
$types = json_decode((string) My::settings()->get('public_tpltypes'), true);
if (!is_array($types)
|| !in_array(App::url()->type, $types)) {
|| !in_array(dcCore::app()->url->type, $types)) {
return;
}
// Get related feed
$fac_url = App::meta()->getMetadata([
$fac_url = dcCore::app()->meta->getMetadata([
'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,
]);
if ($fac_url->isEmpty()) {
@ -59,9 +64,9 @@ class Frontend extends Process
}
// Get related format
$fac_format = App::meta()->getMetadata([
$fac_format = dcCore::app()->meta->getMetadata([
'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,
]);
if ($fac_format->isEmpty()) {
@ -97,7 +102,7 @@ class Frontend extends Process
}
// 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 {
$feed = Reader::quickParse($fac_url->f('meta_id'), $cache);
@ -132,7 +137,7 @@ class Frontend extends Process
$feeddesc = '';
if (My::settings()->get('showfeeddesc')
&& '' != $feed->description) {
$feeddesc = '<p>' . App::frontend()->context()->global_filters(
$feeddesc = '<p>' . context::global_filters(
$feed->description,
['encode_xml', 'remove_html']
) . '</p>';
@ -141,7 +146,7 @@ class Frontend extends Process
// Date 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
$entrieslimit = abs((int) $format['lineslimit']);
@ -158,7 +163,7 @@ class Frontend extends Process
$date = Date::dt2str($dateformat, $item->pubdate);
// Entries title
$title = App::frontend()->context()->global_filters(
$title = context::global_filters(
str_replace(
[
'%D',
@ -174,13 +179,13 @@ class Frontend extends Process
$item->description,
$item->content,
],
(string) $format['linestitletext']
$format['linestitletext']
),
['remove_html', 'cut_string' => abs((int) $format['linestitlelength'])],
);
// Entries over title
$overtitle = App::frontend()->context()->global_filters(
$overtitle = context::global_filters(
str_replace(
[
'%D',
@ -196,7 +201,7 @@ class Frontend extends Process
$item->description,
$item->content,
],
(string) $format['linestitleover']
$format['linestitleover']
),
['remove_html', 'cut_string' => 350],
);
@ -206,7 +211,7 @@ class Frontend extends Process
if ($format['showlinesdescription']
&& '' != $item->description) {
$description = '<dd>' .
App::frontend()->context()->global_filters(
context::global_filters(
$item->description,
['remove_html' => (int) $format['linesdescriptionnohtml'], 'cut_string' => abs((int) $format['linesdescriptionlength'])]
) . '</dd>';
@ -217,7 +222,7 @@ class Frontend extends Process
if ($format['showlinescontent']
&& '' != $item->content) {
$content = '<dd>' .
App::frontend()->context()->global_filters(
context::global_filters(
$item->content,
['remove_html' => (int) $format['linescontentnohtml'], 'cut_string' => abs((int) $format['linescontentlength'])]
) . '</dd>';

View File

@ -1,20 +1,24 @@
<?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);
namespace Dotclear\Plugin\fac;
use Dotclear\App;
use dcCore;
use dcNamespace;
use Dotclear\Core\Process;
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
{
public static function init(): bool
@ -109,7 +113,7 @@ class Install extends Process
);
}
} catch (Exception $e) {
App::error()->add($e->getMessage());
dcCore::app()->error->add($e->getMessage());
}
return true;
@ -118,15 +122,15 @@ class Install extends Process
private static function growUp(): void
{
// 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', '<')) {
$record = App::con()->select(
'SELECT * FROM ' . App::con()->prefix() . App::blogWorkspace()::NS_TABLE_NAME . ' ' .
$record = dcCore::app()->con->select(
'SELECT * FROM ' . dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME . ' ' .
"WHERE setting_ns = 'fac' "
);
while ($record->fetch()) {
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'])) {
$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->update(
"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
/**
* @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);
namespace Dotclear\Plugin\fac;
@ -7,13 +17,8 @@ namespace Dotclear\Plugin\fac;
use Dotclear\Module\MyPlugin;
/**
* @brief fac My helper.
* @ingroup fac
*
* @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
* This module definitions.
*/
class My extends MyPlugin
{
// Use default permissions
}

View File

@ -1,19 +1,23 @@
<?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);
namespace Dotclear\Plugin\fac;
use dcCore;
use Dotclear\Core\Process;
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
{
public static function init(): bool
@ -23,7 +27,7 @@ class Uninstall extends Process
public static function process(): bool
{
if (!self::status()) {
if (!self::status() || !dcCore::app()->plugins->moduleExists('Uninstaller')) {
return false;
}