Compare commits

...

10 Commits

24 changed files with 652 additions and 381 deletions

View File

@ -1,3 +1,12 @@
0.7 - 2023.05.13
* require dotclear 2.26
* add plugin Uninstaller features
* release for dotclear 2.26 stable
0.6 - 2023.04.26
* require dotclear 2.26
* use namespace
0.5 - 2023.01.05
* update to dotclear 2.24
* use anonymous functions

View File

@ -3,7 +3,7 @@
[![Release](https://img.shields.io/github/v/release/JcDenis/comListe)](https://github.com/JcDenis/comListe/releases)
[![Date](https://img.shields.io/github/release-date/JcDenis/comListe)](https://github.com/JcDenis/comListe/releases)
[![Issues](https://img.shields.io/github/issues/JcDenis/comListe)](https://github.com/JcDenis/comListe/issues)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.24-blue.svg)](https://fr.dotclear.org/download)
[![Dotclear](https://img.shields.io/badge/dotclear-v2.26-blue.svg)](https://fr.dotclear.org/download)
[![Dotaddict](https://img.shields.io/badge/dotaddict-official-green.svg)](https://plugins.dotaddict.org/dc2/details/comListe)
[![License](https://img.shields.io/github/license/JcDenis/comListe)](https://github.com/JcDenis/comListe/blob/master/LICENSE)
@ -19,7 +19,7 @@ It adds public page of all comments and trackbacks.
_comListe_ requires:
* admin perms for configuration
* Dotclear 2.24
* Dotclear 2.26
## USAGE

View File

@ -1,49 +0,0 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_CONTEXT_ADMIN')) {
return null;
}
require __DIR__ . '/_widgets.php';
// Admin menu
dcCore::app()->menu[dcAdmin::MENU_PLUGINS]->addItem(
__('Comments list'),
dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__)),
urldecode(dcPage::getPF(basename(__DIR__) . '/icon.png')),
preg_match('/' . preg_quote(dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__))) . '(&.*)?$/', $_SERVER['REQUEST_URI']),
dcCore::app()->auth->check(dcCore::app()->auth->makePermissions([dcAuth::PERMISSION_ADMIN]), dcCore::app()->blog->id)
);
dcCore::app()->addBehaviors([
// Dashboard favorites
'adminDashboardFavoritesV2' => function (dcFavorites $favs) {
$favs->register(basename(__DIR__), [
'title' => __('Comments list'),
'url' => dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__)),
'small-icon' => urldecode(dcPage::getPF(basename(__DIR__) . '/icon.png')),
'large-icon' => urldecode(dcPage::getPF(basename(__DIR__) . '/icon-big.png')),
'permissions' => dcCore::app()->auth->makePermissions([dcAuth::PERMISSION_ADMIN]),
]);
},
'adminSimpleMenuAddType' => function (ArrayObject $items) {
$items[basename(__DIR__)] = new ArrayObject([__('Comments list'), false]);
},
'adminSimpleMenuBeforeEdit' => function ($type, $select, &$item) {
if (basename(__DIR__) == $type) {
$item[0] = __('Comments list');
$item[1] = dcCore::app()->blog->settings->get(basename(__DIR__))->get('page_title') ?? __('Comments list');
$item[2] = dcCore::app()->admin->__get('blog_url') . dcCore::app()->url->getURLFor(basename(__DIR__));
}
},
]);

View File

@ -10,7 +10,7 @@
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_RC_PATH')) {
if (!defined('DC_RC_PATH') || is_null(dcCore::app()->auth)) {
return null;
}
@ -18,15 +18,18 @@ $this->registerModule(
'Comments list',
'Display a list of all comments and trackbacks of a blog in a public page',
'Benoit de Marne, Pierre Van Glabeke and contributors',
'0.5',
'0.7',
[
'requires' => [['core', '2.24']],
'requires' => [['core', '2.26']],
'permissions' => dcCore::app()->auth->makePermissions([
dcAuth::PERMISSION_ADMIN,
dcCore::app()->auth::PERMISSION_ADMIN,
]),
'type' => 'plugin',
'support' => 'http://forum.dotclear.org/viewtopic.php?pid=333985',
'details' => 'https://plugins.dotaddict.org/dc2/details/' . basename(__DIR__),
'repository' => 'https://raw.githubusercontent.com/JcDenis/' . basename(__DIR__) . '/master/dcstore.xml',
'type' => 'plugin',
'settings' => [
'self' => '',
],
'support' => 'http://forum.dotclear.org/viewtopic.php?pid=333985',
'details' => 'https://plugins.dotaddict.org/dc2/details/' . basename(__DIR__),
'repository' => 'https://raw.githubusercontent.com/JcDenis/' . basename(__DIR__) . '/master/dcstore.xml',
]
);

View File

@ -1,36 +0,0 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_CONTEXT_ADMIN')) {
return null;
}
try {
if (!dcCore::app()->newVersion(
basename(__DIR__),
dcCore::app()->plugins->moduleInfo(basename(__DIR__), 'version')
)) {
return null;
}
$s = dcCore::app()->blog->settings->get(basename(__DIR__));
$s->put('enable', false, 'boolean', 'Enable comListe', false, true);
$s->put('page_title', 'Comments list', 'string', 'Public page title', false, true);
$s->put('nb_comments_per_page', 10, 'integer', 'Number of comments per page', false, true);
$s->put('comments_order', 'desc', 'string', 'Comments order', false, true);
return true;
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage());
}
return false;

View File

@ -1,54 +0,0 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_RC_PATH')) {
return null;
}
dcCore::app()->url->register(
'comListe',
'comListe',
'^comListe(?:/(.+))?$',
[urlcomListe::class,'comListe']
);
class urlcomListe extends dcUrlHandlers
{
public static function comListe($args)
{
$args = (string) $args;
if (!dcCore::app()->blog->settings->get(basename(__DIR__))->get('enable')) {
self::p404();
return null;
}
$n = self::getPageNumber($args);
if (!$n) {
$n = 1;
}
dcCore::app()->public->setPageNumber($n);
dcCore::app()->ctx->__set('nb_comment_per_page', (int) dcCore::app()->blog->settings->get(basename(__DIR__))->get('nb_comments_per_page'));
$tplset = dcCore::app()->themes->moduleInfo(dcCore::app()->blog->settings->get('system')->get('theme'), 'tplset');
if (!empty($tplset) && is_dir(implode(DIRECTORY_SEPARATOR, [__DIR__, 'default-templates', $tplset]))) {
dcCore::app()->tpl->setPath(dcCore::app()->tpl->getPath(), implode(DIRECTORY_SEPARATOR, [__DIR__, 'default-templates', $tplset]));
} else {
dcCore::app()->tpl->setPath(dcCore::app()->tpl->getPath(), implode(DIRECTORY_SEPARATOR, [__DIR__, 'default-templates', DC_DEFAULT_TPLSET]));
}
self::serveDocument('comListe.html');
exit;
}
}

View File

@ -1,63 +0,0 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_RC_PATH')) {
return null;
}
dcCore::app()->addBehavior('initWidgets', [comListeWidget::class,'initWidget']);
class comListeWidget
{
public static function initWidget($w)
{
$w->create(
'comListe',
__('Comments list'),
['comListeWidget','publicWidget'],
null,
__('Link to comments list public page')
)
->addTitle(__('Comments list'))
->setting(
'link_title',
__('Link title: (leave empty to use page title'),
__('Comments list')
)
->addHomeOnly()
->addContentOnly()
->addClass()
->addOffline();
}
public static function publicWidget($w)
{
if ($w->offline
|| !$w->checkHomeOnly(dcCore::app()->url->type)
|| !dcCore::app()->blog->settings->get(basename(__DIR__))->get('enable')
) {
return null;
}
return $w->renderDiv(
$w->content_only,
'comliste ' . $w->class,
'',
($w->title ? $w->renderTitle(html::escapeHTML($w->title)) : '') .
sprintf(
'<p><a href="%s">%s</a></p>',
dcCore::app()->blog->url . dcCore::app()->url->getBase('comListe'),
$w->link_title ? html::escapeHTML($w->link_title) : (dcCore::app()->blog->settings->get(basename(__DIR__))->get('page_title') ?? __('Comments list'))
)
);
}
}

View File

@ -2,11 +2,11 @@
<modules xmlns:da="http://dotaddict.org/da/">
<module id="comListe">
<name>Comments list</name>
<version>0.5</version>
<version>0.7</version>
<author>Benoit de Marne, Pierre Van Glabeke and contributors</author>
<desc>Display a list of all comments and trackbacks of a blog in a public page</desc>
<file>https://github.com/JcDenis/comListe/releases/download/v0.5/plugin-comListe.zip</file>
<da:dcmin>2.24</da:dcmin>
<file>https://github.com/JcDenis/comListe/releases/download/v0.7/plugin-comListe.zip</file>
<da:dcmin>2.26</da:dcmin>
<da:details>https://plugins.dotaddict.org/dc2/details/comListe</da:details>
<da:support>http://forum.dotclear.org/viewtopic.php?pid=333985</da:support>
</module>

View File

@ -54,14 +54,14 @@
<nav class="pagination" aria-label="{{tpl:lang Pagination}}" role="navigation">
<tpl:Block name="_pagination-content-prev">
<tpl:ComListePaginationIf end="0">
<a href="{{tpl:ComListePaginationURL offset="+1"}}" class="prev"><span aria-hidden="true">&#171; </span>{{tpl:lang previous entries}}</a> -
<a href="{{tpl:ComListePaginationURL offset="+1"}}" class="prev"><span aria-hidden="true">&#171; </span>{{tpl:lang previous entries}}</a>
</tpl:ComListePaginationIf>
</tpl:Block>
<tpl:Block name="_pagination-content-current">
<span class="visually-hidden">{{tpl:lang Active page}}</span>{{tpl:lang page}} {{tpl:ComListePaginationCurrent}} {{tpl:lang of}} {{tpl:ComListePaginationCounter}}
</tpl:Block>
<tpl:Block name="_pagination-content-next">
<tpl:ComListePaginationIf start="0"> - <a href="{{tpl:ComListePaginationURL offset="-1"}}" class="next">
<tpl:ComListePaginationIf start="0"> <a href="{{tpl:ComListePaginationURL offset="-1"}}" class="next">
{{tpl:lang next entries}}<span aria-hidden="true"> &#187;</span></a>
</tpl:ComListePaginationIf>
</tpl:Block>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 641 B

11
icon.svg 100644
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="800px" height="800px" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_901_1004)">
<path d="M23.875 25C23.875 25 27.937 29 28.937 30C30.547 31.609 31 31 31 30V8C31 7.447 30.553 7 30 7H8C7.447 7 7 7.447 7 8V26C7 26.553 7.447 27 8 27H22M13 15H25M13 19H18M25 4V2C25 1.437 24.604 1 24 1H2C1.447 1 1 1.447 1 2V20C1 20.553 1.447 21 2 21H7" stroke="#a2cbe9" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_901_1004">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 635 B

View File

@ -1,96 +0,0 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_CONTEXT_ADMIN')) {
return null;
}
dcPage::check(dcCore::app()->auth->makePermissions([
dcAuth::PERMISSION_ADMIN,
]));
$s = dcCore::app()->blog->settings->get(basename(__dir__));
$action = $_REQUEST['action'] ?? null;
$order_combo = [
__('Ascending') => 'asc',
__('Descending') => 'desc',
];
if ($action == 'saveconfig') {
try {
if (empty($_POST['comliste_page_title'])) {
throw new Exception(__('No page title.'));
}
$s->put('enable', !empty($_POST['comliste_enable']));
$s->put('page_title', $_POST['comliste_page_title']);
$s->put('nb_comments_per_page', $_POST['comliste_nb_comments_per_page'] ?? 10);
$s->put('comments_order', $_POST['comliste_comments_order'] == 'asc' ? 'asc' : 'desc');
dcCore::app()->blog->triggerBlog();
dcAdminNotices::addSuccessNotice(
__('Configuration successfully updated.')
);
dcCore::app()->adminurl->redirect(
'admin.plugin.' . basename(__DIR__)
);
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage());
}
}
echo '
<html><head><title>' . __('Comments list') . '</title></head><body>' .
dcPage::breadcrumb([
html::escapeHTML(dcCore::app()->blog->name) => '',
__('Comments list') => '',
]) .
dcPage::notices() .
'<form method="post" action="' . dcCore::app()->adminurl->get('admin.plugin.' . basename(__DIR__)) . '">' .
'<div class="fieldset"><h4>' . __('Plugin activation') . '</h4>' .
'<p class="field"><label for="comliste_enable" class="classic">' .
form::checkbox('comliste_enable', 1, (bool) $s->get('enable')) .
__('Enable comListe') . '</label></p>' .
'</div>' .
'<div class="fieldset"><h4>' . __('General options') . '</h4>' .
'<p><label for="comliste_page_title">' . __('Public page title:') . ' </label>' .
form::field('comliste_page_title', 30, 255, (string) $s->get('page_title')) .
'</label></p>' .
'<p><label for="comliste_nb_comments_per_page">' .
__('Number of comments per page:') . '</label>' .
form::number('comliste_nb_comments_per_page', ['min' => 0, 'max' => 99, 'default' => (int) $s->get('nb_comments_per_page')]) .
'</p>' .
'<p><label for="comliste_comments_order">' . __('Comments order:') . '</label>' .
form::combo('comliste_comments_order', $order_combo, $s->get('comments_order') == 'asc' ? 'asc' : 'desc') .
'</p>' .
'</div>
<p class="clear">' .
form::hidden(['action'], 'saveconfig') .
dcCore::app()->formNonce() . '
<input id="new-action" type="submit" name="save" value="' . __('Save') . '" />
</p>
</form>';
dcPage::helpBlock('comListe');
echo '</body></html>';

View File

@ -9,16 +9,18 @@
# DOT NOT MODIFY THIS FILE !
#
l10n::$locales['Comments list'] = 'Liste de commentaires';
l10n::$locales['open post'] = 'ouvrir le billet';
l10n::$locales['Link to comments list public page'] = 'Lien vers la page public de la liste des commentaires';
l10n::$locales['Pages:'] = 'Pages :';
l10n::$locales['Number of comments per page:'] = 'Nombre de commentaires par page :';
l10n::$locales['Total Comments:'] = 'Nombre total de commentaires :';
l10n::$locales['Source:'] = 'Source :';
l10n::$locales['No page title.'] = 'Pas de titre de page.';
l10n::$locales['Enable comListe'] = 'Activer comListe';
l10n::$locales['General options'] = 'Options générales';
l10n::$locales['Public page title:'] = 'Titre de la page public :';
l10n::$locales['Comments order:'] = 'Ordre des commentaires :';
l10n::$locales['Display a list of all comments and trackbacks of a blog in a public page'] = 'Afficher la liste de tous les commentaires et rétroliens d\'un blog dans une page publique';
use Dotclear\Helper\L10n;
L10n::$locales['Comments list'] = 'Liste de commentaires';
L10n::$locales['open post'] = 'ouvrir le billet';
L10n::$locales['Link to comments list public page'] = 'Lien vers la page public de la liste des commentaires';
L10n::$locales['Pages:'] = 'Pages :';
L10n::$locales['Number of comments per page:'] = 'Nombre de commentaires par page :';
L10n::$locales['Total Comments:'] = 'Nombre total de commentaires :';
L10n::$locales['Source:'] = 'Source :';
L10n::$locales['No page title.'] = 'Pas de titre de page.';
L10n::$locales['Enable comListe'] = 'Activer comListe';
L10n::$locales['General options'] = 'Options générales';
L10n::$locales['Public page title:'] = 'Titre de la page public :';
L10n::$locales['Comments order:'] = 'Ordre des commentaires :';
L10n::$locales['Display a list of all comments and trackbacks of a blog in a public page'] = 'Afficher la liste de tous les commentaires et rétroliens d\'un blog dans une page publique';

63
src/Backend.php 100644
View File

@ -0,0 +1,63 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use ArrayObject;
use dcCore;
use Dotclear\Core\Backend\Favorites;
use Dotclear\Core\Process;
class Backend extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::BACKEND));
}
public static function process(): bool
{
if (!self::status()) {
return false;
}
// Admin menu
My::addBackendMenuItem();
dcCore::app()->addBehaviors([
// Dashboard favorites
'adminDashboardFavoritesV2' => function (Favorites $favs): void {
$favs->register(My::id(), [
'title' => My::name(),
'url' => My::manageUrl(),
'small-icon' => My::icons(),
'large-icon' => My::icons(),
'permissions' => dcCore::app()->auth->makePermissions([dcCore::app()->auth::PERMISSION_ADMIN]),
]);
},
'adminSimpleMenuAddType' => function (ArrayObject $items): void {
$items[My::id()] = new ArrayObject([My::name(), false]);
},
'adminSimpleMenuBeforeEdit' => function (string $type, string $select, array &$item): void {
if (My::id() == $type) {
$item[0] = My::name();
$item[1] = My::settings()->get('page_title') ?? My::name();
$item[2] = dcCore::app()->admin->__get('blog_url') . dcCore::app()->url->getURLFor(My::id());
}
},
]);
return true;
}
}

65
src/Frontend.php 100644
View File

@ -0,0 +1,65 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use dcCore;
use Dotclear\Core\Process;
class Frontend extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::FRONTEND));
}
public static function process(): bool
{
if (!self::status()) {
return false;
}
if (!My::settings()->get('enable')) {
return false;
}
dcCore::app()->tpl->addValue('ComListeURL', [Template::class,'comListeURL']);
dcCore::app()->tpl->addValue('ComListePageTitle', [Template::class,'comListePageTitle']);
dcCore::app()->tpl->addValue('ComListeNbComments', [Template::class,'comListeNbComments']);
dcCore::app()->tpl->addValue('ComListeNbCommentsPerPage', [Template::class,'comListeNbCommentsPerPage']);
dcCore::app()->tpl->addBlock('ComListeCommentsEntries', [Template::class,'comListeCommentsEntries']);
dcCore::app()->tpl->addValue('ComListePaginationLinks', [Template::class,'comListePaginationLinks']);
dcCore::app()->tpl->addValue('ComListeOpenPostTitle', [Template::class,'comListeOpenPostTitle']);
dcCore::app()->tpl->addValue('ComListeCommentOrderNumber', [Template::class,'comListeCommentOrderNumber']);
dcCore::app()->tpl->addBlock('ComListePagination', [Template::class,'comListePagination']);
dcCore::app()->tpl->addValue('ComListePaginationCounter', [Template::class,'comListePaginationCounter']);
dcCore::app()->tpl->addValue('ComListePaginationCurrent', [Template::class,'comListePaginationCurrent']);
dcCore::app()->tpl->addBlock('ComListePaginationIf', [Template::class,'comListePaginationIf']);
dcCore::app()->tpl->addValue('ComListePaginationURL', [Template::class,'comListePaginationURL']);
dcCore::app()->addBehavior(
'publicBreadcrumb',
function (string $context, string $separator): ?string {
if ($context == 'comListe') {
return __('Comments list');
}
return null;
},
);
return true;
}
}

52
src/Install.php 100644
View File

@ -0,0 +1,52 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use dcCore;
use Dotclear\Core\Process;
use Exception;
class Install extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::INSTALL));
}
public static function process(): bool
{
if (!self::status()) {
return false;
}
if (is_null(dcCore::app()->blog)) {
return false;
}
try {
$s = My::settings();
$s->put('enable', false, 'boolean', 'Enable comListe', false, true);
$s->put('page_title', 'Comments list', 'string', 'Public page title', false, true);
$s->put('nb_comments_per_page', 10, 'integer', 'Number of comments per page', false, true);
$s->put('comments_order', 'desc', 'string', 'Comments order', false, true);
return true;
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage());
return false;
}
}
}

134
src/Manage.php 100644
View File

@ -0,0 +1,134 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use dcCore;
use Dotclear\Core\Backend\{
Notices,
Page
};
use Dotclear\Core\Process;
use Dotclear\Helper\Html\Form\{
Checkbox,
Div,
Form,
Hidden,
Input,
Label,
Number,
Para,
Select,
Submit,
Text
};
use Dotclear\Helper\Html\Html;
use Exception;
class Manage extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::MANAGE));
}
public static function process(): bool
{
if (!self::status()) {
return false;
}
if (is_null(dcCore::app()->blog)) {
return false;
}
if (($_REQUEST['action'] ?? null) != 'saveconfig') {
return true;
}
try {
if (empty($_POST['comliste_page_title'])) {
throw new Exception(__('No page title.'));
}
$s = My::settings();
$s->put('enable', !empty($_POST['comliste_enable']));
$s->put('page_title', $_POST['comliste_page_title']);
$s->put('nb_comments_per_page', $_POST['comliste_nb_comments_per_page'] ?? 10);
$s->put('comments_order', $_POST['comliste_comments_order'] == 'asc' ? 'asc' : 'desc');
dcCore::app()->blog->triggerBlog();
Notices::addSuccessNotice(__('Configuration successfully updated.'));
My::redirect();
} catch (Exception $e) {
dcCore::app()->error->add($e->getMessage());
}
return true;
}
public static function render(): void
{
if (!self::status()) {
return;
}
if (is_null(dcCore::app()->blog)) {
return;
}
$s = My::settings();
Page::openModule(My::name());
echo Page::breadcrumb([
Html::escapeHTML(dcCore::app()->blog->name) => '',
My::name() => '',
]) .
Notices::getNotices() .
(new Form('setting_form'))->method('post')->action(My::manageUrl())->separator('')->fields([
(new Div())->class('fieldset')->items([
(new Text('h4', __('Plugin activation'))),
(new Para())->items([
(new Checkbox('comliste_enable', (bool) $s->get('enable')))->value(1),
(new Label(__('Enable comListe'), Label::OUTSIDE_LABEL_AFTER))->for('comliste_enable')->class('classic'),
]),
]),
(new Div())->class('fieldset')->items([
(new Text('h4', __('General options'))),
(new Para())->items([
(new Label(__('Public page title:'), Label::OUTSIDE_LABEL_BEFORE))->for('comliste_page_title'),
(new Input('comliste_page_title'))->size(30)->maxlenght(255)->value((string) $s->get('page_title')),
]),
(new Para())->items([
(new Label(__('Number of comments per page:'), Label::OUTSIDE_LABEL_BEFORE))->for('comliste_nb_comments_per_page'),
(new Number('comliste_nb_comments_per_page'))->min(0)->max(99)->value((int) $s->get('nb_comments_per_page')),
]),
(new Label(__('Comments order:'), Label::OUTSIDE_LABEL_BEFORE))->for('comliste_comments_order'),
(new Select('comliste_comments_order'))
->items([__('Ascending') => 'asc', __('Descending') => 'desc'])
->default($s->get('comments_order') == 'asc' ? 'asc' : 'desc'),
]),
(new Para())->class('clear')->items([
(new Submit(['do']))->value(__('Save')),
(new Hidden(['action'], 'saveconfig')),
... My::hiddenFields(),
]),
])->render();
Page::helpBlock('comListe');
Page::closeModule();
}
}

24
src/My.php 100644
View File

@ -0,0 +1,24 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use Dotclear\Module\MyPlugin;
/**
* This module definitions.
*/
class My extends MyPlugin
{
}

42
src/Prepend.php 100644
View File

@ -0,0 +1,42 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use dcCore;
use Dotclear\Core\Process;
class Prepend extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::PREPEND));
}
public static function process(): bool
{
if (!self::status()) {
return false;
}
dcCore::app()->url->register(
'comListe',
'comListe',
'^comListe(?:/(.+))?$',
[UrlHandler::class, 'comListe']
);
return true;
}
}

View File

@ -10,77 +10,58 @@
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('DC_RC_PATH')) {
return null;
}
declare(strict_types=1);
if (!dcCore::app()->blog->settings->get(basename(__DIR__))->get('enable')) {
return null;
}
namespace Dotclear\Plugin\comListe;
require __DIR__ . '/_widgets.php';
use ArrayObject;
use dcCore;
use Dotclear\Helper\Html\Html;
dcCore::app()->tpl->addValue('ComListeURL', [tplComListe::class,'comListeURL']);
dcCore::app()->tpl->addValue('ComListePageTitle', [tplComListe::class,'comListePageTitle']);
dcCore::app()->tpl->addValue('ComListeNbComments', [tplComListe::class,'comListeNbComments']);
dcCore::app()->tpl->addValue('ComListeNbCommentsPerPage', [tplComListe::class,'comListeNbCommentsPerPage']);
dcCore::app()->tpl->addBlock('ComListeCommentsEntries', [tplComListe::class,'comListeCommentsEntries']);
dcCore::app()->tpl->addValue('ComListePaginationLinks', [tplComListe::class,'comListePaginationLinks']);
dcCore::app()->tpl->addValue('ComListeOpenPostTitle', [tplComListe::class,'comListeOpenPostTitle']);
dcCore::app()->tpl->addValue('ComListeCommentOrderNumber', [tplComListe::class,'comListeCommentOrderNumber']);
dcCore::app()->tpl->addBlock('ComListePagination', [tplComListe::class,'comListePagination']);
dcCore::app()->tpl->addValue('ComListePaginationCounter', [tplComListe::class,'comListePaginationCounter']);
dcCore::app()->tpl->addValue('ComListePaginationCurrent', [tplComListe::class,'comListePaginationCurrent']);
dcCore::app()->tpl->addBlock('ComListePaginationIf', [tplComListe::class,'comListePaginationIf']);
dcCore::app()->tpl->addValue('ComListePaginationURL', [tplComListe::class,'comListePaginationURL']);
dcCore::app()->addBehaviors([
'publicBreadcrumb' => function ($context, $separator) {
if ($context == 'comListe') {
return __('Comments list');
}
},
]);
class tplComListe
class Template
{
public $html_prev = '&#171;prev.';
public $html_next = 'next&#187;';
public string $html_prev = '&#171;prev.';
public string $html_next = 'next&#187;';
/* ComListeURL --------------------------------------- */
public static function comListeURL($attr)
public static function comListeURL(ArrayObject $attr): string
{
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'dcCore::app()->blog->url.dcCore::app()->url->getBase("comListe")') . '; ?>';
}
/* ComListePageTitle --------------------------------------- */
public static function comListePageTitle($attr)
public static function comListePageTitle(ArrayObject $attr): string
{
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'dcCore::app()->blog->settings->get("' . basename(__DIR__) . '")->get("page_title")') . '; ?>';
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'dcCore::app()->blog->settings->get("' . My::id() . '")->get("page_title")') . '; ?>';
}
/* ComListeNbCommentsPerPage --------------------------------------- */
public static function comListeNbCommentsPerPage($attr)
public static function comListeNbCommentsPerPage(ArrayObject $attr): string
{
dcCore::app()->ctx->__set('nb_comment_per_page', (int) dcCore::app()->blog->settings->get(basename(__DIR__))->get('nb_comments_per_page'));
if (is_null(dcCore::app()->blog) || is_null(dcCore::app()->ctx)) {
return '10';
}
dcCore::app()->ctx->__set('nb_comment_per_page', (int) My::settings()->get('nb_comments_per_page'));
return html::escapeHTML((string) dcCore::app()->ctx->__get('nb_comment_per_page'));
return Html::escapeHTML((string) dcCore::app()->ctx->__get('nb_comment_per_page'));
}
/* comListeNbComments --------------------------------------- */
public static function comListeNbComments($attr)
public static function comListeNbComments(ArrayObject$attr): string
{
if (is_null(dcCore::app()->blog) || is_null(dcCore::app()->ctx)) {
return '0';
}
if (!dcCore::app()->ctx->exists('pagination')) {
dcCore::app()->ctx->__set('pagination', dcCore::app()->blog->getComments([], true));
}
$nb_comments = dcCore::app()->ctx->__get('pagination')->f(0);
return html::escapeHTML((string) $nb_comments);
return Html::escapeHTML((string) $nb_comments);
}
/* ComListeCommentsEntries --------------------------------------- */
public static function comListeCommentsEntries($attr, $content)
public static function comListeCommentsEntries(ArrayObject $attr, string $content): string
{
$p = 'if (dcCore::app()->ctx->posts !== null) { ' .
"\$params['post_id'] = dcCore::app()->ctx->posts->post_id; " .
@ -110,17 +91,17 @@ class tplComListe
"}\n";
$p .= 'if (dcCore::app()->ctx->exists("langs")) { ' .
"\$params['sql'] = \"AND P.post_lang = '\".dcCore::app()->blog->con->escape(dcCore::app()->langs->post_lang).\"' \"; " .
"\$params['sql'] = \"AND P.post_lang = '\".dcCore::app()->blog->con->escapeStr((string) dcCore::app()->langs->post_lang).\"' \"; " .
"}\n";
}
// Sens de tri issu des paramètres du plugin
$order = dcCore::app()->blog->settings->get(basename(__DIR__))->get('comments_order');
$order = is_null(dcCore::app()->blog) ? 'desc' : My::settings()->get('comments_order');
if (isset($attr['order']) && preg_match('/^(desc|asc)$/i', $attr['order'])) {
$order = $attr['order'];
}
$p .= "\$params['order'] = 'comment_dt " . $order . "';\n";
$p .= "\$params['order'] = 'comment_dt " . ($order ?? 'desc') . "';\n";
if (isset($attr['no_content']) && $attr['no_content']) {
$p .= "\$params['no_content'] = true;\n";
@ -145,7 +126,7 @@ class tplComListe
/* ComListePaginationLinks --------------------------------------- */
/* Reprise et adaptation de la fonction PaginationLinks du plugin advancedPagination-1.9 */
public static function comListePaginationLinks($attr)
public static function comListePaginationLinks(ArrayObject $attr): string
{
$p = '<?php
@ -184,7 +165,7 @@ class tplComListe
$nb_comments = dcCore::app()->ctx->pagination->f(0);
}
$nb_per_page = abs((integer) dcCore::app()->blog->settings->get("' . basename(__DIR__) . '")->get("nb_comments_per_page"));
$nb_per_page = abs((integer) dcCore::app()->blog->settings->get("' . My::id() . '")->get("nb_comments_per_page"));
$nb_pages = ceil($nb_comments/$nb_per_page);
$nb_max_pages = 10;
$nb_sequence = 2*3+1;
@ -232,7 +213,7 @@ class tplComListe
}
/* ComListeOpenPostTitle --------------------------------------- */
public static function comListeOpenPostTitle($attr)
public static function comListeOpenPostTitle(ArrayObject $attr): string
{
return __('open post');
}
@ -243,7 +224,7 @@ class tplComListe
'<?php echo ' .
'dcCore::app()->ctx->comments->index() + 1 +' .
'(dcCore::app()->public->getPageNumber() - 1) * ' .
'abs((integer) dcCore::app()->blog->settings->get("' . basename(__DIR__) . '")->get("nb_comments_per_page"));' .
'abs((integer) dcCore::app()->blog->settings->get("' . My::id() . '")->get("nb_comments_per_page"));' .
'?>';
}
@ -270,7 +251,7 @@ class tplComListe
return
"<?php\n" .
'$bakcup_old_nbpp = dcCore::app()->ctx->nb_entry_per_page; ' . "\n" .
'dcCore::app()->ctx->nb_entry_per_page = abs((integer) dcCore::app()->blog->settings->get("' . basename(__DIR__) . '")->get("nb_comments_per_page"));' . "\n" .
'dcCore::app()->ctx->nb_entry_per_page = abs((integer) dcCore::app()->blog->settings->get("' . My::id() . '")->get("nb_comments_per_page"));' . "\n" .
"?>\n" .
$params .
'<?php if (dcCore::app()->ctx->pagination->f(0) > dcCore::app()->ctx->comments->count()) : ?>' .
@ -282,14 +263,14 @@ class tplComListe
public static function comListePaginationCounter(ArrayObject $attr): string
{
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'context::PaginationNbPages()') . '; ?>';
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'dcCore::app()->ctx::PaginationNbPages()') . '; ?>';
}
public static function comListePaginationCurrent(ArrayObject $attr): string
{
$offset = isset($attr['offset']) ? (int) $attr['offset'] : 0;
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'context::PaginationPosition(' . $offset . ')') . '; ?>';
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'dcCore::app()->ctx::PaginationPosition(' . $offset . ')') . '; ?>';
}
public static function comListePaginationIf(ArrayObject $attr, string $content): string
@ -298,12 +279,12 @@ class tplComListe
if (isset($attr['start'])) {
$sign = (bool) $attr['start'] ? '' : '!';
$if[] = $sign . 'context::PaginationStart()';
$if[] = $sign . 'dcCore::app()->ctx::PaginationStart()';
}
if (isset($attr['end'])) {
$sign = (bool) $attr['end'] ? '' : '!';
$if[] = $sign . 'context::PaginationEnd()';
$if[] = $sign . 'dcCore::app()->ctx::PaginationEnd()';
}
if (count($if)) {
@ -320,6 +301,6 @@ class tplComListe
$offset = (int) $attr['offset'];
}
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'context::PaginationURL(' . $offset . ')') . '; ?>';
return '<?php echo ' . sprintf(dcCore::app()->tpl->getFilters($attr), 'dcCore::app()->ctx::PaginationURL(' . $offset . ')') . '; ?>';
}
}

70
src/Uninstall.php 100644
View File

@ -0,0 +1,70 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use dcCore;
use Dotclear\Core\Process;
use Dotclear\Plugin\Uninstaller\Uninstaller;
class Uninstall extends Process
{
public static function init(): bool
{
return self::status(My::checkContext(My::UNINSTALL));
}
public static function process(): bool
{
if (!self::status() || !dcCore::app()->plugins->moduleExists('Uninstaller')) {
return false;
}
Uninstaller::instance()
->addUserAction(
'settings',
'delete_all',
My::id()
)
->addUserAction(
'plugins',
'delete',
My::id()
)
->addUserAction(
'versions',
'delete',
My::id()
)
->addDirectAction(
'settings',
'delete_all',
My::id()
)
->addDirectAction(
'plugins',
'delete',
My::id()
)
->addDirectAction(
'versions',
'delete',
My::id()
)
;
// no custom action
return false;
}
}

46
src/UrlHandler.php 100644
View File

@ -0,0 +1,46 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use dcCore;
use dcUrlHandlers;
class UrlHandler extends dcUrlHandlers
{
public static function comListe(?string $args): void
{
$args = (string) $args;
if (is_null(dcCore::app()->blog)
|| is_null(dcCore::app()->ctx)
|| !My::settings()->get('enable')
) {
self::p404();
}
dcCore::app()->public->setPageNumber(self::getPageNumber($args) ?: 1);
dcCore::app()->ctx->__set('nb_comment_per_page', (int) My::settings()->get('nb_comments_per_page'));
$tplset = dcCore::app()->themes->moduleInfo(dcCore::app()->blog->settings->get('system')->get('theme'), 'tplset');
if (!empty($tplset) && is_dir(implode(DIRECTORY_SEPARATOR, [My::path(), 'default-templates', $tplset]))) {
dcCore::app()->tpl->setPath(dcCore::app()->tpl->getPath(), implode(DIRECTORY_SEPARATOR, [My::path(), 'default-templates', $tplset]));
} else {
dcCore::app()->tpl->setPath(dcCore::app()->tpl->getPath(), implode(DIRECTORY_SEPARATOR, [My::path(), 'default-templates', DC_DEFAULT_TPLSET]));
}
self::serveDocument('comListe.html');
exit;
}
}

67
src/Widgets.php 100644
View File

@ -0,0 +1,67 @@
<?php
/**
* @brief comListe, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Benoit de Marne, Pierre Van Glabeke and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\comListe;
use dcCore;
use Dotclear\Helper\Html\Html;
use Dotclear\Plugin\widgets\WidgetsStack;
use Dotclear\Plugin\widgets\WidgetsElement;
class Widgets
{
public static function initWidgets(WidgetsStack $w): void
{
$w->create(
My::id(),
My::name(),
[self::class, 'parseWidget'],
null,
__('Link to comments list public page')
)
->addTitle(My::name())
->setting(
'link_title',
__('Link title: (leave empty to use page title'),
My::name()
)
->addHomeOnly()
->addContentOnly()
->addClass()
->addOffline();
}
public static function parseWidget(WidgetsElement $w): string
{
if (is_null(dcCore::app()->blog)
|| $w->__get('offline')
|| !$w->checkHomeOnly(dcCore::app()->url->type)
|| !My::settings()->get('enable')
) {
return '';
}
return $w->renderDiv(
(bool) $w->__get('content_only'),
My::id() . ' ' . $w->__get('class'),
'',
($w->__get('title') ? $w->renderTitle(Html::escapeHTML($w->__get('title'))) : '') .
sprintf(
'<p><a href="%s">%s</a></p>',
dcCore::app()->blog->url . dcCore::app()->url->getBase('comListe'),
$w->__get('link_title') ? Html::escapeHTML($w->__get('link_title')) : (My::settings()->get('page_title') ?? My::name())
)
);
}
}