Compare commits

..

12 Commits

33 changed files with 903 additions and 937 deletions

View File

@ -1,3 +1,29 @@
zoneclearFeedServer 2023.11.04
===========================================================
* Require Dotclear 2.28
* Require PHP 8.1
* Code review (phpstan)
zoneclearFeedServer 2023.10.18
===========================================================
* Require Dotclear 2.28
* Require PHP 8.1
* Upgrade plugin activityReport
zoneclearFeedServer 2023.10.14
===========================================================
* Require Dotclear 2.28
* Require PHP 8.1
* Upgrade to Dotclear 2.28
zoneclearFeedServer 2023.08.20
===========================================================
* Require Dotclear 2.27
* Require PHP 8.1
* Change settings to super admin only
* Fix get feed tags
* Fix per blog settings
zoneclearFeedServer 2023.08.16 zoneclearFeedServer 2023.08.16
=========================================================== ===========================================================
* Require Dotclear 2.27 * Require Dotclear 2.27

View File

@ -1,33 +1,30 @@
# README # README
[![Release](https://img.shields.io/badge/release-2023.08.16-a2cbe9.svg)](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/releases) [![Release](https://img.shields.io/badge/release-2023.11.04-a2cbe9.svg)](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/releases)
[![Date](https://img.shields.io/badge/date-2023.08.16-c44d58.svg)](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/releases) ![Date](https://img.shields.io/badge/date-2023.11.04-c44d58.svg)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.27-137bbb.svg)](https://fr.dotclear.org/download) [![Dotclear](https://img.shields.io/badge/dotclear-v2.28-137bbb.svg)](https://fr.dotclear.org/download)
[![Dotaddict](https://img.shields.io/badge/dotaddict-official-9ac123.svg)](https://plugins.dotaddict.org/dc2/details/zoneclearFeedServer) [![Dotaddict](https://img.shields.io/badge/dotaddict-official-9ac123.svg)](https://plugins.dotaddict.org/dc2/details/zoneclearFeedServer)
[![License](https://img.shields.io/badge/license-GPL--2.0-676e78.svg)](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/blob/master/LICENSE) [![License](https://img.shields.io/badge/license-GPL--2.0-ececec.svg)](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/src/branch/master/LICENSE)
## WHAT IS ZONECLEARFEEDSERVER ? ## ABOUT
"zoneclear Feeds server" is a plugin for the open-source _zoneclearFeedServer_ is a plugin for the open-source web publishing software called [Dotclear](https://www.dotclear.org).
web publishing software called Dotclear.
It mix your blog with a feeds planet. > Mix your blog with a feeds planet
## REQUIREMENTS ## REQUIREMENTS
_zoneclearFeedServer_ requires: * Dotclear 2.28
* super admin permission for plugin and services configuration
* admin permission to manage feeds
* Dotclear 2.27
* PHP 8.1 * PHP 8.1
* Dotclear super admin permissions for plugin and services configuration
* Dotclear admin permissions to manage feeds
## USAGE ## USAGE
First install zoneclearFeedServer, manualy from a zip package or from First install _zoneclearFeedServer_, manualy from a zip package or from
Dotaddict repository. (See Dotclear's documentation to know how do this) Dotaddict repository. (See Dotclear's documentation to know how do this)
Go to ''plugins manager'', expand _zoneclearFeedServer_ information then Go to ''plugins manager'', expand ''Feed server'' information then
go to ''configure plugin'', fill in form. go to ''configure plugin'', fill in form.
Once it's done you can manage your feeds from menu Once it's done you can manage your feeds from menu
@ -35,10 +32,11 @@ Once it's done you can manage your feeds from menu
## LINKS ## LINKS
* License : [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html) * [License](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/src/branch/master/LICENSE)
* Source & contribution : [Gitea Page](https://git.dotclear.watch/JcDenis/zoneclearFeedServer) or [GitHub Page](https://github.com/JcDenis/zoneclearFeedServer) * [Packages & details](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/releases) (or on [Dotaddict](https://plugins.dotaddict.org/dc2/details/zoneclearFeedServer))
* Packages & details: [Gitea Page](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/releases) or [Dotaddict Page](https://plugins.dotaddict.org/dc2/details/zoneclearFeedServer) * [Sources & contributions](https://git.dotclear.watch/JcDenis/zoneclearFeedServer) (or on [GitHub](https://github.com/JcDenis/zoneclearFeedServer))
* Discussion & Help : [Dotclear Forum](http://forum.dotclear.org/viewtopic.php?pid=331158) * [Issues & security](https://git.dotclear.watch/JcDenis/zoneclearFeedServer/issues) (or on [GitHub](https://github.com/JcDenis/zoneclearFeedServer/issues))
* [Discussion & Help](http://forum.dotclear.org/viewtopic.php?pid=331158)
## CONTRIBUTORS ## CONTRIBUTORS

View File

@ -1,35 +1,31 @@
<?php <?php
/** /**
* @brief zoneclearFeedServer, a plugin for Dotclear 2 * @file
* @brief The plugin zoneclearFeedServer definition
* @ingroup zoneclearFeedServer
* *
* @package Dotclear * @defgroup zoneclearFeedServer Plugin zoneclearFeedServer.
* @subpackage Plugin
* *
* @author Jean-Christian Denis, BG, Pierre Van Glabeke * Mix your blog with a feeds planet.
* *
* @copyright Jean-Christian Denis * @author Jean-Christian Denis (author)
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html * @author Pierre Van Glabeke
* @author BG
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
if (!defined('DC_RC_PATH')) { declare(strict_types=1);
return null;
}
$this->registerModule( $this->registerModule(
'Feeds server', 'Feeds server',
'Mix your blog with a feeds planet', 'Mix your blog with a feeds planet',
'Jean-Christian Denis, BG, Pierre Van Glabeke', 'Jean-Christian Denis, BG, Pierre Van Glabeke',
'2023.08.16', '2023.11.04',
[ [
'requires' => [ 'requires' => [['core', '2.28']],
['php', '8.1'], 'permissions' => 'My',
['core', '2.27'], 'type' => 'plugin',
], 'support' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/issues',
'permissions' => dcCore::app()->auth->makePermissions([ 'details' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/src/branch/master/README.md',
dcCore::app()->auth::PERMISSION_CONTENT_ADMIN, 'repository' => 'https://git.dotclear.watch/JcDenis/' . basename(__DIR__) . '/raw/branch/master/dcstore.xml',
]),
'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

@ -1,20 +0,0 @@
<?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_RC_PATH')) {
return null;
}
class initZoneclearFeedServer
{
public const TABLE_NAME = 'zc_feed';
}

View File

@ -5,6 +5,8 @@
# By Olivier Meunier and contributors # By Olivier Meunier and contributors
# Licensed under the GPL version 2.0 license # Licensed under the GPL version 2.0 license
use Dotclear\App;
$opts = getopt('d:c:b:u:h'); $opts = getopt('d:c:b:u:h');
function zchelp(string|int $status = 0): void function zchelp(string|int $status = 0): void
@ -69,18 +71,18 @@ unset($blog_id);
require $dc_root . '/inc/prepend.php'; require $dc_root . '/inc/prepend.php';
unset($dc_root); unset($dc_root);
dcCore::app()->setBlog(is_string(DC_BLOG_ID) ? DC_BLOG_ID : ''); App::blog()->loadFromBlog(is_string(DC_BLOG_ID) ? DC_BLOG_ID : '');
if (is_null(dcCore::app()->blog) || dcCore::app()->blog->id == null) { if (!App::blog()->isDefined() || '' == App::blog()->id()) {
fwrite(STDERR, "Blog is not defined\n"); fwrite(STDERR, "Blog is not defined\n");
exit(1); exit(1);
} }
if (!isset($opts['u']) || !dcCore::app()->auth->checkUser(is_string($opts['u']) ? $opts['u'] : '')) { if (!isset($opts['u']) || !App::auth()->checkUser(is_string($opts['u']) ? $opts['u'] : '')) {
fwrite(STDERR, "Unable to set user\n"); fwrite(STDERR, "Unable to set user\n");
exit(1); exit(1);
} }
dcCore::app()->plugins->loadModules(DC_PLUGINS_ROOT); App::plugins()->loadModules(DC_PLUGINS_ROOT);
try { try {
$zc = Dotclear\Plugin\zoneclearFeedServer\ZoneclearFeedServer::instance(); $zc = Dotclear\Plugin\zoneclearFeedServer\ZoneclearFeedServer::instance();

View File

@ -2,11 +2,11 @@
<modules xmlns:da="http://dotaddict.org/da/"> <modules xmlns:da="http://dotaddict.org/da/">
<module id="zoneclearFeedServer"> <module id="zoneclearFeedServer">
<name>Feeds server</name> <name>Feeds server</name>
<version>2023.08.16</version> <version>2023.11.04</version>
<author>Jean-Christian Denis, BG, Pierre Van Glabeke</author> <author>Jean-Christian Denis, BG, Pierre Van Glabeke</author>
<desc>Mix your blog with a feeds planet</desc> <desc>Mix your blog with a feeds planet</desc>
<file>https://git.dotclear.watch/JcDenis/zoneclearFeedServer/releases/download/v2023.08.16/plugin-zoneclearFeedServer.zip</file> <file>https://git.dotclear.watch/JcDenis/zoneclearFeedServer/releases/download/v2023.11.04/plugin-zoneclearFeedServer.zip</file>
<da:dcmin>2.27</da:dcmin> <da:dcmin>2.28</da:dcmin>
<da:details>https://git.dotclear.watch/JcDenis/zoneclearFeedServer/src/branch/master/README.md</da:details> <da:details>https://git.dotclear.watch/JcDenis/zoneclearFeedServer/src/branch/master/README.md</da:details>
<da:support>https://git.dotclear.watch/JcDenis/zoneclearFeedServer/issues</da:support> <da:support>https://git.dotclear.watch/JcDenis/zoneclearFeedServer/issues</da:support>
</module> </module>

View File

@ -1,20 +1,11 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Core\Process;
use Dotclear\Database\Cursor; use Dotclear\Database\Cursor;
use Dotclear\Plugin\activityReport\{ use Dotclear\Plugin\activityReport\{
Action, Action,
@ -23,12 +14,27 @@ use Dotclear\Plugin\activityReport\{
}; };
/** /**
* @brief zoneclearFeedServer plugin activityReport class.
* @ingroup zoneclearFeedServer
*
* Add feeds actions to the plugin activity report. * Add feeds actions to the plugin activity report.
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class ActivityReportActions class ActivityReportAction extends Process
{ {
public static function init(): void public static function init(): bool
{ {
return self::status(true);
}
public static function process(): bool
{
if (!self::status()) {
return false;
}
$group = new Group(My::id(), My::name()); $group = new Group(My::id(), My::name());
$group->add(new Action( $group->add(new Action(
@ -37,7 +43,7 @@ class ActivityReportActions
__('Feed named "%s" point to "%s" has been updated by "%s"'), __('Feed named "%s" point to "%s" has been updated by "%s"'),
'zoneclearFeedServerAfterUpdateFeed', 'zoneclearFeedServerAfterUpdateFeed',
function (Cursor $cur, int $id): void { function (Cursor $cur, int $id): void {
$user = dcCore::app()->auth->getInfo('user_cn'); $user = App::auth()->getInfo('user_cn');
if (!is_string($user)) { if (!is_string($user)) {
return; return;
} }
@ -64,7 +70,7 @@ class ActivityReportActions
__('A new feed named "%s" point to "%s" was added by "%s"'), __('A new feed named "%s" point to "%s" was added by "%s"'),
'zoneclearFeedServerAfterAddFeed', 'zoneclearFeedServerAfterAddFeed',
function (Cursor $cur, int $id): void { function (Cursor $cur, int $id): void {
$user = dcCore::app()->auth->getInfo('user_cn'); $user = App::auth()->getInfo('user_cn');
if (!is_string($user) if (!is_string($user)
|| !is_string($cur->getField('feed_name')) || !is_string($cur->getField('feed_name'))
|| !is_string($cur->getField('feed_feed')) || !is_string($cur->getField('feed_feed'))
@ -115,7 +121,7 @@ class ActivityReportActions
} }
$row = new FeedRow($rs); $row = new FeedRow($rs);
$user = dcCore::app()->auth->getInfo('user_cn'); $user = App::auth()->getInfo('user_cn');
if (!is_string($user)) { if (!is_string($user)) {
return; return;
} }
@ -145,5 +151,7 @@ class ActivityReportActions
)); ));
ActivityReport::instance()->groups->add($group); ActivityReport::instance()->groups->add($group);
return true;
} }
} }

View File

@ -1,24 +1,18 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Core\Process; use Dotclear\Core\Process;
/** /**
* Backend prepend. * @brief zoneclearFeedServer backend class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Backend extends Process class Backend extends Process
{ {
@ -34,19 +28,17 @@ class Backend extends Process
} }
// behaviors that will be always loaded // behaviors that will be always loaded
dcCore::app()->addBehaviors([ App::behavior()->addBehaviors([
// Allways take care to delete related info about feed post in meta table // Allways take care to delete related info about feed post in meta table
'adminBeforePostDelete' => function (int $post_id): void { 'adminBeforePostDelete' => function (int $post_id): void {
ZoneclearFeedServer::instance()::deletePostsMeta($post_id); ZoneclearFeedServer::instance()::deletePostsMeta($post_id);
}, },
// widgets registration // widgets registration
'initWidgets' => [Widgets::class, 'init'], 'initWidgets' => Widgets::init(...),
// add Uninstaller cleaner for special direct action // add Uninstaller cleaner for special direct action
'UninstallerCleanersConstruct' => function ($uninstaller_stack) { 'UninstallerCleanersConstruct' => function ($uninstaller_stack) {
UninstallCleaner::init($uninstaller_stack); UninstallCleaner::init($uninstaller_stack);
}, },
'adminBeforeBlogSettingsUpdate' => [BackendBehaviors::class, 'adminBeforeBlogSettingsUpdate'],
'adminBlogPreferencesFormV2' => [BackendBehaviors::class, 'adminBlogPreferencesFormV2'],
]); ]);
// not active // not active
@ -63,14 +55,14 @@ class Backend extends Process
My::addBackendMenuItem(); My::addBackendMenuItem();
// behaviors that require user perm // behaviors that require user perm
dcCore::app()->addBehaviors([ App::behavior()->addBehaviors([
'adminDashboardFavoritesV2' => [BackendBehaviors::class, 'adminDashboardFavoritesV2'], 'adminDashboardFavoritesV2' => BackendBehaviors::adminDashboardFavoritesV2(...),
'adminColumnsListsV2' => [BackendBehaviors::class, 'adminColumnsListsV2'], 'adminColumnsListsV2' => BackendBehaviors::adminColumnsListsV2(...),
'adminFiltersListsV2' => [BackendBehaviors::class, 'adminFiltersListsV2'], 'adminFiltersListsV2' => BackendBehaviors::adminFiltersListsV2(...),
'adminPostListHeaderV2' => [BackendBehaviors::class, 'adminPostListHeaderV2'], 'adminPostListHeaderV2' => BackendBehaviors::adminPostListHeaderV2(...),
'adminPostListValueV2' => [BackendBehaviors::class, 'adminPostListValueV2'], 'adminPostListValueV2' => BackendBehaviors::adminPostListValueV2(...),
'adminPostHeaders' => [BackendBehaviors::class, 'adminPostHeaders'], 'adminPostHeaders' => BackendBehaviors::adminPostHeaders(...),
'adminPostFormItems' => [BackendBehaviors::class, 'adminPostFormItems'], 'adminPostFormItems' => BackendBehaviors::adminPostFormItems(...),
]); ]);
return true; return true;

View File

@ -1,232 +1,30 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use ArrayObject; use ArrayObject;
use dcCore; use Dotclear\App;
use dcSettings;
use Dotclear\Core\Backend\Favorites; use Dotclear\Core\Backend\Favorites;
use Dotclear\Database\MetaRecord; use Dotclear\Database\MetaRecord;
use Dotclear\Helper\Html\Form\{ use Dotclear\Helper\Html\Form\{
Checkbox,
Div, Div,
Input,
Label,
Link, Link,
Number,
Para, Para,
Select,
Text Text
}; };
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
/** /**
* Backend behaviors. * @brief zoneclearFeedServer backend behaviors class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class BackendBehaviors class BackendBehaviors
{ {
/**
* Module settings save.
*
* Used in blog settings and module config.
*/
public static function adminBeforeBlogSettingsUpdate(?dcSettings $blog_settings): void
{
// read settings
$s = ZoneclearFeedServer::instance()->settings;
// write settings
foreach ($s->dump() as $key => $value) {
$s->set($key, $_POST[My::id() . $key] ?? $value);
}
}
/**
* Module settings form.
*
* Used in blog settings and module config.
*/
public static function adminBlogPreferencesFormV2(?dcSettings $blog_settings): void
{
// nullsafe
if (is_null(dcCore::app()->blog)) {
return;
}
$z = ZoneclearFeedServer::instance();
$s = $z->settings;
$msg = [];
if (!is_writable(DC_TPL_CACHE)) {
$msg[] = (new Para())
->class('error')
->text(__('Dotclear cache is not writable or not well configured!'));
}
if ($s->pub_active) {
$msg[] = (new Para())
->items([
(new Link())
->class('onblog_link outgoing')
->text(__('View the public list of feeds') . ' <img alt="" src="images/outgoing-link.svg">')
->href(dcCore::app()->blog->url . dcCore::app()->url->getBase('zoneclearFeedsPage')),
]);
}
$titles = [];
foreach ($z->getPublicUrlTypes() as $k => $v) {
$titles[] = (new Para(null, 'li'))
->items([
(new Checkbox([My::id() . 'post_title_redir[]', My::id() . 'post_title_redir_' . $v], in_array($v, $s->post_title_redir)))
->value($v),
(new Label(__($k), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'post_title_redir_' . $v),
]);
}
$contents = [];
foreach ($z->getPublicUrlTypes() as $k => $v) {
$contents[] = (new Para(null, 'li'))
->items([
(new Checkbox([My::id() . 'post_full_tpl_[]', My::id() . 'post_full_tpl_' . $v], in_array($v, $s->post_full_tpl)))
->value($v),
(new Label(__($k), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'post_full_tpl_' . $v),
]);
}
echo
(new Div())->class('fieldset')
->items([
!is_null($blog_settings) ?
(new Text('h4', My::name()))
->id('disclaimerParam') :
(new Text()),
(new Div())
->items($msg),
(new Para())
->items([
(new Checkbox(My::id() . 'active', $s->active))
->value(1),
(new Label(__('Enable plugin'), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'active'),
]),
(new Div())
->class('clear two-cols')
->items([
(new Div())
->class('fieldset col')
->items([
(new Para())
->items([
(new Label(__('Status of new posts:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'post_status_new'),
(new Select(My::id() . 'post_status_new'))
->items(Combo::postsStatus())
->default((string) $s->post_status_new),
]),
(new Para())
->items([
(new Label(__('Owner of entries created by the feed server:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'user'),
(new Select(My::id() . 'user'))
->items($z->getAllBlogAdmins())
->default($s->user),
]),
(new Para())
->items([
(new Label(__('How to transform imported tags:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'tag_case'),
(new Select(My::id() . 'tag_case'))
->items(Combo::tagCase())
->default((string) $s->tag_case),
]),
]),
(new Div())
->class('fieldset col')
->items([
(new Para())
->items([
(new Label(__('Update feeds on public side:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'bhv_pub_upd'),
(new Select(My::id() . 'bhv_pub_upd'))
->items(Combo::pubUpdate())
->default((string) $s->bhv_pub_upd),
]),
(new Para())
->items([
(new Label(__('Number of feeds to update at one time:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'update_limit'),
(new Number(My::id() . 'update_limit'))
->min(0)
->max(20)
->value($s->update_limit),
]),
(new Para())
->items([
(new Checkbox(My::id() . 'keep_empty_feed', $s->keep_empty_feed))
->value(1),
(new Label(__('Keep active empty feeds'), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'keep_empty_feed'),
]),
(new Para())
->items([
(new Checkbox(My::id() . 'pub_active', $s->pub_active))
->value(1),
(new Label(__('Enable public page'), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'pub_active'),
]),
]),
]),
(new Div())
->class('two-cols')
->items([
(new Div())
->class('fieldset col')
->items([
(new Text('p', __('Redirect to original post on:'))),
(new Para(null, 'ul'))
->items($titles),
]),
(new Div())
->class('fieldset col')
->items([
(new Text('p', __('Show full content on:'))),
(new Para(null, 'ul'))
->items($contents),
]),
]),
(new Div())->class('clear')->items(
!is_null($blog_settings) && $s->active ?
[(new Para())
->items([
(new Link())
->href(My::managerUrl())
->text(__('Configure feeds')),
])] :
[],
),
(new Div())->class('clear'),
])
->render();
}
/** /**
* User dashboard favorites icon. * User dashboard favorites icon.
*/ */
@ -237,9 +35,9 @@ class BackendBehaviors
'url' => My::manageUrl(), 'url' => My::manageUrl(),
'small-icon' => My::icons(), 'small-icon' => My::icons(),
'large-icon' => My::icons(), 'large-icon' => My::icons(),
'permissions' => dcCore::app()->auth->makePermissions([ 'permissions' => App::auth()->makePermissions([
dcCore::app()->auth::PERMISSION_USAGE, App::auth()::PERMISSION_USAGE,
dcCore::app()->auth::PERMISSION_CONTENT_ADMIN, App::auth()::PERMISSION_CONTENT_ADMIN,
]), ]),
// update user dashboard favorites icon with nb of updated feeds // update user dashboard favorites icon with nb of updated feeds
'dashboard_cb' => function (ArrayObject $fav): void { 'dashboard_cb' => function (ArrayObject $fav): void {
@ -257,6 +55,8 @@ class BackendBehaviors
/** /**
* Lists columns user preference. * Lists columns user preference.
*
* @param ArrayObject<string, mixed> $cols
*/ */
public static function adminColumnsListsV2(ArrayObject $cols): void public static function adminColumnsListsV2(ArrayObject $cols): void
{ {
@ -285,6 +85,8 @@ class BackendBehaviors
/** /**
* Lists filter. * Lists filter.
*
* @param ArrayObject<string, mixed> $sorts
*/ */
public static function adminFiltersListsV2(ArrayObject $sorts): void public static function adminFiltersListsV2(ArrayObject $sorts): void
{ {
@ -308,18 +110,22 @@ class BackendBehaviors
/** /**
* Add head column to posts list. * Add head column to posts list.
*
* @param ArrayObject<string, mixed> $cols
*/ */
public static function adminPostListHeaderV2(MetaRecord $rs, ArrayObject $cols): void public static function adminPostListHeaderV2(MetaRecord $rs, ArrayObject $cols): void
{ {
$cols['feed'] = (new Para(null, 'th'))->text(__('Feed'))->extra('scope="col"')->render(); $cols['feed'] = (new Text('th', __('Feed')))->extra('scope="col"')->render();
} }
/** /**
* Add body column to posts list. * Add body column to posts list.
*
* @param ArrayObject<string, mixed> $cols
*/ */
public static function adminPostListValueV2(MetaRecord $rs, ArrayObject $cols): void public static function adminPostListValueV2(MetaRecord $rs, ArrayObject $cols): void
{ {
$rs_meta = dcCore::app()->meta->getMetadata(['post_id' => $rs->f('post_id'), 'meta_type' => My::META_PREFIX . 'id']); $rs_meta = App::meta()->getMetadata(['post_id' => $rs->f('post_id'), 'meta_type' => My::META_PREFIX . 'id']);
if ($rs_meta->isEmpty()) { if ($rs_meta->isEmpty()) {
$item = (new Text('', '-')); $item = (new Text('', '-'));
} else { } else {
@ -342,11 +148,14 @@ class BackendBehaviors
/** /**
* Add info about feed on post page sidebar. * Add info about feed on post page sidebar.
*
* @param ArrayObject<string, mixed> $main_items
* @param ArrayObject<string, mixed> $sidebar_items
*/ */
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
{ {
// nullsafe // nullsafe
if (is_null(dcCore::app()->blog)) { if (!App::blog()->isDefined()) {
return; return;
} }
@ -355,7 +164,7 @@ class BackendBehaviors
return; return;
} }
$url = dcCore::app()->meta->getMetadata([ $url = App::meta()->getMetadata([
'post_id' => $post->f('post_id'), 'post_id' => $post->f('post_id'),
'meta_type' => My::META_PREFIX . 'url', 'meta_type' => My::META_PREFIX . 'url',
'limit' => 1, 'limit' => 1,
@ -365,21 +174,21 @@ class BackendBehaviors
return; return;
} }
$author = dcCore::app()->meta->getMetadata([ $author = App::meta()->getMetadata([
'post_id' => $post->f('post_id'), 'post_id' => $post->f('post_id'),
'meta_type' => My::META_PREFIX . 'author', 'meta_type' => My::META_PREFIX . 'author',
'limit' => 1, 'limit' => 1,
]); ]);
$author = $author->isEmpty() ? '' : $author->f('meta_id'); $author = $author->isEmpty() ? '' : $author->f('meta_id');
$site = dcCore::app()->meta->getMetadata([ $site = App::meta()->getMetadata([
'post_id' => $post->f('post_id'), 'post_id' => $post->f('post_id'),
'meta_type' => My::META_PREFIX . 'site', 'meta_type' => My::META_PREFIX . 'site',
'limit' => 1, 'limit' => 1,
]); ]);
$site = $site->isEmpty() ? '' : $site->f('meta_id'); $site = $site->isEmpty() ? '' : $site->f('meta_id');
$sitename = dcCore::app()->meta->getMetadata([ $sitename = App::meta()->getMetadata([
'post_id' => $post->f('post_id'), 'post_id' => $post->f('post_id'),
'meta_type' => My::META_PREFIX . 'sitename', 'meta_type' => My::META_PREFIX . 'sitename',
'limit' => 1, 'limit' => 1,
@ -387,11 +196,11 @@ class BackendBehaviors
$sitename = $sitename->isEmpty() ? '' : $sitename->f('meta_id'); $sitename = $sitename->isEmpty() ? '' : $sitename->f('meta_id');
$edit = (new Text('', '')); $edit = (new Text('', ''));
if (dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([ if (App::auth()->check(App::auth()->makePermissions([
dcCore::app()->auth::PERMISSION_CONTENT_ADMIN, App::auth()::PERMISSION_CONTENT_ADMIN,
]), dcCore::app()->blog->id) ]), App::blog()->id())
) { ) {
$fid = dcCore::app()->meta->getMetadata([ $fid = App::meta()->getMetadata([
'post_id' => $post->f('post_id'), 'post_id' => $post->f('post_id'),
'meta_type' => My::META_PREFIX . 'id', 'meta_type' => My::META_PREFIX . 'id',
'limit' => 1, 'limit' => 1,

View File

@ -14,17 +14,21 @@ declare(strict_types=1);
namespace Dotclear\Plugin\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
use Exception; use Exception;
/** /**
* Various combo list. * @brief zoneclearFeedServer backend combo helper.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Combo class Combo
{ {
/** /**
* @return array<string,string> * @return array<string, string>
*/ */
public static function feedsSortby(): array public static function feedsSortby(): array
{ {
@ -38,7 +42,7 @@ class Combo
} }
/** /**
* @return array<string,string> * @return array<string, string>
*/ */
public static function postsSortby(): array public static function postsSortby(): array
{ {
@ -52,7 +56,7 @@ class Combo
} }
/** /**
* @return array<string,string> * @return array<string, string>
*/ */
public static function feedsStatus(): array public static function feedsStatus(): array
{ {
@ -63,7 +67,7 @@ class Combo
} }
/** /**
* @return array<string,int> * @return array<string, int>
*/ */
public static function postsStatus(): array public static function postsStatus(): array
{ {
@ -74,7 +78,7 @@ class Combo
} }
/** /**
* @return array<string,int> * @return array<string, int>
*/ */
public static function updateInterval(): array public static function updateInterval(): array
{ {
@ -89,7 +93,7 @@ class Combo
} }
/** /**
* @return array<string,int> * @return array<string, int>
*/ */
public static function tagCase(): array public static function tagCase(): array
{ {
@ -102,7 +106,7 @@ class Combo
} }
/** /**
* @return array<string,int> * @return array<string, int>
*/ */
public static function pubUpdate(): array public static function pubUpdate(): array
{ {
@ -115,25 +119,24 @@ class Combo
} }
/** /**
* @return array<string,string> * @return array<string, string>
*/ */
public static function postCategories(): array public static function postCategories(): array
{ {
$combo = ['-' => '']; $combo = ['-' => ''];
try { try {
$categories = dcCore::app()->blog?->getCategories(['post_type' => 'post']); $categories = App::blog()->getCategories(['post_type' => 'post']);
if (!is_null($categories)) {
while ($categories->fetch()) {
$level = is_numeric($categories->f('level')) ? (int) $categories->f('level') : 1;
$cat_title = is_string($categories->f('cat_title')) ? $categories->f('cat_title') : '';
$cat_id = is_numeric($categories->f('cat_id')) ? (string) $categories->f('cat_id') : '';
$combo[ while ($categories->fetch()) {
str_repeat('&nbsp;&nbsp;', $level - 1) . $level = is_numeric($categories->f('level')) ? (int) $categories->f('level') : 1;
'&bull; ' . Html::escapeHTML($cat_title) $cat_title = is_string($categories->f('cat_title')) ? $categories->f('cat_title') : '';
] = $cat_id; $cat_id = is_numeric($categories->f('cat_id')) ? (string) $categories->f('cat_id') : '';
}
$combo[
str_repeat('&nbsp;&nbsp;', $level - 1) .
'&bull; ' . Html::escapeHTML($cat_title)
] = $cat_id;
} }
} catch (Exception $e) { } catch (Exception $e) {
} }

View File

@ -14,17 +14,31 @@ declare(strict_types=1);
namespace Dotclear\Plugin\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Core\Backend\{ use Dotclear\Core\Backend\{
Notices, Notices,
ModulesList, ModulesList,
Page Page
}; };
use Dotclear\Core\Process; use Dotclear\Core\Process;
use Dotclear\Helper\Html\Form\{
Checkbox,
Div,
Label,
Link,
Number,
Para,
Select,
Text
};
use Exception; use Exception;
/** /**
* Backend module configuration. * @brief zoneclearFeedServer config class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Config extends Process class Config extends Process
{ {
@ -45,18 +59,30 @@ class Config extends Process
} }
try { try {
BackendBehaviors::adminBeforeBlogSettingsUpdate(null); // read settings
$s = ZoneclearFeedServer::instance()->settings;
// write settings
foreach ($s->dump() as $key => $value) {
if (is_array($value) && empty($_POST[My::id() . $key])) {
$s->set($key, []);
} elseif (is_bool($value)) {
$s->set($key, !empty($_POST[My::id() . $key]));
} else {
$s->set($key, $_POST[My::id() . $key] ?: $value);
}
}
Notices::addSuccessNotice( Notices::addSuccessNotice(
__('Configuration has been successfully updated.') __('Configuration has been successfully updated.')
); );
dcCore::app()->admin->url->redirect('admin.plugins', [ App::backend()->url()->redirect('admin.plugins', [
'module' => My::id(), 'module' => My::id(),
'conf' => '1', 'conf' => '1',
'redir' => !(dcCore::app()->admin->__get('list') instanceof ModulesList) ? '' : dcCore::app()->admin->__get('list')->getRedir(), 'redir' => !(App::backend()->__get('list') instanceof ModulesList) ? '' : App::backend()->__get('list')->getRedir(),
]); ]);
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
} }
return true; return true;
@ -68,7 +94,161 @@ class Config extends Process
return; return;
} }
BackendBehaviors::adminBlogPreferencesFormV2(null); $z = ZoneclearFeedServer::instance();
$s = $z->settings;
$msg = [];
if (!is_writable(App::config()->cacheRoot())) {
$msg[] = (new Text('p', __('Dotclear cache is not writable or not well configured!')))
->class('error');
}
if ($s->pub_active) {
$msg[] = (new Para())
->items([
(new Link())
->class('onblog_link outgoing')
->text(__('View the public list of feeds') . ' <img alt="" src="images/outgoing-link.svg">')
->href(App::blog()->url() . App::url()->getBase('zoneclearFeedsPage')),
]);
}
$titles = [];
foreach ($z->getPublicUrlTypes() as $k => $v) {
$titles[] = (new Para(null, 'li'))
->items([
(new Checkbox([My::id() . 'post_title_redir[]', My::id() . 'post_title_redir_' . $v], in_array($v, $s->post_title_redir)))
->value($v),
(new Label(__($k), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'post_title_redir_' . $v),
]);
}
$contents = [];
foreach ($z->getPublicUrlTypes() as $k => $v) {
$contents[] = (new Para(null, 'li'))
->items([
(new Checkbox([My::id() . 'post_full_tpl[]', My::id() . 'post_full_tpl_' . $v], in_array($v, $s->post_full_tpl)))
->value($v),
(new Label(__($k), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'post_full_tpl_' . $v),
]);
}
echo
(new Div())
->items([
(new Div())
->items($msg),
(new Para())
->items([
(new Checkbox(My::id() . 'active', $s->active))
->value(1),
(new Label(__('Enable plugin'), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'active'),
]),
(new Div())
->class('clear two-cols')
->items([
(new Div())
->class('fieldset col')
->items([
(new Para())
->items([
(new Label(__('Status of new posts:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'post_status_new'),
(new Select(My::id() . 'post_status_new'))
->items(Combo::postsStatus())
->default((string) $s->post_status_new),
]),
(new Para())
->items([
(new Label(__('Owner of entries created by the feed server:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'user'),
(new Select(My::id() . 'user'))
->items($z->getAllBlogAdmins())
->default($s->user),
]),
(new Para())
->items([
(new Label(__('How to transform imported tags:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'tag_case'),
(new Select(My::id() . 'tag_case'))
->items(Combo::tagCase())
->default((string) $s->tag_case),
]),
]),
(new Div())
->class('fieldset col')
->items([
(new Para())
->items([
(new Label(__('Update feeds on public side:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'bhv_pub_upd'),
(new Select(My::id() . 'bhv_pub_upd'))
->items(Combo::pubUpdate())
->default((string) $s->bhv_pub_upd),
]),
(new Para())
->items([
(new Label(__('Number of feeds to update at one time:'), Label::OUTSIDE_LABEL_BEFORE))
->for(My::id() . 'update_limit'),
(new Number(My::id() . 'update_limit'))
->min(0)
->max(20)
->value($s->update_limit),
]),
(new Para())
->items([
(new Checkbox(My::id() . 'keep_empty_feed', $s->keep_empty_feed))
->value(1),
(new Label(__('Keep active empty feeds'), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'keep_empty_feed'),
]),
(new Para())
->items([
(new Checkbox(My::id() . 'pub_active', $s->pub_active))
->value(1),
(new Label(__('Enable public page'), Label::OUTSIDE_LABEL_AFTER))
->class('classic')
->for(My::id() . 'pub_active'),
]),
]),
]),
(new Div())
->class('two-cols')
->items([
(new Div())
->class('fieldset col')
->items([
(new Text('p', __('Redirect to original post on:'))),
(new Para(null, 'ul'))
->items($titles),
]),
(new Div())
->class('fieldset col')
->items([
(new Text('p', __('Show full content on:'))),
(new Para(null, 'ul'))
->items($contents),
]),
]),
(new Div())->class('clear')->items(
$s->active ?
[(new Para())
->items([
(new Link())
->href(My::manageUrl())
->text(__('Configure feeds')),
])] :
[],
),
(new Div())->class('clear'),
])
->render();
Page::helpBlock('zoneclearFeedServer'); Page::helpBlock('zoneclearFeedServer');
} }

View File

@ -17,7 +17,11 @@ namespace Dotclear\Plugin\zoneclearFeedServer;
use Dotclear\Database\MetaRecord; use Dotclear\Database\MetaRecord;
/** /**
* Feed meta record row type hinting. * @brief zoneclearFeedServer feed meta record row.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class FeedRow class FeedRow
{ {

View File

@ -1,21 +1,11 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use ArrayObject; use ArrayObject;
use dcCore; use Dotclear\App;
use Dotclear\Core\Backend\Action\Actions; use Dotclear\Core\Backend\Action\Actions;
use Dotclear\Core\Backend\Page; use Dotclear\Core\Backend\Page;
use Dotclear\Database\MetaRecord; use Dotclear\Database\MetaRecord;
@ -27,7 +17,11 @@ use Dotclear\Helper\Html\Html;
use Exception; use Exception;
/** /**
* Backend feeds list actions handler. * @brief zoneclearFeedServer feeds list actions.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class FeedsActions extends Actions class FeedsActions extends Actions
{ {
@ -56,7 +50,7 @@ class FeedsActions extends Actions
FeedsDefaultActions::addDefaultFeedsActions($this); FeedsDefaultActions::addDefaultFeedsActions($this);
# --BEHAVIOR-- zoneclearFeedServerAddFeedsActions - FeedsActions # --BEHAVIOR-- zoneclearFeedServerAddFeedsActions - FeedsActions
dcCore::app()->callBehavior('zoneclearFeedServerAddFeedsActions', $this); App::behavior()->callBehavior('zoneclearFeedServerAddFeedsActions', $this);
} }
public function beginPage(string $breadcrumb = '', string $head = ''): void public function beginPage(string $breadcrumb = '', string $head = ''): void
@ -83,12 +77,12 @@ class FeedsActions extends Actions
public function error(Exception $e): void public function error(Exception $e): void
{ {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
$this->beginPage( $this->beginPage(
Page::breadcrumb([ Page::breadcrumb([
Html::escapeHTML((string) dcCore::app()->blog?->name) => '', Html::escapeHTML(App::blog()->name()) => '',
$this->getCallerTitle() => $this->getRedirection(true), $this->getCallerTitle() => $this->getRedirection(true),
__('Feeds actions') => '', __('Feeds actions') => '',
]) ])
); );
$this->endPage(); $this->endPage();
@ -103,8 +97,8 @@ class FeedsActions extends Actions
$feeds = ZoneclearFeedServer::instance()->getFeeds($params); $feeds = ZoneclearFeedServer::instance()->getFeeds($params);
while ($feeds->fetch()) { while ($feeds->fetch()) {
$row = new FeedRow($feeds); $row = new FeedRow($feeds);
$this->entries[$row->id] = $row->name; $this->entries[(string) $row->id] = $row->name;
} }
$this->rs = $feeds; $this->rs = $feeds;
} else { } else {

View File

@ -1,22 +1,11 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use ArrayObject; use ArrayObject;
use dcCore; use Dotclear\App;
use dcMeta;
use Dotclear\Core\Backend\{ use Dotclear\Core\Backend\{
Notices, Notices,
Page Page
@ -35,7 +24,11 @@ use Dotclear\Helper\Html\Html;
use Exception; use Exception;
/** /**
* Backend feeds list default actions. * @brief zoneclearFeedServer feeds list default actions.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class FeedsDefaultActions class FeedsDefaultActions
{ {
@ -46,40 +39,42 @@ class FeedsDefaultActions
{ {
$ap->addAction( $ap->addAction(
[__('Change category') => 'changecat'], [__('Change category') => 'changecat'],
[self::class, 'doChangeCategory'] self::doChangeCategory(...)
); );
$ap->addAction( $ap->addAction(
[__('Change update interval') => 'changeint'], [__('Change update interval') => 'changeint'],
[self::class, 'doChangeInterval'] self::doChangeInterval(...)
); );
$ap->addAction( $ap->addAction(
[__('Disable feed update') => 'disablefeed'], [__('Disable feed update') => 'disablefeed'],
[self::class, 'doEnableFeed'] self::doEnableFeed(...)
); );
$ap->addAction( $ap->addAction(
[__('Enable feed update') => 'enablefeed'], [__('Enable feed update') => 'enablefeed'],
[self::class, 'doEnableFeed'] self::doEnableFeed(...)
); );
$ap->addAction( $ap->addAction(
[__('Reset last update') => 'resetupdlast'], [__('Reset last update') => 'resetupdlast'],
[self::class, 'doResetUpdate'] self::doResetUpdate(...)
); );
$ap->addAction( $ap->addAction(
[__('Update (check) feed') => 'updatefeed'], [__('Update (check) feed') => 'updatefeed'],
[self::class, 'doUpdateFeed'] self::doUpdateFeed(...)
); );
$ap->addAction( $ap->addAction(
[__('Delete related posts') => 'deletepost'], [__('Delete related posts') => 'deletepost'],
[self::class, 'doDeletePost'] self::doDeletePost(...)
); );
$ap->addAction( $ap->addAction(
[__('Delete feed (without related posts)') => 'deletefeed'], [__('Delete feed (without related posts)') => 'deletefeed'],
[self::class, 'doDeleteFeed'] self::doDeleteFeed(...)
); );
} }
/** /**
* Enable / disable feeds. * Enable / disable feeds.
*
* @param ArrayObject<string, mixed> $post
*/ */
public static function doEnableFeed(FeedsActions $ap, ArrayObject $post): void public static function doEnableFeed(FeedsActions $ap, ArrayObject $post): void
{ {
@ -93,7 +88,7 @@ class FeedsDefaultActions
} }
foreach ($ids as $id) { foreach ($ids as $id) {
$ap->zcfs->enableFeed($id, $enable); $ap->zcfs->enableFeed((int) $id, $enable);
} }
Notices::addSuccessNotice(sprintf( Notices::addSuccessNotice(sprintf(
@ -116,6 +111,8 @@ class FeedsDefaultActions
/** /**
* Delete feeds posts. * Delete feeds posts.
*
* @param ArrayObject<string, mixed> $post
*/ */
public static function doDeletePost(FeedsActions $ap, ArrayObject $post): void public static function doDeletePost(FeedsActions $ap, ArrayObject $post): void
{ {
@ -142,10 +139,10 @@ class FeedsDefaultActions
while ($posts->fetch()) { while ($posts->fetch()) {
if (is_numeric($posts->f('post_id'))) { if (is_numeric($posts->f('post_id'))) {
dcCore::app()->blog?->delPost((int) $posts->f('post_id')); App::blog()->delPost((int) $posts->f('post_id'));
$sql = new DeleteStatement(); $sql = new DeleteStatement();
$sql $sql
->from(dcCore::app()->prefix . dcMeta::META_TABLE_NAME) ->from(App::con()->prefix() . App::meta()::META_TABLE_NAME)
->where('post_id = ' . $posts->f('post_id')) ->where('post_id = ' . $posts->f('post_id'))
->and('meta_type ' . $sql->in($types)) ->and('meta_type ' . $sql->in($types))
->delete(); ->delete();
@ -161,6 +158,8 @@ class FeedsDefaultActions
/** /**
* Delete feeds. * Delete feeds.
*
* @param ArrayObject<string, mixed> $post
*/ */
public static function doDeleteFeed(FeedsActions $ap, ArrayObject $post): void public static function doDeleteFeed(FeedsActions $ap, ArrayObject $post): void
{ {
@ -173,7 +172,7 @@ class FeedsDefaultActions
} }
foreach ($ids as $id) { foreach ($ids as $id) {
$ap->zcfs->deleteFeed($id); $ap->zcfs->deleteFeed((int) $id);
} }
Notices::addSuccessNotice(sprintf( Notices::addSuccessNotice(sprintf(
@ -189,6 +188,8 @@ class FeedsDefaultActions
/** /**
* Update feeds properties. * Update feeds properties.
*
* @param ArrayObject<string, mixed> $post
*/ */
public static function doUpdateFeed(FeedsActions $ap, ArrayObject $post): void public static function doUpdateFeed(FeedsActions $ap, ArrayObject $post): void
{ {
@ -201,7 +202,7 @@ class FeedsDefaultActions
} }
foreach ($ids as $id) { foreach ($ids as $id) {
$ap->zcfs->checkFeedsUpdate($id, true); $ap->zcfs->checkFeedsUpdate((int) $id, true);
} }
Notices::addSuccessNotice(sprintf( Notices::addSuccessNotice(sprintf(
@ -213,6 +214,8 @@ class FeedsDefaultActions
/** /**
* Reset feeds update timer. * Reset feeds update timer.
*
* @param ArrayObject<string, mixed> $post
*/ */
public static function doResetUpdate(FeedsActions $ap, ArrayObject $post): void public static function doResetUpdate(FeedsActions $ap, ArrayObject $post): void
{ {
@ -228,7 +231,7 @@ class FeedsDefaultActions
foreach ($ids as $id) { foreach ($ids as $id) {
$cur->clean(); $cur->clean();
$cur->setField('feed_upd_last', 0); $cur->setField('feed_upd_last', 0);
$ap->zcfs->updateFeed($id, $cur); $ap->zcfs->updateFeed((int) $id, $cur);
//$ap->zcfs->checkFeedsUpdate($id, true); //$ap->zcfs->checkFeedsUpdate($id, true);
} }
@ -241,6 +244,8 @@ class FeedsDefaultActions
/** /**
* Change feeds categories. * Change feeds categories.
*
* @param ArrayObject<string, mixed> $post
*/ */
public static function doChangeCategory(FeedsActions $ap, ArrayObject $post): void public static function doChangeCategory(FeedsActions $ap, ArrayObject $post): void
{ {
@ -259,7 +264,7 @@ class FeedsDefaultActions
foreach ($ids as $id) { foreach ($ids as $id) {
$cur->clean(); $cur->clean();
$cur->setField('cat_id', $cat_id == 0 ? null : $cat_id); $cur->setField('cat_id', $cat_id == 0 ? null : $cat_id);
$ap->zcfs->updateFeed($id, $cur); $ap->zcfs->updateFeed((int) $id, $cur);
} }
Notices::addSuccessNotice(sprintf( Notices::addSuccessNotice(sprintf(
@ -270,10 +275,10 @@ class FeedsDefaultActions
} else { } else {
$ap->beginPage( $ap->beginPage(
Page::breadcrumb([ Page::breadcrumb([
Html::escapeHTML((string) dcCore::app()->blog?->name) => '', Html::escapeHTML(App::blog()->name()) => '',
__('Feeds server') => '', __('Feeds server') => '',
$ap->getCallerTitle() => $ap->getRedirection(true), $ap->getCallerTitle() => $ap->getRedirection(true),
__('Change category for this selection') => '', __('Change category for this selection') => '',
]) ])
); );
@ -294,7 +299,7 @@ class FeedsDefaultActions
(new Submit('do-action')) (new Submit('do-action'))
->value(__('Save')), ->value(__('Save')),
(new Hidden(['action'], 'changecat')), (new Hidden(['action'], 'changecat')),
dcCore::app()->formNonce(false), App::nonce()->formNonce(),
] ]
)), )),
@ -307,6 +312,8 @@ class FeedsDefaultActions
/** /**
* Change feeds update interval. * Change feeds update interval.
*
* @param ArrayObject<string, mixed> $post
*/ */
public static function doChangeInterval(FeedsActions $ap, ArrayObject $post): void public static function doChangeInterval(FeedsActions $ap, ArrayObject $post): void
{ {
@ -325,7 +332,7 @@ class FeedsDefaultActions
foreach ($ids as $id) { foreach ($ids as $id) {
$cur->clean(); $cur->clean();
$cur->setField('feed_upd_int', $upd_int); $cur->setField('feed_upd_int', $upd_int);
$ap->zcfs->updateFeed($id, $cur); $ap->zcfs->updateFeed((int) $id, $cur);
} }
Notices::addSuccessNotice(sprintf( Notices::addSuccessNotice(sprintf(
@ -337,10 +344,10 @@ class FeedsDefaultActions
$ap->beginPage( $ap->beginPage(
Page::breadcrumb( Page::breadcrumb(
[ [
Html::escapeHTML((string) dcCore::app()->blog?->name) => '', Html::escapeHTML(App::blog()->name()) => '',
__('Feeds server') => '', __('Feeds server') => '',
$ap->getCallerTitle() => $ap->getRedirection(true), $ap->getCallerTitle() => $ap->getRedirection(true),
__('Change update frequency for this selection') => '', __('Change update frequency for this selection') => '',
] ]
) )
); );
@ -362,7 +369,7 @@ class FeedsDefaultActions
(new Submit('do-action')) (new Submit('do-action'))
->value(__('Save')), ->value(__('Save')),
(new Hidden(['action'], 'changeint')), (new Hidden(['action'], 'changeint')),
dcCore::app()->formNonce(false), App::nonce()->formNonce(),
] ]
)), )),

View File

@ -1,21 +1,11 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use ArrayObject; use ArrayObject;
use dcCore; use Dotclear\App;
use Dotclear\Core\Backend\Filter\Filters; use Dotclear\Core\Backend\Filter\Filters;
use Dotclear\Core\Backend\Listing\{ use Dotclear\Core\Backend\Listing\{
Listing, Listing,
@ -32,7 +22,11 @@ use Dotclear\Helper\Html\Form\{
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
/** /**
* Backend feeds list. * @brief zoneclearFeedServer backend feeds list.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class FeedsList extends Listing class FeedsList extends Listing
{ {
@ -126,7 +120,7 @@ class FeedsList extends Listing
if (!is_string($url)) { if (!is_string($url)) {
$url = ''; $url = '';
} }
$tz = dcCore::app()->auth->getInfo('user_tz'); $tz = App::auth()->getInfo('user_tz');
if (!is_string($tz)) { if (!is_string($tz)) {
$tz = 'UTC'; $tz = 'UTC';
} }

View File

@ -1,28 +1,21 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use dcUtils;
use Dotclear\Core\Process; use Dotclear\Core\Process;
use Dotclear\Database\MetaRecord; use Dotclear\Database\MetaRecord;
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
use Exception; use Exception;
/** /**
* Frontend prepend. * @brief zoneclearFeedServer frontend class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Frontend extends Process class Frontend extends Process
{ {
@ -39,7 +32,7 @@ class Frontend extends Process
$s = ZoneclearFeedServer::instance()->settings; $s = ZoneclearFeedServer::instance()->settings;
dcCore::app()->addBehaviors([ App::behavior()->addBehaviors([
// posts record // posts record
'coreBlogGetPosts' => function (MetaRecord $rs): void { 'coreBlogGetPosts' => function (MetaRecord $rs): void {
RsExtPosts::$brother_extensions = $rs->extensions(); RsExtPosts::$brother_extensions = $rs->extensions();
@ -50,17 +43,17 @@ class Frontend extends Process
return $context == 'zoneclearFeedsPage' ? __('List of feeds') : ''; return $context == 'zoneclearFeedsPage' ? __('List of feeds') : '';
}, },
// widgets registration // widgets registration
'initWidgets' => [Widgets::class, 'init'], 'initWidgets' => Widgets::init(...),
]); ]);
// Register template blocks // Register template blocks
foreach (My::TPL_BLOCKS as $block) { foreach (My::TPL_BLOCKS as $block) {
dcCore::app()->tpl->addBlock('zc' . $block, [Template::class, $block]); App::frontend()->template()->addBlock('zc' . $block, [Template::class, $block]);
} }
// Register template values // Register template values
foreach (My::TPL_VALUES as $value) { foreach (My::TPL_VALUES as $value) {
dcCore::app()->tpl->addValue('zc' . $value, [Template::class, $value]); App::frontend()->template()->addValue('zc' . $value, [Template::class, $value]);
} }
// module not active // module not active
@ -70,8 +63,8 @@ class Frontend extends Process
// feeds update methods // feeds update methods
if (1 == $s->bhv_pub_upd) { if (1 == $s->bhv_pub_upd) {
dcCore::app()->addBehavior('publicBeforeDocumentV2', function (): void { App::behavior()->addBehavior('publicBeforeDocumentV2', function (): void {
if (in_array(dcCore::app()->url->type, ['default', 'feed'])) { if (in_array(App::url()->type, ['default', 'feed'])) {
try { try {
ZoneclearFeedServer::instance()->checkFeedsUpdate(); ZoneclearFeedServer::instance()->checkFeedsUpdate();
} catch (Exception $e) { } catch (Exception $e) {
@ -79,28 +72,28 @@ class Frontend extends Process
}; };
}); });
} elseif (2 == $s->bhv_pub_upd) { } elseif (2 == $s->bhv_pub_upd) {
dcCore::app()->addBehavior('publicAfterDocumentV2', function (): void { App::behavior()->addBehavior('publicAfterDocumentV2', function (): void {
try { try {
ZoneclearFeedServer::instance()->checkFeedsUpdate(); ZoneclearFeedServer::instance()->checkFeedsUpdate();
} catch (Exception $e) { } catch (Exception $e) {
} }
}); });
} elseif (3 == $s->bhv_pub_upd) { } elseif (3 == $s->bhv_pub_upd) {
dcCore::app()->addBehavior('publicHeadContent', function (): void { App::behavior()->addBehavior('publicHeadContent', function (): void {
if (is_null(dcCore::app()->blog) || dcCore::app()->url->type != 'default') { if (!App::blog()->isDefined() || App::url()->type != 'default') {
return; return;
} }
$blog_url = Html::escapeJS( $blog_url = Html::escapeJS(
dcCore::app()->blog->url . App::blog()->url() .
dcCore::app()->url->getBase('zoneclearFeedsPage') . App::url()->getBase('zoneclearFeedsPage') .
'/zcfsupd' '/zcfsupd'
); );
$blog_id = Html::escapeJS(dcCore::app()->blog->id); $blog_id = Html::escapeJS(App::blog()->id());
echo echo
"\n<!-- JS for zoneclearFeedServer --> \n" . "\n<!-- JS for zoneclearFeedServer --> \n" .
dcUtils::jsLoad(dcCore::app()->blog->url . dcCore::app()->url->getBase('zoneclearFeedsPage') . '/zcfsupd.js') . App::plugins()->jsLoad(App::blog()->url() . App::url()->getBase('zoneclearFeedsPage') . '/zcfsupd.js') .
"<script type=\"text/javascript\"> \n//<![CDATA[\n" . "<script type=\"text/javascript\"> \n//<![CDATA[\n" .
' $(function(){if(!document.getElementById){return;} ' . ' $(function(){if(!document.getElementById){return;} ' .
" $('body').zoneclearFeedServer({blog_url:'" . " $('body').zoneclearFeedServer({blog_url:'" .

View File

@ -1,26 +1,20 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Core\Process; use Dotclear\Core\Process;
use Dotclear\Database\Structure; use Dotclear\Database\Structure;
use Exception; use Exception;
/** /**
* Module installation. * @brief zoneclearFeedServer install class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Install extends Process class Install extends Process
{ {
@ -40,7 +34,7 @@ class Install extends Process
Upgrade::preUpgrade(); Upgrade::preUpgrade();
// Tables // Tables
$s = new Structure(dcCore::app()->con, dcCore::app()->prefix); $s = new Structure(App::con(), App::con()->prefix());
$s->__get(My::TABLE_NAME) $s->__get(My::TABLE_NAME)
->field('feed_id', 'bigint', 0, false) ->field('feed_id', 'bigint', 0, false)
->field('feed_creadt', 'timestamp', 0, false, 'now()') ->field('feed_creadt', 'timestamp', 0, false, 'now()')
@ -67,7 +61,7 @@ class Install extends Process
->index('idx_zcfs_type', 'btree', 'feed_type') ->index('idx_zcfs_type', 'btree', 'feed_type')
->index('idx_zcfs_blog', 'btree', 'blog_id'); ->index('idx_zcfs_blog', 'btree', 'blog_id');
(new Structure(dcCore::app()->con, dcCore::app()->prefix))->synchronize($s); (new Structure(App::con(), App::con()->prefix()))->synchronize($s);
// Settings // Settings
$s = My::settings(); $s = My::settings();
@ -84,7 +78,7 @@ class Install extends Process
return true; return true;
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
return false; return false;
} }

View File

@ -1,20 +1,10 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Core\Backend\Filter\{ use Dotclear\Core\Backend\Filter\{
Filters, Filters,
FiltersLibrary FiltersLibrary
@ -37,7 +27,11 @@ use Dotclear\Helper\Html\Form\{
use Exception; use Exception;
/** /**
* Backend feeds list manage page. * @brief zoneclearFeedServer backend feeds manage class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Manage extends Process class Manage extends Process
{ {
@ -64,7 +58,7 @@ class Manage extends Process
// not configured // not configured
if (!$s->active || !$s->user) { if (!$s->active || !$s->user) {
dcCore::app()->error->add(__('Module is not wel configured')); App::error()->add(__('Module is not wel configured'));
return true; return true;
} }
@ -131,13 +125,13 @@ class Manage extends Process
$feeds_counter = $z->getFeeds($params, true)->f(0); $feeds_counter = $z->getFeeds($params, true)->f(0);
$feeds_list = new FeedsList($feeds, $feeds_counter); $feeds_list = new FeedsList($feeds, $feeds_counter);
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
} }
Page::openModule( Page::openModule(
My::id(), My::id(),
( (
isset($feeds_list) && !dcCore::app()->error->flag() ? isset($feeds_list) && !App::error()->flag() ?
$feeds_filter->js(My::manageUrl(['part' => 'feeds'], '&')) . $feeds_filter->js(My::manageUrl(['part' => 'feeds'], '&')) .
My::jsLoad('feeds') My::jsLoad('feeds')
: '' : ''
@ -188,7 +182,7 @@ class Manage extends Process
(new Label(__('Selected feeds action:'), Label::OUTSIDE_LABEL_BEFORE)) (new Label(__('Selected feeds action:'), Label::OUTSIDE_LABEL_BEFORE))
->for('action'), ->for('action'),
(new Select('action')) (new Select('action'))
->items($feeds_actions_page->getCombo()), ->items($feeds_actions_page->getCombo() ?? []),
(new Submit('feeds-action')) (new Submit('feeds-action'))
->value(__('ok')), ->value(__('ok')),
... My::hiddenFields($feeds_filter->values(true)), ... My::hiddenFields($feeds_filter->values(true)),

View File

@ -1,20 +1,10 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Core\Backend\Action\ActionsPosts; use Dotclear\Core\Backend\Action\ActionsPosts;
use Dotclear\Core\Backend\{ use Dotclear\Core\Backend\{
Notices, Notices,
@ -38,7 +28,11 @@ use Dotclear\Helper\L10n;
use Exception; use Exception;
/** /**
* Backend feed and feed posts manage page. * @brief zoneclearFeedServer backend feeds posts manage class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class ManageFeed extends Process class ManageFeed extends Process
{ {
@ -70,26 +64,26 @@ class ManageFeed extends Process
$testfeed_params['sql'] = 'AND feed_id <> ' . $v->id . ' '; $testfeed_params['sql'] = 'AND feed_id <> ' . $v->id . ' ';
} }
if ($z->getFeeds($testfeed_params, true)->f(0)) { if ($z->getFeeds($testfeed_params, true)->f(0)) {
dcCore::app()->error->add(__('Record with same feed URL already exists.')); App::error()->add(__('Record with same feed URL already exists.'));
} }
if (empty($v->name)) { if (empty($v->name)) {
dcCore::app()->error->add(__('You must provide a name.')); App::error()->add(__('You must provide a name.'));
} }
if (empty($v->owner)) { if (empty($v->owner)) {
dcCore::app()->error->add(__('You must provide an owner.')); App::error()->add(__('You must provide an owner.'));
} }
if (!$z::validateURL($v->url)) { if (!$z::validateURL($v->url)) {
dcCore::app()->error->add(__('You must provide valid site URL.')); App::error()->add(__('You must provide valid site URL.'));
} }
if (!$z::validateURL($v->feed)) { if (!$z::validateURL($v->feed)) {
dcCore::app()->error->add(__('You must provide valid feed URL.')); App::error()->add(__('You must provide valid feed URL.'));
} }
if (null !== $v->cat_id && !dcCore::app()->blog?->getCategory($v->cat_id)) { if (null !== $v->cat_id && !App::blog()->getCategory($v->cat_id)) {
dcCore::app()->error->add(__('You must provide valid category.')); App::error()->add(__('You must provide valid category.'));
} }
// check failed // check failed
if (dcCore::app()->error->flag()) { if (App::error()->flag()) {
return true; return true;
} }
@ -103,7 +97,7 @@ class ManageFeed extends Process
Notices::addSuccessNotice(__('Feed successfully created.')); Notices::addSuccessNotice(__('Feed successfully created.'));
My::redirect(['part' => 'feed', 'feed_id' => $id]); My::redirect(['part' => 'feed', 'feed_id' => $id]);
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
return true; return true;
} }
@ -158,13 +152,13 @@ class ManageFeed extends Process
'user_id' => 'P.user_id', ]; 'user_id' => 'P.user_id', ];
# --BEHAVIOR-- adminPostsSortbyLexCombo # --BEHAVIOR-- adminPostsSortbyLexCombo
dcCore::app()->callBehavior('adminPostsSortbyLexCombo', [& $sortby_lex]); App::behavior()->callBehavior('adminPostsSortbyLexCombo', [& $sortby_lex]);
$params['no_content'] = true; $params['no_content'] = true;
$params['feed_id'] = $v->id; $params['feed_id'] = $v->id;
$params['order'] = ( $params['order'] = (
array_key_exists($sortby, $sortby_lex) ? array_key_exists($sortby, $sortby_lex) ?
dcCore::app()->con->lexFields($sortby_lex[$sortby]) : App::con()->lexFields($sortby_lex[$sortby]) :
$sortby $sortby
) . ' ' . $order; ) . ' ' . $order;
@ -174,7 +168,7 @@ class ManageFeed extends Process
$counter = $z->getPostsByFeed($params, true); $counter = $z->getPostsByFeed($params, true);
$post_list = new PostsList($posts, $counter->f(0)); $post_list = new PostsList($posts, $counter->f(0));
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
} }
} }
@ -182,7 +176,7 @@ class ManageFeed extends Process
Page::openModule( Page::openModule(
My::id(), My::id(),
( (
$v->id && isset($post_filter) && !dcCore::app()->error->flag() ? $v->id && isset($post_filter) && !App::error()->flag() ?
$post_filter->js(My::manageUrl(['part' => 'feed', 'feed_id' => $v->id], '&') . '#entries') . $post_filter->js(My::manageUrl(['part' => 'feed', 'feed_id' => $v->id], '&') . '#entries') .
My::jsLoad('feed') My::jsLoad('feed')
: '' : ''
@ -241,7 +235,7 @@ class ManageFeed extends Process
(new Input('feed_name')) (new Input('feed_name'))
->class('maximal') ->class('maximal')
->size(60) ->size(60)
->maxlenght(255) ->maxlength(255)
->value($v->name), ->value($v->name),
]), ]),
// feed_owner // feed_owner
@ -253,7 +247,7 @@ class ManageFeed extends Process
(new Input('feed_owner')) (new Input('feed_owner'))
->class('maximal') ->class('maximal')
->size(60) ->size(60)
->maxlenght(255) ->maxlength(255)
->value($v->owner), ->value($v->owner),
]), ]),
// feed_url // feed_url
@ -265,7 +259,7 @@ class ManageFeed extends Process
(new Input('feed_url')) (new Input('feed_url'))
->class('maximal') ->class('maximal')
->size(60) ->size(60)
->maxlenght(255) ->maxlength(255)
->value($v->url), ->value($v->url),
]), ]),
// feed_feed // feed_feed
@ -277,7 +271,7 @@ class ManageFeed extends Process
(new Input('feed_feed')) (new Input('feed_feed'))
->class('maximal') ->class('maximal')
->size(60) ->size(60)
->maxlenght(255) ->maxlength(255)
->value($v->feed), ->value($v->feed),
]), ]),
// feed_desc // feed_desc
@ -288,7 +282,7 @@ class ManageFeed extends Process
(new Input('feed_desc')) (new Input('feed_desc'))
->class('maximal') ->class('maximal')
->size(60) ->size(60)
->maxlenght(255) ->maxlength(255)
->value($v->desc), ->value($v->desc),
]), ]),
// feed_tags // feed_tags
@ -299,7 +293,7 @@ class ManageFeed extends Process
(new Input('feed_tags')) (new Input('feed_tags'))
->class('maximal') ->class('maximal')
->size(60) ->size(60)
->maxlenght(255) ->maxlength(255)
->value($v->tags), ->value($v->tags),
]), ]),
// feed_tweeter // feed_tweeter
@ -310,7 +304,7 @@ class ManageFeed extends Process
(new Input('feed_tweeter')) (new Input('feed_tweeter'))
->class('maximal') ->class('maximal')
->size(60) ->size(60)
->maxlenght(255) ->maxlength(255)
->value($v->tweeter), ->value($v->tweeter),
]), ]),
]), ]),
@ -385,7 +379,7 @@ class ManageFeed extends Process
->render(); ->render();
} }
if ($v->id && $v->can_view_page && isset($post_filter) && isset($post_list) && isset($posts_actions_page) && !dcCore::app()->error->flag()) { if ($v->id && $v->can_view_page && isset($post_filter) && isset($post_list) && isset($posts_actions_page) && !App::error()->flag()) {
echo '<div class="multi-part" title="' . __('Entries') . '" id="entries">'; echo '<div class="multi-part" title="' . __('Entries') . '" id="entries">';
# show posts filters # show posts filters
@ -423,7 +417,7 @@ class ManageFeed extends Process
(new Label(__('Selected entries action:'), Label::OUTSIDE_LABEL_BEFORE)) (new Label(__('Selected entries action:'), Label::OUTSIDE_LABEL_BEFORE))
->for('action'), ->for('action'),
(new Select('action')) (new Select('action'))
->items($posts_actions_page->getCombo()), ->items($posts_actions_page->getCombo() ?? []),
(new Submit('feed-action')) (new Submit('feed-action'))
->value(__('ok')), ->value(__('ok')),
... My::hiddenFields($post_filter->values()), ... My::hiddenFields($post_filter->values()),

View File

@ -1,24 +1,18 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
/** /**
* Backend feed manage page vars (type hinting). * @brief zoneclearFeedServer backend vars definition.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class ManageFeedVars class ManageFeedVars
{ {
@ -52,9 +46,9 @@ class ManageFeedVars
{ {
$z = ZoneclearFeedServer::instance(); $z = ZoneclearFeedServer::instance();
$feed_headlink = '<link rel="%s" title="%s" href="' . dcCore::app()->admin->getPageURL() . '&amp;part=feed&amp;feed_id=%s" />'; $feed_headlink = '<link rel="%s" title="%s" href="' . App::backend()->getPageURL() . '&amp;part=feed&amp;feed_id=%s" />';
$feed_link = '<a href="' . dcCore::app()->admin->getPageURL() . '&amp;part=feed&amp;feed_id=%s" title="%s">%s</a>'; $feed_link = '<a href="' . App::backend()->getPageURL() . '&amp;part=feed&amp;feed_id=%s" title="%s">%s</a>';
$lang = dcCore::app()->auth->getInfo('user_lang'); $lang = App::auth()->getInfo('user_lang');
// default values // default values
$feed_id = 0; $feed_id = 0;
@ -82,7 +76,7 @@ class ManageFeedVars
$feed = $z->getFeeds(['feed_id' => $_REQUEST['feed_id']]); $feed = $z->getFeeds(['feed_id' => $_REQUEST['feed_id']]);
if ($feed->isEmpty()) { if ($feed->isEmpty()) {
dcCore::app()->error->add(__('This feed does not exist.')); App::error()->add(__('This feed does not exist.'));
$can_view_page = false; $can_view_page = false;
} else { } else {
$row = new FeedRow($feed); $row = new FeedRow($feed);
@ -156,7 +150,7 @@ class ManageFeedVars
$feed_feed = !empty($_POST['feed_feed']) && is_string($_POST['feed_feed']) ? $_POST['feed_feed'] : $feed_feed; $feed_feed = !empty($_POST['feed_feed']) && is_string($_POST['feed_feed']) ? $_POST['feed_feed'] : $feed_feed;
$feed_lang = !empty($_POST['feed_lang']) && is_string($_POST['feed_lang']) ? $_POST['feed_lang'] : $feed_lang; $feed_lang = !empty($_POST['feed_lang']) && is_string($_POST['feed_lang']) ? $_POST['feed_lang'] : $feed_lang;
$feed_tags = !empty($_POST['feed_tags']) && is_string($_POST['feed_tags']) ? $_POST['feed_tags'] : $feed_tags; $feed_tags = !empty($_POST['feed_tags']) && is_string($_POST['feed_tags']) ? $_POST['feed_tags'] : $feed_tags;
$feed_get_tags = empty($_POST['feed_get_tags']) ? $feed_get_tags : true; $feed_get_tags = !empty($_POST['feed_get_tags']);
$feed_cat_id = !empty($_POST['feed_cat_id']) && is_numeric($_POST['feed_cat_id']) ? (int) $_POST['feed_cat_id'] : $feed_cat_id; $feed_cat_id = !empty($_POST['feed_cat_id']) && is_numeric($_POST['feed_cat_id']) ? (int) $_POST['feed_cat_id'] : $feed_cat_id;
$feed_upd_int = !empty($_POST['feed_upd_int']) && is_numeric($_POST['feed_upd_int']) ? (int) $_POST['feed_upd_int'] : $feed_upd_int; $feed_upd_int = !empty($_POST['feed_upd_int']) && is_numeric($_POST['feed_upd_int']) ? (int) $_POST['feed_upd_int'] : $feed_upd_int;
$feed_status = empty($_POST['feed_status']) ? $feed_status : 1; $feed_status = empty($_POST['feed_status']) ? $feed_status : 1;
@ -172,7 +166,7 @@ class ManageFeedVars
$this->feed = $feed_feed; $this->feed = $feed_feed;
$this->lang = $feed_lang; $this->lang = $feed_lang;
$this->tags = $feed_tags; $this->tags = $feed_tags;
$this->get_tags = $feed_get_tags; $this->get_tags = (bool) $feed_get_tags;
$this->cat_id = $feed_cat_id; $this->cat_id = $feed_cat_id;
$this->status = $feed_status; $this->status = $feed_status;
$this->upd_int = $feed_upd_int; $this->upd_int = $feed_upd_int;
@ -218,13 +212,13 @@ class ManageFeedVars
$cur->setField('feed_feed', $this->feed); $cur->setField('feed_feed', $this->feed);
$cur->setField('feed_lang', $this->lang); $cur->setField('feed_lang', $this->lang);
$cur->setField('feed_tags', $this->tags); $cur->setField('feed_tags', $this->tags);
$cur->setField('feed_get_tags', $this->get_tags); $cur->setField('feed_get_tags', (int) $this->get_tags);
$cur->setField('cat_id', $this->cat_id); $cur->setField('cat_id', $this->cat_id);
$cur->setField('feed_status', $this->status); $cur->setField('feed_status', $this->status);
$cur->setField('feed_upd_int', $this->upd_int); $cur->setField('feed_upd_int', $this->upd_int);
# --BEHAVIOR-- adminBeforeZoneclearFeedServerFeedSave - Cursor, int # --BEHAVIOR-- adminBeforeZoneclearFeedServerFeedSave - Cursor, int
dcCore::app()->callBehavior('adminBeforeZoneclearFeedServerFeedSave', $cur, $id); App::behavior()->callBehavior('adminBeforeZoneclearFeedServerFeedSave', $cur, $id);
if (!$id) { if (!$id) {
// create feed // create feed
@ -235,7 +229,7 @@ class ManageFeedVars
} }
# --BEHAVIOR-- adminAfterZoneclearFeedServerFeedSave - Cursor - int # --BEHAVIOR-- adminAfterZoneclearFeedServerFeedSave - Cursor - int
dcCore::app()->callBehavior('adminAfterZoneclearFeedServerFeedSave', $cur, $id); App::behavior()->callBehavior('adminAfterZoneclearFeedServerFeedSave', $cur, $id);
return $id; return $id;
} }

View File

@ -1,15 +1,5 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
@ -17,17 +7,33 @@ namespace Dotclear\Plugin\zoneclearFeedServer;
use Dotclear\Module\MyPlugin; use Dotclear\Module\MyPlugin;
/** /**
* This module definitions. * @brief zoneclearFeedServer My helper.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class My extends MyPlugin class My extends MyPlugin
{ {
/** @var string This module database table name */ /**
public const TABLE_NAME = \initZoneclearFeedServer::TABLE_NAME; * This module database table name.
*
* @var string TABLE_NAME
*/
public const TABLE_NAME = 'zc_feed';
/** @var string This module meta prefix */ /**
* This module meta prefix.
*
* @var string META_PREFIX
*/
public const META_PREFIX = 'zoneclearfeed_'; public const META_PREFIX = 'zoneclearfeed_';
/** @var array<int,string> This module template blocks */ /**
* This module template blocks.
*
* @var array<int,string> TPL_BLOCKS
*/
public const TPL_BLOCKS = [ public const TPL_BLOCKS = [
'Feeds', 'Feeds',
'FeedsFooter', 'FeedsFooter',
@ -35,7 +41,11 @@ class My extends MyPlugin
'FeedIf', 'FeedIf',
]; ];
/** @var array<int,string> This module template values */ /**
* This module template values.
*
* @var array<int,string> TPL_VALUES
*/
public const TPL_VALUES = [ public const TPL_VALUES = [
'FeedsCount', 'FeedsCount',
'FeedsEntriesCount', 'FeedsEntriesCount',
@ -55,8 +65,5 @@ class My extends MyPlugin
'FeedFeedURL', 'FeedFeedURL',
]; ];
public static function checkCustomContext(int $context): ?bool // Use default permissions
{
return $context == My::BACKEND ? defined('DC_CONTEXT_ADMIN') : null;
}
} }

View File

@ -1,22 +1,11 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use ArrayObject; use ArrayObject;
use dcCore; use Dotclear\App;
use dcUtils;
use Dotclear\Core\Backend\Combos; use Dotclear\Core\Backend\Combos;
use Dotclear\Core\Backend\Filter\{ use Dotclear\Core\Backend\Filter\{
Filter, Filter,
@ -27,7 +16,11 @@ use Dotclear\Helper\Html\Html;
use Exception; use Exception;
/** /**
* Backend feed posts list filters. * @brief zoneclearFeedServer backend feeds posts list filter.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class PostsFilter extends Filters class PostsFilter extends Filters
{ {
@ -45,7 +38,7 @@ class PostsFilter extends Filters
]); ]);
# --BEHAVIOR-- zcfsPostFilter # --BEHAVIOR-- zcfsPostFilter
dcCore::app()->callBehavior('zcfsPostFilter', $filters); App::behavior()->callBehavior('zcfsPostFilter', $filters);
$filters = $filters->getArrayCopy(); $filters = $filters->getArrayCopy();
@ -62,18 +55,18 @@ class PostsFilter extends Filters
$users = null; $users = null;
try { try {
$users = dcCore::app()->blog?->getPostsUsers(); $users = App::blog()->getPostsUsers();
if (is_null($users) || $users->isEmpty()) { if ($users->isEmpty()) {
return null; return null;
} }
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
return null; return null;
} }
$combo = Combos::getUsersCombo($users); $combo = Combos::getUsersCombo($users);
dcUtils::lexicalKeySort($combo); App::lexical()->lexicalKeySort($combo);
return (new Filter('user_id')) return (new Filter('user_id'))
->param() ->param()
@ -95,12 +88,12 @@ class PostsFilter extends Filters
$categories = null; $categories = null;
try { try {
$categories = dcCore::app()->blog?->getCategories(); $categories = App::blog()->getCategories();
if (is_null($categories) || $categories->isEmpty()) { if ($categories->isEmpty()) {
return null; return null;
} }
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
return null; return null;
} }
@ -149,12 +142,12 @@ class PostsFilter extends Filters
$dates = null; $dates = null;
try { try {
$dates = dcCore::app()->blog?->getDates(['type' => 'month']); $dates = App::blog()->getDates(['type' => 'month']);
if (is_null($dates) || $dates->isEmpty()) { if ($dates->isEmpty()) {
return null; return null;
} }
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->error->add($e->getMessage()); App::error()->add($e->getMessage());
return null; return null;
} }

View File

@ -1,21 +1,11 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use ArrayObject; use ArrayObject;
use dcCore; use Dotclear\App;
use Dotclear\Core\Backend\Listing\{ use Dotclear\Core\Backend\Listing\{
Listing, Listing,
Pager Pager
@ -31,7 +21,11 @@ use Dotclear\Helper\Html\Form\{
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
/** /**
* Backend feed posts lists. * @brief zoneclearFeedServer backend feed posts lists.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class PostsList extends Listing class PostsList extends Listing
{ {
@ -108,7 +102,7 @@ class PostsList extends Listing
{ {
$cat_title = (new Text('', __('None'))); $cat_title = (new Text('', __('None')));
if ($this->rs->cat_title if ($this->rs->cat_title
&& dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([dcCore::app()->auth::PERMISSION_CATEGORIES]), dcCore::app()->blog?->id) && App::auth()->check(App::auth()->makePermissions([App::auth()::PERMISSION_CATEGORIES]), App::blog()->id())
) { ) {
$cat_title = (new Link()) $cat_title = (new Link())
->href('category.php?id=' . $this->rs->cat_id) ->href('category.php?id=' . $this->rs->cat_id)
@ -155,7 +149,7 @@ class PostsList extends Listing
->class('maximal') ->class('maximal')
->items([ ->items([
(new Link()) (new Link())
->href(dcCore::app()->getPostAdminURL($this->rs->post_type, $this->rs->post_id)) ->href(App::postTypes()->getPostAdminURL($this->rs->post_type, $this->rs->post_id))
->title(Html::escapeHTML($this->rs->getURL())) ->title(Html::escapeHTML($this->rs->getURL()))
->text(Html::escapeHTML(trim(Html::clean($this->rs->post_title)))), ->text(Html::escapeHTML(trim(Html::clean($this->rs->post_title)))),
]), ]),

View File

@ -1,24 +1,18 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Core\Process; use Dotclear\Core\Process;
/** /**
* Module prepend. * @brief zoneclearFeedServer prepend class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Prepend extends Process class Prepend extends Process
{ {
@ -34,18 +28,13 @@ class Prepend extends Process
} }
// public url for page of description of the flux // public url for page of description of the flux
dcCore::app()->url->register( App::url()->register(
'zoneclearFeedsPage', 'zoneclearFeedsPage',
'zcfeeds', 'zcfeeds',
'^zcfeeds(.*?)$', '^zcfeeds(.*?)$',
[UrlHandler::class, 'zoneclearFeedsPage'] UrlHandler::zoneclearFeedsPage(...)
); );
// report zoneclearFeedServer activities
if (defined('ACTIVITY_REPORT') && ACTIVITY_REPORT == 3) {
ActivityReportActions::init();
}
return true; return true;
} }
} }

View File

@ -1,30 +1,26 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use context; use Dotclear\App;
use dcCore; use Dotclear\Core\Frontend\Ctx;
use rsExtPost;
use rsExtPostPublic;
use Dotclear\Database\MetaRecord; use Dotclear\Database\MetaRecord;
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
use Dotclear\Schema\Extension\Post;
use Dotclear\Schema\Extension\PostPublic;
/** /**
* @brief zoneclearFeedServer posts record extension.
* @ingroup zoneclearFeedServer
*
* Posts record extension to integrate feed info. * Posts record extension to integrate feed info.
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class RsExtPosts extends rsExtPost class RsExtPosts extends Post
{ {
/** @var array<string,mixed> $brother_extensions Stack posts record extensions */ /** @var array<string,mixed> $brother_extensions Stack posts record extensions */
public static array $brother_extensions = []; public static array $brother_extensions = [];
@ -39,7 +35,7 @@ class RsExtPosts extends rsExtPost
*/ */
public static function zcFeed(MetaRecord $rs, string $info): ?string public static function zcFeed(MetaRecord $rs, string $info): ?string
{ {
$meta = dcCore::app()->meta->getMetadata([ $meta = App::meta()->getMetadata([
'post_id' => $rs->f('post_id'), 'post_id' => $rs->f('post_id'),
'meta_type' => My::META_PREFIX . $info, 'meta_type' => My::META_PREFIX . $info,
'limit' => 1, 'limit' => 1,
@ -61,10 +57,10 @@ class RsExtPosts extends rsExtPost
$ext = static::$brother_extensions; $ext = static::$brother_extensions;
if (isset($ext[$type]) && is_callable($ext[$type])) { if (isset($ext[$type]) && is_callable($ext[$type])) {
$func = $ext[$type]; $func = $ext[$type];
} elseif (is_callable([rsExtPostPublic::class, $type])) { } elseif (is_callable([PostPublic::class, $type])) {
$func = [rsExtPostPublic::class, $type]; $func = [PostPublic::class, $type];
} elseif (is_callable([rsExtPost::class, $type])) { } elseif (is_callable([Post::class, $type])) {
$func = [rsExtPost::class, $type]; $func = [Post::class, $type];
} else { } else {
return ''; return '';
} }
@ -118,7 +114,7 @@ class RsExtPosts extends rsExtPost
{ {
$url = $rs->__call('zcFeed', ['url']); $url = $rs->__call('zcFeed', ['url']);
$site = $rs->__call('zcFeed', ['site']); $site = $rs->__call('zcFeed', ['site']);
$full = in_array(dcCore::app()->url->type, ZoneclearFeedServer::instance()->settings->post_title_redir); $full = in_array(App::url()->type, ZoneclearFeedServer::instance()->settings->post_title_redir);
return is_string($site) && is_string($url) && $full ? return is_string($site) && is_string($url) && $full ?
ZoneclearFeedServer::instance()::absoluteURL($site, $url) : ZoneclearFeedServer::instance()::absoluteURL($site, $url) :
@ -129,7 +125,7 @@ class RsExtPosts extends rsExtPost
* Get post content from post to feed. * Get post content from post to feed.
* *
* @param MetaRecord $rs The record instance * @param MetaRecord $rs The record instance
* @param mixed $absolute_urls Serve absolute URL (type "mixed" from rsExtPost) * @param mixed $absolute_urls Serve absolute URL (type "mixed" from Post)
* *
* @return string The post content * @return string The post content
*/ */
@ -140,14 +136,14 @@ class RsExtPosts extends rsExtPost
$content = self::zcFeedBrother('getContent', [&$rs, $absolute_urls]); $content = self::zcFeedBrother('getContent', [&$rs, $absolute_urls]);
if (is_string($url) && is_string($sitename) && $rs->f('post_type') == 'post') { if (is_string($url) && is_string($sitename) && $rs->f('post_type') == 'post') {
if (in_array(dcCore::app()->url->type, ZoneclearFeedServer::instance()->settings->post_full_tpl)) { if (in_array(App::url()->type, ZoneclearFeedServer::instance()->settings->post_full_tpl)) {
return $content . sprintf( return $content . sprintf(
'<p class="zoneclear-original"><em>%s</em></p>', '<p class="zoneclear-original"><em>%s</em></p>',
sprintf(__('Original post on <a href="%s">%s</a>'), $url, $sitename) sprintf(__('Original post on <a href="%s">%s</a>'), $url, $sitename)
); );
} }
$content = context::remove_html($content); $content = Ctx::remove_html($content);
$content = context::cut_string($content, 350); $content = Ctx::cut_string($content, 350);
$content = Html::escapeHTML($content); $content = Html::escapeHTML($content);
return sprintf( return sprintf(

View File

@ -1,21 +1,15 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
/** /**
* Module settings (type hinting). * @brief zoneclearFeedServer settings.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Settings class Settings
{ {
@ -36,10 +30,10 @@ class Settings
public readonly int $tag_case; public readonly int $tag_case;
/** @var array<int,string> */ /** @var array<int, string> */
public readonly array $post_full_tpl; public readonly array $post_full_tpl;
/** @var array<int,string> */ /** @var array<int, string> */
public readonly array $post_title_redir; public readonly array $post_title_redir;
public readonly string $user; public readonly string $user;
@ -96,9 +90,8 @@ class Settings
{ {
$s = My::settings(); $s = My::settings();
if (!is_null($s) && property_exists($this, $key) && settype($value, gettype($this->{$key})) === true) { if (property_exists($this, $key) && settype($value, gettype($this->{$key})) === true) {
$s->drop($key); $s->put($key, $value, gettype($this->{$key}));
$s->put($key, $value, gettype($this->{$key}), '', true, true);
return true; return true;
} }

View File

@ -1,30 +1,27 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use ArrayObject; use ArrayObject;
use dcCore; use Dotclear\App;
use dcTemplate; use Dotclear\Core\Frontend\Tpl;
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
use Dotclear\Helper\L10n; use Dotclear\Helper\L10n;
/** /**
* Frontend template blocks and values. * @brief zoneclearFeedServer frontend tempalte class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Template class Template
{ {
/**
* @param ArrayObject<string, mixed> $a
*/
public static function Feeds(ArrayObject $a, string $c): string public static function Feeds(ArrayObject $a, string $c): string
{ {
$lastn = -1; $lastn = -1;
@ -82,67 +79,70 @@ class Template
return return
'<?php ' . $p . '<?php ' . $p .
'dcCore::app()->ctx->feeds_params = $zcfs_params;' . "\n" . 'App::frontend()->context()->feeds_params = $zcfs_params;' . "\n" .
'$zcfs = ' . ZoneclearFeedServer::class . '::instance();' . "\n" . '$zcfs = ' . ZoneclearFeedServer::class . '::instance();' . "\n" .
'dcCore::app()->ctx->feeds = $zcfs->getFeeds($zcfs_params); unset($zcfs_params,$zcfs);' . "\n" . 'App::frontend()->context()->feeds = $zcfs->getFeeds($zcfs_params); unset($zcfs_params,$zcfs);' . "\n" .
"?>\n" . "?>\n" .
'<?php while (dcCore::app()->ctx->feeds->fetch()) : ?>' . $c . '<?php endwhile; ' . '<?php while (App::frontend()->context()->feeds->fetch()) : ?>' . $c . '<?php endwhile; ' .
'dcCore::app()->ctx->feeds = null; dcCore::app()->ctx->feeds_params = null; ?>'; 'App::frontend()->context()->feeds = null; App::frontend()->context()->feeds_params = null; ?>';
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedIf(ArrayObject $a, string $c): string public static function FeedIf(ArrayObject $a, string $c): string
{ {
$if = []; $if = [];
$operator = isset($a['operator']) && is_string($a['operator']) ? dcTemplate::getOperator($a['operator']) : '&&'; $operator = isset($a['operator']) && is_string($a['operator']) ? Tpl::getOperator($a['operator']) : '&&';
if (isset($a['type']) && is_string($a['type'])) { if (isset($a['type']) && is_string($a['type'])) {
$type = trim($a['type']); $type = trim($a['type']);
$type = !empty($type) ? $type : 'feed'; $type = !empty($type) ? $type : 'feed';
$if[] = 'dcCore::app()->ctx->feeds->feed_type == "' . addslashes($type) . '"'; $if[] = 'App::frontend()->context()->feeds->feed_type == "' . addslashes($type) . '"';
} }
if (isset($a['site_url']) && is_string($a['site_url'])) { if (isset($a['site_url']) && is_string($a['site_url'])) {
$url = trim($a['site_url']); $url = trim($a['site_url']);
if (substr($url, 0, 1) == '!') { if (substr($url, 0, 1) == '!') {
$url = substr($url, 1); $url = substr($url, 1);
$if[] = 'dcCore::app()->ctx->feeds->feed_url != "' . addslashes($url) . '"'; $if[] = 'App::frontend()->context()->feeds->feed_url != "' . addslashes($url) . '"';
} else { } else {
$if[] = 'dcCore::app()->ctx->feeds->feed_url == "' . addslashes($url) . '"'; $if[] = 'App::frontend()->context()->feeds->feed_url == "' . addslashes($url) . '"';
} }
} }
if (isset($a['feed_url']) && is_string($a['feed_url'])) { if (isset($a['feed_url']) && is_string($a['feed_url'])) {
$url = trim($a['feed_url']); $url = trim($a['feed_url']);
if (substr($url, 0, 1) == '!') { if (substr($url, 0, 1) == '!') {
$url = substr($url, 1); $url = substr($url, 1);
$if[] = 'dcCore::app()->ctx->feeds->feed_feed != "' . addslashes($url) . '"'; $if[] = 'App::frontend()->context()->feeds->feed_feed != "' . addslashes($url) . '"';
} else { } else {
$if[] = 'dcCore::app()->ctx->feeds->feed_feed == "' . addslashes($url) . '"'; $if[] = 'App::frontend()->context()->feeds->feed_feed == "' . addslashes($url) . '"';
} }
} }
if (isset($a['category']) && is_string($a['category'])) { if (isset($a['category']) && is_string($a['category'])) {
$category = addslashes(trim($a['category'])); $category = addslashes(trim($a['category']));
if (substr($category, 0, 1) == '!') { if (substr($category, 0, 1) == '!') {
$category = substr($category, 1); $category = substr($category, 1);
$if[] = '(dcCore::app()->ctx->feeds->cat_url != "' . $category . '")'; $if[] = '(App::frontend()->context()->feeds->cat_url != "' . $category . '")';
} else { } else {
$if[] = '(dcCore::app()->ctx->feeds->cat_url == "' . $category . '")'; $if[] = '(App::frontend()->context()->feeds->cat_url == "' . $category . '")';
} }
} }
if (isset($a['first'])) { if (isset($a['first'])) {
$sign = (bool) $a['first'] ? '=' : '!'; $sign = (bool) $a['first'] ? '=' : '!';
$if[] = 'dcCore::app()->ctx->feeds->index() ' . $sign . '= 0'; $if[] = 'App::frontend()->context()->feeds->index() ' . $sign . '= 0';
} }
if (isset($a['odd'])) { if (isset($a['odd'])) {
$sign = (bool) $a['odd'] ? '=' : '!'; $sign = (bool) $a['odd'] ? '=' : '!';
$if[] = '(dcCore::app()->ctx->feeds->index()+1)%2 ' . $sign . ' = 1'; $if[] = '(App::frontend()->context()->feeds->index()+1)%2 ' . $sign . ' = 1';
} }
if (isset($a['has_category'])) { if (isset($a['has_category'])) {
$sign = (bool) $a['has_category'] ? '' : '!'; $sign = (bool) $a['has_category'] ? '' : '!';
$if[] = $sign . 'dcCore::app()->ctx->feeds->cat_id'; $if[] = $sign . 'App::frontend()->context()->feeds->cat_id';
} }
if (isset($a['has_description'])) { if (isset($a['has_description'])) {
$sign = (bool) $a['has_description'] ? '' : '!'; $sign = (bool) $a['has_description'] ? '' : '!';
$if[] = $sign . 'dcCore::app()->ctx->feeds->feed_desc'; $if[] = $sign . 'App::frontend()->context()->feeds->feed_desc';
} }
return empty($if) ? return empty($if) ?
@ -150,95 +150,143 @@ class Template
'<?php if(' . implode(' ' . $operator . ' ', $if) . ') : ?>' . $c . '<?php endif; ?>'; '<?php if(' . implode(' ' . $operator . ' ', $if) . ') : ?>' . $c . '<?php endif; ?>';
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedIfFirst(ArrayObject $a): string public static function FeedIfFirst(ArrayObject $a): string
{ {
$ret = Html::escapeHTML(isset($a['return']) && is_string($a['return']) ? $a['return'] : 'first'); $ret = Html::escapeHTML(isset($a['return']) && is_string($a['return']) ? $a['return'] : 'first');
return return
'<?php if (dcCore::app()->ctx->feeds->index() == 0) { ' . '<?php if (App::frontend()->context()->feeds->index() == 0) { ' .
"echo '" . addslashes($ret) . "'; } ?>"; "echo '" . addslashes($ret) . "'; } ?>";
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedIfOdd(ArrayObject $a): string public static function FeedIfOdd(ArrayObject $a): string
{ {
$ret = Html::escapeHTML(isset($a['return']) && is_string($a['return']) ? $a['return'] : 'odd'); $ret = Html::escapeHTML(isset($a['return']) && is_string($a['return']) ? $a['return'] : 'odd');
return return
'<?php if ((dcCore::app()->ctx->feeds->index()+1)%2 == 1) { ' . '<?php if ((App::frontend()->context()->feeds->index()+1)%2 == 1) { ' .
"echo '" . addslashes($ret) . "'; } ?>"; "echo '" . addslashes($ret) . "'; } ?>";
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedDesc(ArrayObject $a): string public static function FeedDesc(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->feed_desc'); return self::getValue($a, 'App::frontend()->context()->feeds->feed_desc');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedOwner(ArrayObject $a): string public static function FeedOwner(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->feed_owner'); return self::getValue($a, 'App::frontend()->context()->feeds->feed_owner');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedCategory(ArrayObject $a): string public static function FeedCategory(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->cat_title'); return self::getValue($a, 'App::frontend()->context()->feeds->cat_title');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedCategoryID(ArrayObject $a): string public static function FeedCategoryID(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->cat_id'); return self::getValue($a, 'App::frontend()->context()->feeds->cat_id');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedCategoryURL(ArrayObject $a): string public static function FeedCategoryURL(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->blog->url.dcCore::app()->url->getBase(\'category\').\'/\'.Html::sanitizeURL(dcCore::app()->ctx->feeds->cat_url)'); return self::getValue($a, 'App::blog()->url().App::url()->getBase(\'category\').\'/\'.Html::sanitizeURL(App::frontend()->context()->feeds->cat_url)');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedCategoryShortURL(ArrayObject $a): string public static function FeedCategoryShortURL(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->cat_url'); return self::getValue($a, 'App::frontend()->context()->feeds->cat_url');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedID(ArrayObject $a): string public static function FeedID(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->feed_id'); return self::getValue($a, 'App::frontend()->context()->feeds->feed_id');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedLang(ArrayObject $a): string public static function FeedLang(ArrayObject $a): string
{ {
return empty($a['full']) ? return empty($a['full']) ?
self::getValue($a, 'dcCore::app()->ctx->feeds->feed_lang') : self::getValue($a, 'App::frontend()->context()->feeds->feed_lang') :
'<?php $langs = ' . L10n::class . '::getISOcodes(); if (isset($langs[dcCore::app()->ctx->feeds->feed_lang])) { ?>' . '<?php $langs = ' . L10n::class . '::getISOcodes(); if (isset($langs[App::frontend()->context()->feeds->feed_lang])) { ?>' .
self::getValue($a, '$langs[dcCore::app()->ctx->feeds->feed_lang]') . self::getValue($a, '$langs[App::frontend()->context()->feeds->feed_lang]') .
'<?php } else { ?>' . '<?php } else { ?>' .
self::getValue($a, 'dcCore::app()->ctx->feeds->feed_lang') . self::getValue($a, 'App::frontend()->context()->feeds->feed_lang') .
'<?php ; } unset($langs); ?>'; '<?php ; } unset($langs); ?>';
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedName(ArrayObject $a): string public static function FeedName(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->feed_name'); return self::getValue($a, 'App::frontend()->context()->feeds->feed_name');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedSiteURL(ArrayObject $a): string public static function FeedSiteURL(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->feed_url'); return self::getValue($a, 'App::frontend()->context()->feeds->feed_url');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedFeedURL(ArrayObject $a): string public static function FeedFeedURL(ArrayObject $a): string
{ {
return self::getValue($a, 'dcCore::app()->ctx->feeds->feed_feed'); return self::getValue($a, 'App::frontend()->context()->feeds->feed_feed');
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedsHeader(ArrayObject $a, string $c): string public static function FeedsHeader(ArrayObject $a, string $c): string
{ {
return '<?php if (dcCore::app()->ctx->feeds->isStart()) : ?>' . $c . '<?php endif; ?>'; return '<?php if (App::frontend()->context()->feeds->isStart()) : ?>' . $c . '<?php endif; ?>';
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedsFooter(ArrayObject $a, string $c): string public static function FeedsFooter(ArrayObject $a, string $c): string
{ {
return '<?php if (dcCore::app()->ctx->feeds->isEnd()) : ?>' . $c . '<?php endif; ?>'; return '<?php if (App::frontend()->context()->feeds->isEnd()) : ?>' . $c . '<?php endif; ?>';
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedsCount(ArrayObject $a): string public static function FeedsCount(ArrayObject $a): string
{ {
$none = isset($a['none']) && is_string($a['none']) ? addslashes($a['none']) : 'no sources'; $none = isset($a['none']) && is_string($a['none']) ? addslashes($a['none']) : 'no sources';
@ -246,7 +294,7 @@ class Template
$more = isset($a['more']) && is_string($a['more']) ? addslashes($a['more']) : '%d sources'; $more = isset($a['more']) && is_string($a['more']) ? addslashes($a['more']) : '%d sources';
return return
"<?php \$fcount = dcCore::app()->ctx->feeds->count(); \n" . "<?php \$fcount = App::frontend()->context()->feeds->count(); \n" .
"if (\$fcount == 0) {\n" . "if (\$fcount == 0) {\n" .
" printf(__('" . $none . "'),\$fcount);\n" . " printf(__('" . $none . "'),\$fcount);\n" .
"} elseif (\$fcount == 1) {\n" . "} elseif (\$fcount == 1) {\n" .
@ -256,6 +304,9 @@ class Template
'} unset($fcount); ?>'; '} unset($fcount); ?>';
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedsEntriesCount(ArrayObject $a): string public static function FeedsEntriesCount(ArrayObject $a): string
{ {
$none = isset($a['none']) && is_string($a['none']) ? addslashes($a['none']) : 'no entries'; $none = isset($a['none']) && is_string($a['none']) ? addslashes($a['none']) : 'no entries';
@ -280,6 +331,9 @@ class Template
'} unset($allfeeds,$fcount); ?>'; '} unset($allfeeds,$fcount); ?>';
} }
/**
* @param ArrayObject<string, mixed> $a
*/
public static function FeedEntriesCount(ArrayObject $a): string public static function FeedEntriesCount(ArrayObject $a): string
{ {
$none = isset($a['none']) && is_string($a['none']) ? addslashes($a['none']) : 'no entries'; $none = isset($a['none']) && is_string($a['none']) ? addslashes($a['none']) : 'no entries';
@ -288,7 +342,7 @@ class Template
return return
'<?php $zcfs = ' . ZoneclearFeedServer::class . "::instance(); \n" . '<?php $zcfs = ' . ZoneclearFeedServer::class . "::instance(); \n" .
"\$fcount = \$zc->getPostsByFeed(array('feed_id'=>dcCore::app()->ctx->feeds->feed_id),true)->f(0); \n" . "\$fcount = \$zc->getPostsByFeed(array('feed_id'=>App::frontend()->context()->feeds->feed_id),true)->f(0); \n" .
"if (\$fcount == 0) {\n" . "if (\$fcount == 0) {\n" .
" printf(__('" . $none . "'),\$fcount);\n" . " printf(__('" . $none . "'),\$fcount);\n" .
"} elseif (\$fcount == 1) {\n" . "} elseif (\$fcount == 1) {\n" .
@ -298,8 +352,11 @@ class Template
'} unset($fcount); ?>'; '} unset($fcount); ?>';
} }
/**
* @param ArrayObject<string, mixed> $a
*/
protected static function getValue(ArrayObject $a, string $v): string protected static function getValue(ArrayObject $a, string $v): string
{ {
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($a), $v) . '; ?>'; return '<?php echo ' . sprintf(App::frontend()->template()->getFilters($a), $v) . '; ?>';
} }
} }

View File

@ -1,25 +1,18 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore;
use Dotclear\Core\Process; use Dotclear\Core\Process;
use Dotclear\Plugin\Uninstaller\Uninstaller; use Dotclear\Plugin\Uninstaller\Uninstaller;
/** /**
* Plugin Uninstaller actions. * @brief zoneclearFeedServer uninstall class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Uninstall extends Process class Uninstall extends Process
{ {
@ -30,7 +23,7 @@ class Uninstall extends Process
public static function process(): bool public static function process(): bool
{ {
if (!self::status() || !dcCore::app()->plugins->moduleExists('Uninstaller')) { if (!self::status()) {
return false; return false;
} }

View File

@ -1,21 +1,10 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use dcMeta;
use Dotclear\Database\Statement\{ use Dotclear\Database\Statement\{
DeleteStatement, DeleteStatement,
SelectStatement SelectStatement
@ -29,9 +18,11 @@ use Dotclear\Plugin\Uninstaller\{
}; };
/** /**
* Plugin Uninstaller Cleaner object. * @brief zoneclearFeedServer uninstall cleaner.
* @ingroup zoneclearFeedServer
* *
* This add special action for feed posts metadata. * @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class UninstallCleaner extends CleanerParent class UninstallCleaner extends CleanerParent
{ {
@ -66,7 +57,7 @@ class UninstallCleaner extends CleanerParent
public function values(): array public function values(): array
{ {
$sql = new SelectStatement(); $sql = new SelectStatement();
$sql->from(dcCore::app()->prefix . dcMeta::META_TABLE_NAME) $sql->from(App::con()->prefix() . App::meta()::META_TABLE_NAME)
->columns([ ->columns([
$sql->as($sql->count('*'), 'counter'), $sql->as($sql->count('*'), 'counter'),
]) ])
@ -92,7 +83,7 @@ class UninstallCleaner extends CleanerParent
{ {
if ($action == 'delete_all') { if ($action == 'delete_all') {
$sql = new DeleteStatement(); $sql = new DeleteStatement();
$sql->from(dcCore::app()->prefix . dcMeta::META_TABLE_NAME) $sql->from(App::con()->prefix() . App::meta()::META_TABLE_NAME)
->where($sql->like('meta_type', My::META_PREFIX . '%')) ->where($sql->like('meta_type', My::META_PREFIX . '%'))
->delete(); ->delete();

View File

@ -1,21 +1,10 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use dcNamespace;
use Dotclear\Database\Statement\{ use Dotclear\Database\Statement\{
SelectStatement, SelectStatement,
UpdateStatement UpdateStatement
@ -23,13 +12,17 @@ use Dotclear\Database\Statement\{
use Exception; use Exception;
/** /**
* Module versions upgrades. * @brief zoneclearFeedServer upgrade class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Upgrade class Upgrade
{ {
public static function preUpgrade(): void public static function preUpgrade(): void
{ {
$current = dcCore::app()->getVersion(My::id()); $current = App::version()->getVersion(My::id());
if (!is_string($current) || empty($current)) { if (!is_string($current) || empty($current)) {
return; return;
} }
@ -59,7 +52,7 @@ class Upgrade
'zoneclearFeedServer_post_title_redir' => 'post_title_redir', 'zoneclearFeedServer_post_title_redir' => 'post_title_redir',
]; ];
$cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME); $cur = App::blogWorkspace()->openBlogWorkspaceCursor();
foreach ($setting_ids as $old => $new) { foreach ($setting_ids as $old => $new) {
$cur->clean(); $cur->clean();
$cur->setField('setting_id', $new); $cur->setField('setting_id', $new);
@ -69,13 +62,13 @@ class Upgrade
$sql $sql
->where('setting_id = ' . $sql->quote($old)) ->where('setting_id = ' . $sql->quote($old))
->and('setting_ns = ' . $sql->quote('zoneclearFeedServer')) ->and('setting_ns = ' . $sql->quote('zoneclearFeedServer'))
->update(); ->update($cur);
} }
// use json rather than serialise for settings array // use json rather than serialise for settings array
$sql = new SelectStatement(); $sql = new SelectStatement();
$record = $sql $record = $sql
->from(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME) ->from(App::con()->prefix() . App::blogWorkspace()::NS_TABLE_NAME)
->where('setting_ns = ' . $sql->quote(My::id())) ->where('setting_ns = ' . $sql->quote(My::id()))
->select(); ->select();
@ -88,7 +81,7 @@ class Upgrade
'post_title_redir' => ['feed'], 'post_title_redir' => ['feed'],
]; ];
$cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME); $cur = App::blogWorkspace()->openBlogWorkspaceCursor();
while ($record->fetch()) { while ($record->fetch()) {
foreach ($setting_values as $key => $default) { foreach ($setting_values as $key => $default) {
try { try {
@ -105,7 +98,7 @@ class Upgrade
->where('setting_id = ' . $sql->quote($key)) ->where('setting_id = ' . $sql->quote($key))
->and('setting_ns = ' . $sql->quote($record->f('setting_ns'))) ->and('setting_ns = ' . $sql->quote($record->f('setting_ns')))
->and('blog_id ' . (null === $record->f('blog_id') ? 'IS NULL ' : ('= ' . $sql->quote($record->f('blog_id'))))) ->and('blog_id ' . (null === $record->f('blog_id') ? 'IS NULL ' : ('= ' . $sql->quote($record->f('blog_id')))))
->update(); ->update($cur);
} }
} }
} }
@ -115,7 +108,7 @@ class Upgrade
// change settings type of json string to array // change settings type of json string to array
$sql = new UpdateStatement(); $sql = new UpdateStatement();
$sql $sql
->ref(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME) ->ref(App::con()->prefix() . App::blogWorkspace()::NS_TABLE_NAME)
->column('setting_type') ->column('setting_type')
->value('array') ->value('array')
->where('setting_id ' . $sql->in([ ->where('setting_id ' . $sql->in([

View File

@ -1,31 +1,25 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use dcUrlHandlers; use Dotclear\Core\Frontend\Url;
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
use Exception; use Exception;
/** /**
* Frontend URL handler. * @brief zoneclearFeedServer frontend URL handler.
* @ingroup zoneclearFeedServer
* *
* This adds public page that list feeds. * This adds public page that list feeds.
* And serve an endpoint to update feeds through js. * And serve an endpoint to update feeds through js.
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class UrlHandler extends dcUrlHandlers class UrlHandler extends Url
{ {
/** /**
* Feeds source page and update methods. * Feeds source page and update methods.
@ -38,14 +32,14 @@ class UrlHandler extends dcUrlHandlers
$s = $z->settings; $s = $z->settings;
# Not active # Not active
if (is_null(dcCore::app()->blog) || !$s->active) { if (!App::blog()->isDefined() || !$s->active) {
self::p404(); self::p404();
} }
# Update feeds (from ajax or other post resquest) # Update feeds (from ajax or other post resquest)
if ($args == '/zcfsupd' && 3 == $s->bhv_pub_upd) { if ($args == '/zcfsupd' && 3 == $s->bhv_pub_upd) {
$msg = ''; $msg = '';
if (!empty($_POST['blogId']) && Html::escapeJS(dcCore::app()->blog->id) == $_POST['blogId']) { if (!empty($_POST['blogId']) && Html::escapeJS(App::blog()->id()) == $_POST['blogId']) {
try { try {
if ($z->checkFeedsUpdate()) { if ($z->checkFeedsUpdate()) {
$msg = sprintf( $msg = sprintf(
@ -76,7 +70,7 @@ class UrlHandler extends dcUrlHandlers
# Server js # Server js
} elseif ($args == '/zcfsupd.js' && 3 == $s->bhv_pub_upd) { } elseif ($args == '/zcfsupd.js' && 3 == $s->bhv_pub_upd) {
dcCore::app()->tpl->setPath(dcCore::app()->tpl->getPath(), My::path() . '/default-templates'); App::frontend()->template()->appendPath(My::path() . '/default-templates');
self::serveDocument( self::serveDocument(
'zcfsupd.js', 'zcfsupd.js',
'text/javascript', 'text/javascript',
@ -86,17 +80,15 @@ class UrlHandler extends dcUrlHandlers
# Server feeds description page # Server feeds description page
} elseif (in_array($args, ['', '/']) && $s->pub_active) { } elseif (in_array($args, ['', '/']) && $s->pub_active) {
$theme = dcCore::app()->blog->settings->get('system')->get('theme'); $theme = App::blog()->settings()->get('system')->get('theme');
if (!is_string($theme)) { if (!is_string($theme)) {
self::p404(); self::p404();
} }
$tplset = dcCore::app()->themes->getDefine($theme)->get('tplset'); $tplset = App::themes()->getDefine(App::blog()->settings()->get('system')->get('theme'))->get('tplset');
$path = My::path() . '/default-templates/'; if (empty($tplset) || !is_dir(implode(DIRECTORY_SEPARATOR, [My::path(), 'default-templates', $tplset]))) {
if (!empty($tplset) && is_dir($path . $tplset)) { $tplset = App::config()->defaultTplset();
dcCore::app()->tpl->setPath(dcCore::app()->tpl->getPath(), $path . $tplset);
} else {
dcCore::app()->tpl->setPath(dcCore::app()->tpl->getPath(), $path . DC_DEFAULT_TPLSET);
} }
App::frontend()->template()->appendPath(implode(DIRECTORY_SEPARATOR, [My::path(), 'default-templates', $tplset]));
self::serveDocument('zcfeeds.html'); self::serveDocument('zcfeeds.html');
} }
# Unknow # Unknow

View File

@ -1,29 +1,23 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use dcCore; use Dotclear\App;
use Dotclear\Helper\Html\Html; use Dotclear\Helper\Html\Html;
use Dotclear\Plugin\widgets\WidgetsStack; use Dotclear\Plugin\widgets\WidgetsStack;
use Dotclear\Plugin\widgets\WidgetsElement; use Dotclear\Plugin\widgets\WidgetsElement;
/** /**
* Widgets. * @brief zoneclearFeedServer widgets.
* @ingroup zoneclearFeedServer
* *
* A widget to list feeds source. * A widget to list feeds source.
* A widget to list feeds statistics. * A widget to list feeds statistics.
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class Widgets class Widgets
{ {
@ -36,7 +30,7 @@ class Widgets
->create( ->create(
'zcfssource', 'zcfssource',
__('Feeds server: sources'), __('Feeds server: sources'),
[self::class, 'publicSource'], self::publicSource(...),
null, null,
__('List sources of feeds') __('List sources of feeds')
) )
@ -85,7 +79,7 @@ class Widgets
->create( ->create(
'zcfsnumber', 'zcfsnumber',
__('Feeds server: numbers'), __('Feeds server: numbers'),
[self::class, 'publicNumber'], self::publicNumber(...),
null, null,
__('Show some numbers about feeds') __('Show some numbers about feeds')
) )
@ -140,7 +134,7 @@ class Widgets
if ($w->__get('offline') if ($w->__get('offline')
|| !$s->active || !$s->active
|| !$w->checkHomeOnly(dcCore::app()->url->type) || !$w->checkHomeOnly(App::url()->type)
) { ) {
return ''; return '';
} }
@ -173,7 +167,7 @@ class Widgets
if ($w->__get('pagelink') && $s->pub_active) { if ($w->__get('pagelink') && $s->pub_active) {
$pub = sprintf( $pub = sprintf(
'<p><strong><a href="%s">%s</a></strong></p>', '<p><strong><a href="%s">%s</a></strong></p>',
dcCore::app()->blog?->url . dcCore::app()->url->getBase('zoneclearFeedsPage'), App::blog()->url() . App::url()->getBase('zoneclearFeedsPage'),
Html::escapeHTML(is_string($w->__get('pagelink')) ? $w->__get('pagelink') : '') Html::escapeHTML(is_string($w->__get('pagelink')) ? $w->__get('pagelink') : '')
); );
} }
@ -199,7 +193,7 @@ class Widgets
if ($w->__get('offline') if ($w->__get('offline')
|| !$s->active || !$s->active
|| !$w->checkHomeOnly(dcCore::app()->url->type) || !$w->checkHomeOnly(App::url()->type)
) { ) {
return ''; return '';
} }
@ -221,7 +215,7 @@ class Widgets
if ($s->pub_active) { if ($s->pub_active) {
$text = sprintf( $text = sprintf(
'<a href="%s">%s</a>', '<a href="%s">%s</a>',
dcCore::app()->blog?->url . dcCore::app()->url->getBase('zoneclearFeedsPage'), App::blog()->url() . App::url()->getBase('zoneclearFeedsPage'),
$text $text
); );
} }

View File

@ -1,26 +1,11 @@
<?php <?php
/**
* @brief zoneclearFeedServer, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis, BG, Pierre Van Glabeke
*
* @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\zoneclearFeedServer; namespace Dotclear\Plugin\zoneclearFeedServer;
use ArrayObject; use ArrayObject;
use dcAuth; use Dotclear\App;
use dcBlog;
use dcCategories;
use dcCore;
use dcMeta;
use dcUtils;
use Dotclear\Database\{ use Dotclear\Database\{
Cursor, Cursor,
MetaRecord MetaRecord
@ -44,29 +29,61 @@ use Dotclear\Helper\Text;
use Exception; use Exception;
/** /**
* Main module class. * @brief zoneclearFeedServer main class.
* @ingroup zoneclearFeedServer
*
* @author Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/ */
class ZoneclearFeedServer class ZoneclearFeedServer
{ {
/** @var int Net HTTP feed reader timeout */ /**
* Net HTTP timeout.
*
* @var int NET_HTTP_TIMEOUT
*/
public const NET_HTTP_TIMEOUT = 5; public const NET_HTTP_TIMEOUT = 5;
/** @var string Net HTTP feed reader agent */ /**
* Net HTTP feed reader agent.
*
* @var string NET_HTTP_AGENT
*/
public const NET_HTTP_AGENT = 'zoneclearFeedServer - http://zoneclear.org'; public const NET_HTTP_AGENT = 'zoneclearFeedServer - http://zoneclear.org';
/** @var int Net HTTP feed reader max redirect */ /**
* Net HTTP feed reader max redirect.
*
* @var int NET_HTTP_MAX_REDIRECT
*/
public const NET_HTTP_MAX_REDIRECT = 2; public const NET_HTTP_MAX_REDIRECT = 2;
/** @var ZoneclearFeedServer Self instance */ /**
* Self instance.
*
* @var ZoneclearFeedServer $instance
*/
private static $instance; private static $instance;
/** @var Settings The settings instance */ /**
* Settings.
*
* @var Settings $settings
*/
public readonly Settings $settings; public readonly Settings $settings;
/** @var null|string $lock File lock for update */ /**
* File lock for update.
*
* @var null|string $lock
*/
private static $lock = null; private static $lock = null;
/** @var null|string $user Affiliate user ID */ /**
* Affiliate user ID.
*
* @var null|string $user
*/
private $user = null; private $user = null;
/** /**
@ -98,7 +115,7 @@ class ZoneclearFeedServer
*/ */
public function openCursor(): Cursor public function openCursor(): Cursor
{ {
return dcCore::app()->con->openCursor(dcCore::app()->prefix . My::TABLE_NAME); return App::con()->openCursor(App::con()->prefix() . My::TABLE_NAME);
} }
/** /**
@ -109,7 +126,7 @@ class ZoneclearFeedServer
*/ */
public function updateFeed(int $id, Cursor $cur): void public function updateFeed(int $id, Cursor $cur): void
{ {
dcCore::app()->con->writeLock(dcCore::app()->prefix . My::TABLE_NAME); App::con()->writeLock(App::con()->prefix() . My::TABLE_NAME);
try { try {
if ($id < 1) { if ($id < 1) {
@ -121,18 +138,18 @@ class ZoneclearFeedServer
$cur->update(sprintf( $cur->update(sprintf(
"WHERE feed_id = %s AND blog_id = '%s' ", "WHERE feed_id = %s AND blog_id = '%s' ",
$id, $id,
dcCore::app()->con->escapeStr((string) dcCore::app()->blog?->id) App::con()->escapeStr(App::blog()->id())
)); ));
dcCore::app()->con->unlock(); App::con()->unlock();
$this->trigger(); $this->trigger();
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->con->unlock(); App::con()->unlock();
throw $e; throw $e;
} }
# --BEHAVIOR-- zoneclearFeedServerAfterUpdateFeed -- Cursor, int # --BEHAVIOR-- zoneclearFeedServerAfterUpdateFeed -- Cursor, int
dcCore::app()->callBehavior('zoneclearFeedServerAfterUpdateFeed', $cur, $id); App::behavior()->callBehavior('zoneclearFeedServerAfterUpdateFeed', $cur, $id);
} }
/** /**
@ -144,20 +161,20 @@ class ZoneclearFeedServer
*/ */
public function addFeed(Cursor $cur): int public function addFeed(Cursor $cur): int
{ {
dcCore::app()->con->writeLock(dcCore::app()->prefix . My::TABLE_NAME); App::con()->writeLock(App::con()->prefix() . My::TABLE_NAME);
try { try {
$cur->setField('feed_id', $this->getNextId()); $cur->setField('feed_id', $this->getNextId());
$cur->setField('blog_id', dcCore::app()->con->escapeStr((string) dcCore::app()->blog?->id)); $cur->setField('blog_id', App::con()->escapeStr(App::blog()->id()));
$cur->setField('feed_creadt', date('Y-m-d H:i:s')); $cur->setField('feed_creadt', date('Y-m-d H:i:s'));
$this->getFeedCursor($cur); $this->getFeedCursor($cur);
$cur->insert(); $cur->insert();
dcCore::app()->con->unlock(); App::con()->unlock();
$this->trigger(); $this->trigger();
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->con->unlock(); App::con()->unlock();
throw $e; throw $e;
} }
@ -165,7 +182,7 @@ class ZoneclearFeedServer
$id = is_numeric($cur->getField('feed_id')) ? (int) $cur->getField('feed_id') : 0; $id = is_numeric($cur->getField('feed_id')) ? (int) $cur->getField('feed_id') : 0;
# --BEHAVIOR-- zoneclearFeedServerAfterAddFeed -- Cursor, int # --BEHAVIOR-- zoneclearFeedServerAfterAddFeed -- Cursor, int
dcCore::app()->callBehavior('zoneclearFeedServerAfterAddFeed', $cur, $id); App::behavior()->callBehavior('zoneclearFeedServerAfterAddFeed', $cur, $id);
return $id; return $id;
} }
@ -193,7 +210,7 @@ class ZoneclearFeedServer
} }
$cur = $this->openCursor(); $cur = $this->openCursor();
dcCore::app()->con->writeLock(dcCore::app()->prefix . My::TABLE_NAME); App::con()->writeLock(App::con()->prefix() . My::TABLE_NAME);
$cur->setField('feed_upddt', date('Y-m-d H:i:s')); $cur->setField('feed_upddt', date('Y-m-d H:i:s'));
$cur->setField('feed_status', (int) $enable); $cur->setField('feed_status', (int) $enable);
@ -204,18 +221,18 @@ class ZoneclearFeedServer
$cur->update(sprintf( $cur->update(sprintf(
"WHERE feed_id = %s AND blog_id = '%s' ", "WHERE feed_id = %s AND blog_id = '%s' ",
$id, $id,
dcCore::app()->con->escapeStr((string) dcCore::app()->blog?->id) App::con()->escapeStr(App::blog()->id())
)); ));
dcCore::app()->con->unlock(); App::con()->unlock();
$this->trigger(); $this->trigger();
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->con->unlock(); App::con()->unlock();
throw $e; throw $e;
} }
# --BEHAVIOR-- zoneclearFeedServerAfterEnableFeed -- int, bool, int # --BEHAVIOR-- zoneclearFeedServerAfterEnableFeed -- int, bool, int
dcCore::app()->callBehavior('zoneclearFeedServerAfterEnableFeed', $id, $enable, $time); App::behavior()->callBehavior('zoneclearFeedServerAfterEnableFeed', $id, $enable, $time);
} }
# #
@ -231,12 +248,12 @@ class ZoneclearFeedServer
} }
# --BEHAVIOR-- zoneclearFeedServerBeforeDeleteFeed -- int # --BEHAVIOR-- zoneclearFeedServerBeforeDeleteFeed -- int
dcCore::app()->callBehavior('zoneclearFeedServerBeforeDeleteFeed', $id); App::behavior()->callBehavior('zoneclearFeedServerBeforeDeleteFeed', $id);
$sql = new DeleteStatement(); $sql = new DeleteStatement();
$sql->from(dcCore::app()->prefix . My::TABLE_NAME) $sql->from(App::con()->prefix() . My::TABLE_NAME)
->where('feed_id ' . $sql->in($id)) ->where('feed_id ' . $sql->in($id))
->and('blog_id = ' . $sql->quote((string) dcCore::app()->blog?->id)) ->and('blog_id = ' . $sql->quote(App::blog()->id()))
->delete(); ->delete();
$this->trigger(); $this->trigger();
@ -253,7 +270,7 @@ class ZoneclearFeedServer
public static function deletePostsMeta(?int $id): void public static function deletePostsMeta(?int $id): void
{ {
$sql = new DeleteStatement(); $sql = new DeleteStatement();
$sql->from(dcCore::app()->prefix . dcMeta::META_TABLE_NAME) $sql->from(App::con()->prefix() . App::meta()::META_TABLE_NAME)
->where('meta_type ' . $sql->in([ ->where('meta_type ' . $sql->in([
My::META_PREFIX . 'url', My::META_PREFIX . 'url',
My::META_PREFIX . 'author', My::META_PREFIX . 'author',
@ -272,8 +289,8 @@ class ZoneclearFeedServer
/** /**
* Get related posts. * Get related posts.
* *
* @param array<string,int|string|array> $params The query params * @param array<string, mixed> $params The query params
* @param bool $count_only Return only result count * @param bool $count_only Return only result count
* *
* @return MetaRecord The record instance * @return MetaRecord The record instance
*/ */
@ -287,27 +304,25 @@ class ZoneclearFeedServer
$sql->join( $sql->join(
(new JoinStatement()) (new JoinStatement())
->left() ->left()
->from(dcCore::app()->prefix . dcMeta::META_TABLE_NAME . ' F') ->from(App::con()->prefix() . App::meta()::META_TABLE_NAME . ' F')
->on('P.post_id = F.post_id') ->on('P.post_id = F.post_id')
->statement() ->statement()
); );
$params['sql'] = "AND P.blog_id = '" . dcCore::app()->con->escapeStr((string) dcCore::app()->blog?->id) . "' " . $params['sql'] = "AND P.blog_id = '" . App::con()->escapeStr(App::blog()->id()) . "' " .
"AND F.meta_type = '" . My::META_PREFIX . "id' " . "AND F.meta_type = '" . My::META_PREFIX . "id' " .
"AND F.meta_id = '" . dcCore::app()->con->escapeStr((string) $params['feed_id']) . "' "; "AND F.meta_id = '" . App::con()->escapeStr((string) $params['feed_id']) . "' ";
unset($params['feed_id']); unset($params['feed_id']);
$rs = dcCore::app()->blog?->getPosts($params, $count_only, $sql); return App::blog()->getPosts($params, $count_only, $sql);
return is_null($rs) ? MetaRecord::newFromArray([]) : $rs;
} }
/** /**
* Get feed record. * Get feed record.
* *
* @param array<string,int|string|array> $params The query params * @param array<string, mixed> $params The query params
* @param bool $count_only Return only result count * @param bool $count_only Return only result count
* *
* @return MetaRecord The record instance * @return MetaRecord The record instance
*/ */
@ -332,17 +347,17 @@ class ZoneclearFeedServer
'C.cat_title, C.cat_url, C.cat_desc '; 'C.cat_title, C.cat_url, C.cat_desc ';
} }
$strReq .= 'FROM ' . dcCore::app()->prefix . My::TABLE_NAME . ' Z ' . $strReq .= 'FROM ' . App::con()->prefix() . My::TABLE_NAME . ' Z ' .
'LEFT OUTER JOIN ' . dcCore::app()->prefix . dcCategories::CATEGORY_TABLE_NAME . ' C ON Z.cat_id = C.cat_id '; 'LEFT OUTER JOIN ' . App::con()->prefix() . App::categories()::CATEGORY_TABLE_NAME . ' C ON Z.cat_id = C.cat_id ';
if (!empty($params['from']) && is_string($params['from'])) { if (!empty($params['from']) && is_string($params['from'])) {
$strReq .= $params['from'] . ' '; $strReq .= $params['from'] . ' ';
} }
$strReq .= "WHERE Z.blog_id = '" . dcCore::app()->con->escapeStr((string) dcCore::app()->blog?->id) . "' "; $strReq .= "WHERE Z.blog_id = '" . App::con()->escapeStr(App::blog()->id()) . "' ";
if (isset($params['feed_type']) && is_string($params['feed_type'])) { if (isset($params['feed_type']) && is_string($params['feed_type'])) {
$strReq .= "AND Z.feed_type = '" . dcCore::app()->con->escapeStr((string) $params['feed_type']) . "' "; $strReq .= "AND Z.feed_type = '" . App::con()->escapeStr((string) $params['feed_type']) . "' ";
} else { } else {
$strReq .= "AND Z.feed_type = 'feed' "; $strReq .= "AND Z.feed_type = 'feed' ";
} }
@ -353,21 +368,21 @@ class ZoneclearFeedServer
} elseif (is_numeric($params['feed_id'])) { } elseif (is_numeric($params['feed_id'])) {
$params['feed_id'] = [(int) $params['feed_id']]; $params['feed_id'] = [(int) $params['feed_id']];
} }
$strReq .= 'AND Z.feed_id ' . dcCore::app()->con->in($params['feed_id']); $strReq .= 'AND Z.feed_id ' . App::con()->in($params['feed_id']);
} }
if (isset($params['feed_feed']) && is_string($params['feed_feed'])) { if (isset($params['feed_feed']) && is_string($params['feed_feed'])) {
$strReq .= "AND Z.feed_feed = '" . dcCore::app()->con->escapeStr((string) $params['feed_feed']) . "' "; $strReq .= "AND Z.feed_feed = '" . App::con()->escapeStr((string) $params['feed_feed']) . "' ";
} }
if (isset($params['feed_url']) && is_string($params['feed_url'])) { if (isset($params['feed_url']) && is_string($params['feed_url'])) {
$strReq .= "AND Z.feed_url = '" . dcCore::app()->con->escapeStr((string) $params['feed_url']) . "' "; $strReq .= "AND Z.feed_url = '" . App::con()->escapeStr((string) $params['feed_url']) . "' ";
} }
if (isset($params['feed_status'])) { if (isset($params['feed_status'])) {
$strReq .= 'AND Z.feed_status = ' . ((int) $params['feed_status']) . ' '; $strReq .= 'AND Z.feed_status = ' . ((int) $params['feed_status']) . ' ';
} }
if (!empty($params['q']) && is_string($params['q'])) { if (!empty($params['q']) && is_string($params['q'])) {
$q = dcCore::app()->con->escapeStr((string) str_replace('*', '%', strtolower($params['q']))); $q = App::con()->escapeStr((string) str_replace('*', '%', strtolower($params['q'])));
$strReq .= "AND LOWER(Z.feed_name) LIKE '" . $q . "' "; $strReq .= "AND LOWER(Z.feed_name) LIKE '" . $q . "' ";
} }
@ -377,7 +392,7 @@ class ZoneclearFeedServer
if (!$count_only) { if (!$count_only) {
if (!empty($params['order']) && is_string($params['order'])) { if (!empty($params['order']) && is_string($params['order'])) {
$strReq .= 'ORDER BY ' . dcCore::app()->con->escapeStr((string) $params['order']) . ' '; $strReq .= 'ORDER BY ' . App::con()->escapeStr((string) $params['order']) . ' ';
} else { } else {
$strReq .= 'ORDER BY Z.feed_upddt DESC '; $strReq .= 'ORDER BY Z.feed_upddt DESC ';
} }
@ -388,11 +403,11 @@ class ZoneclearFeedServer
$params['limit'] = (int) $params['limit']; $params['limit'] = (int) $params['limit'];
} }
if (is_int($params['limit']) || is_array($params['limit'])) { if (is_int($params['limit']) || is_array($params['limit'])) {
$strReq .= dcCore::app()->con->limit($params['limit']); $strReq .= App::con()->limit($params['limit']);
} }
} }
return new MetaRecord(dcCore::app()->con->select($strReq)); return new MetaRecord(App::con()->select($strReq));
} }
/** /**
@ -405,7 +420,7 @@ class ZoneclearFeedServer
$sql = new SelectStatement(); $sql = new SelectStatement();
$rs = $sql $rs = $sql
->column($sql->max('feed_id')) ->column($sql->max('feed_id'))
->from(dcCore::app()->prefix . My::TABLE_NAME) ->from(App::con()->prefix() . My::TABLE_NAME)
->select(); ->select();
return (int) $rs?->f(0) + 1; return (int) $rs?->f(0) + 1;
@ -420,14 +435,14 @@ class ZoneclearFeedServer
{ {
try { try {
# Cache writable ? # Cache writable ?
if (!is_writable(DC_TPL_CACHE)) { if (!is_writable(App::config()->cacheRoot())) {
throw new Exception("Can't write in cache fodler"); throw new Exception("Can't write in cache fodler");
} }
# Set file path # Set file path
$f_md5 = md5((string) dcCore::app()->blog?->id); $f_md5 = md5(App::blog()->id());
$file = sprintf( $file = sprintf(
'%s/%s/%s/%s/%s.txt', '%s/%s/%s/%s/%s.txt',
DC_TPL_CACHE, App::config()->cacheRoot(),
My::id(), My::id(),
substr($f_md5, 0, 2), substr($f_md5, 0, 2),
substr($f_md5, 2, 2), substr($f_md5, 2, 2),
@ -480,7 +495,7 @@ class ZoneclearFeedServer
return false; return false;
} }
$tz = dcCore::app()->blog?->settings->get('system')->get('blog_timezone'); $tz = App::blog()->settings()->get('system')->get('blog_timezone');
Date::setTZ(is_string($tz) ? $tz : 'UTC'); Date::setTZ(is_string($tz) ? $tz : 'UTC');
$time = time(); $time = time();
@ -500,8 +515,8 @@ class ZoneclearFeedServer
$i = 0; $i = 0;
$cur_post = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcBlog::POST_TABLE_NAME); $cur_post = App::blog()->openPostCursor();
$cur_meta = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcMeta::META_TABLE_NAME); $cur_meta = App::meta()->openMetaCursor();
while ($f->fetch()) { while ($f->fetch()) {
$row = new FeedRow($f); $row = new FeedRow($f);
@ -540,7 +555,7 @@ class ZoneclearFeedServer
# Set update time of this feed # Set update time of this feed
$this->enableFeed($row->id, (bool) $row->status, $time); $this->enableFeed($row->id, (bool) $row->status, $time);
dcCore::app()->con->begin(); App::con()->begin();
foreach ($feed->items as $item) { foreach ($feed->items as $item) {
$item_TS = $item->TS ? $item->TS : $time; $item_TS = $item->TS ? $item->TS : $time;
@ -555,7 +570,7 @@ class ZoneclearFeedServer
continue; continue;
} }
$item_link = dcCore::app()->con->escapeStr((string) $item_link); $item_link = App::con()->escapeStr((string) $item_link);
$is_new_published_entry = false; $is_new_published_entry = false;
# Not updated since last visit # Not updated since last visit
@ -576,15 +591,15 @@ class ZoneclearFeedServer
'P.post_id', 'P.post_id',
'P.post_status', 'P.post_status',
]) ])
->from($sql->as(dcCore::app()->prefix . dcBlog::POST_TABLE_NAME, 'P')) ->from($sql->as(App::con()->prefix() . App::blog()::POST_TABLE_NAME, 'P'))
->join( ->join(
(new JoinStatement()) (new JoinStatement())
->inner() ->inner()
->from($sql->as(dcCore::app()->prefix . dcMeta::META_TABLE_NAME, 'M')) ->from($sql->as(App::con()->prefix() . App::meta()::META_TABLE_NAME, 'M'))
->on('P.post_id = M.post_id') ->on('P.post_id = M.post_id')
->statement() ->statement()
) )
->where('blog_id = ' . $sql->quote((string) dcCore::app()->blog?->id)) ->where('blog_id = ' . $sql->quote(App::blog()->id()))
->and("meta_type = '" . My::META_PREFIX . "url'") ->and("meta_type = '" . My::META_PREFIX . "url'")
->and('meta_id = ' . $sql->quote($item_link)) ->and('meta_id = ' . $sql->quote($item_link))
->select(); ->select();
@ -609,14 +624,14 @@ class ZoneclearFeedServer
# Create entry # Create entry
if ($old_post->isEmpty()) { if ($old_post->isEmpty()) {
# Post # Post
$cur_post->setField('user_id', dcCore::app()->auth->userID()); $cur_post->setField('user_id', App::auth()->userID());
$cur_post->setField('post_format', 'xhtml'); $cur_post->setField('post_format', 'xhtml');
$cur_post->setField('post_status', $s->post_status_new); $cur_post->setField('post_status', $s->post_status_new ? App::blog()::POST_PUBLISHED : App::blog()::POST_UNPUBLISHED);
$cur_post->setField('post_open_comment', 0); $cur_post->setField('post_open_comment', 0);
$cur_post->setField('post_open_tb', 0); $cur_post->setField('post_open_tb', 0);
$post_id = dcCore::app()->auth->sudo( $post_id = App::auth()->sudo(
[dcCore::app()->blog, 'addPost'], App::blog()->addPost(...),
$cur_post $cur_post
); );
@ -629,22 +644,22 @@ class ZoneclearFeedServer
} else { } else {
$post_id = is_numeric($old_post->f('post_id')) ? (int) $old_post->f('post_id') : 0; $post_id = is_numeric($old_post->f('post_id')) ? (int) $old_post->f('post_id') : 0;
dcCore::app()->auth->sudo( App::auth()->sudo(
[dcCore::app()->blog, 'updPost'], App::blog()->updPost(...),
$post_id, $post_id,
$cur_post $cur_post
); );
# Quick delete old meta # Quick delete old meta
$sql = new DeleteStatement(); $sql = new DeleteStatement();
$sql->from(dcCore::app()->prefix . dcMeta::META_TABLE_NAME) $sql->from(App::con()->prefix() . App::meta()::META_TABLE_NAME)
->where('post_id = ' . $post_id) ->where('post_id = ' . $post_id)
->and($sql->like('meta_type', My::META_PREFIX . '%')) ->and($sql->like('meta_type', My::META_PREFIX . '%'))
->delete(); ->delete();
# Delete old tags # Delete old tags
dcCore::app()->auth->sudo( App::auth()->sudo(
[dcCore::app()->meta, 'delPostMeta'], App::meta()->delPostMeta(...),
$post_id, $post_id,
'tag' 'tag'
); );
@ -683,11 +698,11 @@ class ZoneclearFeedServer
$cur_meta->insert(); $cur_meta->insert();
# Add new tags # Add new tags
$tags = dcCore::app()->meta->splitMetaValues($row->tags); $tags = App::meta()->splitMetaValues($row->tags);
if ($row->get_tags) { if ($row->get_tags) {
# Some feed subjects contains more than one tag # Some feed subjects contains more than one tag
foreach ($item->subject as $subjects) { foreach ($item->subject as $subjects) {
$tmp = dcCore::app()->meta->splitMetaValues($subjects); $tmp = App::meta()->splitMetaValues($subjects);
$tags = array_merge($tags, $tmp); $tags = array_merge($tags, $tmp);
} }
$tags = array_unique($tags); $tags = array_unique($tags);
@ -709,33 +724,33 @@ class ZoneclearFeedServer
} }
if (!in_array($tag, $formated_tags)) { if (!in_array($tag, $formated_tags)) {
$formated_tags[] = $tag; $formated_tags[] = $tag;
dcCore::app()->auth->sudo( App::auth()->sudo(
[dcCore::app()->meta, 'delPostMeta'], App::meta()->delPostMeta(...),
$post_id, $post_id,
'tag', 'tag',
dcMeta::sanitizeMetaID($tag) App::meta()::sanitizeMetaID($tag)
); );
dcCore::app()->auth->sudo( App::auth()->sudo(
[dcCore::app()->meta, 'setPostMeta'], App::meta()->setPostMeta(...),
$post_id, $post_id,
'tag', 'tag',
dcMeta::sanitizeMetaID($tag) App::meta()::sanitizeMetaID($tag)
); );
} }
} }
} catch (Exception $e) { } catch (Exception $e) {
dcCore::app()->con->rollback(); App::con()->rollback();
$this->enableUser(false); $this->enableUser(false);
$this->unlockUpdate(); $this->unlockUpdate();
throw $e; throw $e;
} }
} }
dcCore::app()->con->commit(); App::con()->commit();
} }
# --BEHAVIOR-- zoneclearFeedServerAfterCheckFeedUpdate -- FeedRow # --BEHAVIOR-- zoneclearFeedServerAfterCheckFeedUpdate -- FeedRow
dcCore::app()->callBehavior('zoneclearFeedServerAfterCheckFeedUpdate', $row); App::behavior()->callBehavior('zoneclearFeedServerAfterCheckFeedUpdate', $row);
} }
} }
if ($enabled) { if ($enabled) {
@ -756,21 +771,18 @@ class ZoneclearFeedServer
# Enable # Enable
if ($enable) { if ($enable) {
// backup current user // backup current user
if (!is_null(dcCore::app()->auth->userID()) && !is_string(dcCore::app()->auth->userID())) { if (!App::auth()->userID()) {
throw new Exception('Unable to backup user'); throw new Exception('Unable to backup user');
} }
$this->user = dcCore::app()->auth->userID(); $this->user = App::auth()->userID();
// set zcfs posts user // set zcfs posts user
if (!dcCore::app()->auth->checkUser($this->settings->user)) { if (!App::auth()->checkUser($this->settings->user)) {
throw new Exception('Unable to set user'); throw new Exception('Unable to set user');
} }
# Disable # Disable
} else { } else {
// auth on branch My goes readonly
//dcCore::app()->auth = null;
//dcCore::app()->auth = new dcAuth();
// restore current user // restore current user
dcCore::app()->auth->checkUser($this->user ?? ''); App::auth()->checkUser($this->user ?? '');
} }
} }
@ -785,7 +797,7 @@ class ZoneclearFeedServer
{ {
try { try {
$feed_reader = new Reader(); $feed_reader = new Reader();
$feed_reader->setCacheDir(DC_TPL_CACHE); $feed_reader->setCacheDir(App::config()->cacheRoot());
$feed_reader->setTimeout(self::NET_HTTP_TIMEOUT); $feed_reader->setTimeout(self::NET_HTTP_TIMEOUT);
$feed_reader->setMaxRedirects(self::NET_HTTP_MAX_REDIRECT); $feed_reader->setMaxRedirects(self::NET_HTTP_MAX_REDIRECT);
$feed_reader->setUserAgent(self::NET_HTTP_AGENT); $feed_reader->setUserAgent(self::NET_HTTP_AGENT);
@ -801,7 +813,7 @@ class ZoneclearFeedServer
*/ */
private function trigger(): void private function trigger(): void
{ {
dcCore::app()->blog?->triggerBlog(); App::blog()->triggerBlog();
} }
/** /**
@ -864,7 +876,7 @@ class ZoneclearFeedServer
# Get super admins # Get super admins
$sql = new SelectStatement(); $sql = new SelectStatement();
$rs = $sql $rs = $sql
->from(dcCore::app()->prefix . dcAuth::USER_TABLE_NAME) ->from(App::con()->prefix() . App::auth()::USER_TABLE_NAME)
->columns([ ->columns([
'user_id', 'user_id',
'user_super', 'user_super',
@ -878,7 +890,7 @@ class ZoneclearFeedServer
if (!is_null($rs) && !$rs->isEmpty()) { if (!is_null($rs) && !$rs->isEmpty()) {
while ($rs->fetch()) { while ($rs->fetch()) {
$user_cn = dcUtils::getUserCN( $user_cn = App::users()->getUserCN(
$rs->f('user_id'), $rs->f('user_id'),
$rs->f('user_name'), $rs->f('user_name'),
$rs->f('user_firstname'), $rs->f('user_firstname'),
@ -898,22 +910,22 @@ class ZoneclearFeedServer
'U.user_firstname', 'U.user_firstname',
'U.user_displayname', 'U.user_displayname',
]) ])
->from($sql->as(dcCore::app()->prefix . dcAuth::USER_TABLE_NAME, 'U')) ->from($sql->as(App::con()->prefix() . App::auth()::USER_TABLE_NAME, 'U'))
->join( ->join(
(new JoinStatement()) (new JoinStatement())
->left() ->left()
->from($sql->as(dcCore::app()->prefix . dcAuth::PERMISSIONS_TABLE_NAME, 'P')) ->from($sql->as(App::con()->prefix() . App::auth()::PERMISSIONS_TABLE_NAME, 'P'))
->on('U.user_id = P.user_id') ->on('U.user_id = P.user_id')
->statement() ->statement()
) )
->where('U.user_status = 1') ->where('U.user_status = 1')
->and('P.blog_id = ' . $sql->quote((string) dcCore::app()->blog?->id)) ->and('P.blog_id = ' . $sql->quote(App::blog()->id()))
->and($sql->like('P.permissions', '%|admin|%')) ->and($sql->like('P.permissions', '%|admin|%'))
->select(); ->select();
if (!is_null($rs) && !$rs->isEmpty()) { if (!is_null($rs) && !$rs->isEmpty()) {
while ($rs->fetch()) { while ($rs->fetch()) {
$user_cn = dcUtils::getUserCN( $user_cn = App::users()->getUserCN(
$rs->f('user_id'), $rs->f('user_id'),
$rs->f('user_name'), $rs->f('user_name'),
$rs->f('user_firstname'), $rs->f('user_firstname'),
@ -943,7 +955,7 @@ class ZoneclearFeedServer
]); ]);
# --BEHAVIOR-- zoneclearFeedServerPublicUrlTypes -- ArrayObject # --BEHAVIOR-- zoneclearFeedServerPublicUrlTypes -- ArrayObject
dcCore::app()->callBehavior('zoneclearFeedServerPublicUrlTypes', $types); App::behavior()->callBehavior('zoneclearFeedServerPublicUrlTypes', $types);
return $types->getArrayCopy(); return $types->getArrayCopy();
} }