preview for Dotclear 2.26

This commit is contained in:
Jean-Christian Denis 2023-03-11 17:00:15 +01:00
parent 07335f420e
commit 83fa868c91
Signed by: JcDenis
GPG key ID: 1B5B8C5B90B6C951
13 changed files with 131 additions and 207 deletions

View file

@ -1,3 +1,9 @@
0.4 - 2023.03.11
* update to Dotclear 2.26
* use abstract plugin id and name
* use dcPage open/close methods
* use new Form helpers
0.3.1 - 2023.01.07
- fix previously introduced unix bug

View file

@ -3,7 +3,7 @@
[![Release](https://img.shields.io/github/v/release/JcDenis/testMail)](https://github.com/JcDenis/testMail/releases)
[![Date](https://img.shields.io/github/release-date/JcDenis/testMail)](https://github.com/JcDenis/testMail/releases)
[![Issues](https://img.shields.io/github/issues/JcDenis/testMail)](https://github.com/JcDenis/testMail/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/testMail)
[![License](https://img.shields.io/github/license/JcDenis/testMail)](https://github.com/JcDenis/testMail/blob/master/LICENSE)
@ -19,7 +19,7 @@ It helps dev to test dotclear mail system.
**testMail** requires:
* super admin permission
* Dotclear 2.24
* Dotclear 2.26
## USAGE

View file

@ -1,18 +0,0 @@
<?php
/**
* @brief testMail, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Osku and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
$admin = implode('\\', ['Dotclear', 'Plugin', basename(__DIR__), 'Admin']);
if ($admin::init()) {
$admin::process();
}

View file

@ -12,9 +12,6 @@
*/
declare(strict_types=1);
// can not use namespace as it is included inside a class method,
// and also can be included in third party plugins class methods.
if (!defined('DC_RC_PATH')) {
return null;
}
@ -25,7 +22,7 @@ $this->registerModule(
'Osku and contributors',
'0.3.1',
[
'requires' => [['core', '2.24']],
'requires' => [['core', '2.26']],
'permissions' => null,
'type' => 'plugin',
'support' => 'https://github.com/JcDenis/' . basename(__DIR__),

View file

@ -1,22 +0,0 @@
<?php
/**
* @brief testMail, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Osku and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
$prepend = implode('\\', ['Dotclear', 'Plugin', basename(__DIR__), 'Prepend']);
if (!class_exists($prepend)) {
require __DIR__ . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Prepend.php';
if ($prepend::init()) {
$prepend::process();
}
}

View file

@ -6,7 +6,7 @@
<author>Osku and contributors</author>
<desc>Send a simple mail from admin</desc>
<file>https://github.com/JcDenis/testMail/releases/download/v0.3.1/plugin-testMail.zip</file>
<da:dcmin>2.24</da:dcmin>
<da:dcmin>2.26</da:dcmin>
<da:details>https://plugins.dotaddict.org/dc2/details/testMail</da:details>
<da:support>https://github.com/JcDenis/testMail</da:support>
</module>

View file

@ -1,19 +0,0 @@
<?php
/**
* @brief testMail, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Osku and contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
$manage = implode('\\', ['Dotclear', 'Plugin', basename(__DIR__), 'Manage']);
if ($manage::init()) {
$manage::process();
$manage::render();
}

View file

@ -14,5 +14,5 @@ l10n::$locales['Mail successuffly sent.'] = 'Mail envoyer avec succès.';
l10n::$locales['Mailto:'] = 'Envoyer à :';
l10n::$locales['Subject:'] = 'Sujet :';
l10n::$locales['Active mail headers'] = 'Activer les entêtes de mail';
l10n::$locales['Mail test'] = 'Mail test';
l10n::$locales['Mail test'] = 'Testeur de mail';
l10n::$locales['Send a simple mail from admin'] = 'Envoyer un simple mail depuis l\'admin';

View file

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: testMail 0.2.1\n"
"Project-Id-Version: testMail 0.3.1\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2023-01-05T23:44:36+00:00\n"
"PO-Revision-Date: 2023-03-11T15:55:03+00:00\n"
"Last-Translator: Jean-Christian Denis\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@ -26,7 +26,7 @@ msgid "Active mail headers"
msgstr "Activer les entêtes de mail"
msgid "Mail test"
msgstr "Mail test"
msgstr "Testeur de mail"
msgid "Send a simple mail from admin"
msgstr "Envoyer un simple mail depuis l'admin"

View file

@ -17,34 +17,32 @@ namespace Dotclear\Plugin\testMail;
/* dotclear ns */
use dcAdmin;
use dcCore;
use dcNsProcess;
use dcPage;
class Admin
class Backend extends dcNsProcess
{
private static $pid = '';
protected static $init = false;
public static function init(): bool
{
if (defined('DC_CONTEXT_ADMIN')) {
self::$pid = basename(dirname(__DIR__));
dcPage::checkSuper();
self::$init = true;
}
return self::$init;
}
public static function process(): ?bool
public static function process(): bool
{
if (!self::$init) {
return false;
}
dcCore::app()->menu[dcAdmin::MENU_PLUGINS]->addItem(
dcCore::app()->plugins->moduleInfo(self::$pid, 'name'),
dcCore::app()->adminurl->get('admin.plugin.' . self::$pid),
dcPage::getPF(self::$pid . '/icon.svg'),
preg_match('/' . preg_quote(dcCore::app()->adminurl->get('admin.plugin.' . self::$pid)) . '(&.*)?$/', $_SERVER['REQUEST_URI']),
My::name(),
dcCore::app()->adminurl->get('admin.plugin.' . My::id()),
dcPage::getPF(My::id() . '/icon.svg'),
preg_match('/' . preg_quote(dcCore::app()->adminurl->get('admin.plugin.' . My::id())) . '(&.*)?$/', $_SERVER['REQUEST_URI']),
dcCore::app()->auth->isSuperAdmin()
);

View file

@ -14,82 +14,66 @@ declare(strict_types=1);
namespace Dotclear\Plugin\testMail;
/* dotclear ns */
use dcAdminNotices;
use dcCore;
use dcNsProcess;
use dcPage;
/* clearbricks ns */
use form;
use html;
use Dotclear\Helper\Html\Form\{
Checkbox,
Div,
Form,
Input,
Label,
Para,
Submit,
Textarea
};
use Exception;
use http;
use mail;
use text;
/* php */
use Exception;
class Manage
class Manage extends dcNsProcess
{
private static $active_headers = false;
private static $mail_to = '';
private static $mail_subject = '';
private static $mail_content = '';
private static $pid = '';
protected static $init = false;
public static function init(): bool
{
if (defined('DC_CONTEXT_ADMIN')) {
dcPage::checkSuper();
self::$pid = basename(dirname(__DIR__));
self::$init = true;
}
return self::$init;
}
public static function process(): ?bool
public static function process(): bool
{
if (!self::$init) {
return false;
}
$headers = [
'From: ' . mail::B64Header(dcCore::app()->blog->name) .
'<no-reply@' . str_replace('http://', '', http::getHost()) . ' >',
'Content-Type: text/HTML; charset=UTF-8;' .
'X-Originating-IP: ' . http::realIP(),
'X-Mailer: Dotclear',
'X-Blog-Id: ' . mail::B64Header(dcCore::app()->blog->id),
'X-Blog-Name: ' . mail::B64Header(dcCore::app()->blog->name),
'X-Blog-Url: ' . mail::B64Header(dcCore::app()->blog->url),
];
self::$active_headers = !empty($_POST['active_headers']);
self::$mail_to = $_POST['mail_to'] ?? '';
self::$mail_subject = $_POST['mail_subject'] ?? '';
self::$mail_content = $_POST['mail_content'] ?? '';
$active_headers = !empty($_POST['active_headers']);
$mail_to = $_POST['mail_to'] ?? '';
$mail_subject = $_POST['mail_subject'] ?? '';
$mail_content = $_POST['mail_content'] ?? '';
if (!empty(self::$mail_content) || !empty(self::$mail_to)) {
if (!empty($mail_content) || !empty($mail_to)) {
try {
if (!text::isEmail(self::$mail_to)) {
if (!text::isEmail($mail_to)) {
throw new Exception(__('You must provide a valid email address.'));
}
if (self::$mail_content == '') {
if ($mail_content == '') {
throw new Exception(__('You must provide a content.'));
}
$mail_subject = mail::B64Header(self::$mail_subject);
$mail_subject = mail::B64Header($mail_subject);
if (self::$active_headers) {
mail::sendMail(self::$mail_to, $mail_subject, self::$mail_content, $headers);
if ($active_headers) {
mail::sendMail($mail_to, $mail_subject, $mail_content, self::getHeaders());
} else {
mail::sendMail(self::$mail_to, $mail_subject, self::$mail_content);
mail::sendMail($mail_to, $mail_subject, $mail_content);
}
dcAdminNotices::addSuccessNotice(__('Mail successuffly sent.'));
dcCore::app()->adminurl->redirect('admin.plugin.' . self::$pid);
dcPage::addSuccessNotice(__('Mail successuffly sent.'));
dcCore::app()->adminurl->redirect('admin.plugin.' . My::id());
return true;
} catch (Exception $e) {
@ -97,50 +81,59 @@ class Manage
}
}
return null;
return true;
}
public static function render(): void
{
dcpage::openModule(My::name());
echo
'<html><head><title>' .
dcCore::app()->plugins->moduleInfo(self::$pid, 'name') .
'</title></head><body>' .
dcPage::breadcrumb([
__('System') => '',
dcCore::app()->plugins->moduleInfo(self::$pid, 'name') => '',
__('System') => '',
My::name() => '',
]) .
dcPage::notices() . '
dcPage::notices() .
<div id="mail_testor">
<form method="post" action="' . dcCore::app()->admin->getPageURL() . '">
(new Div('mail_testor'))->items([
(new Form('mail_form'))->method('post')->action(dcCore::app()->admin->getPageURL())->fields([
(new Para())->items([
(new Label(__('Mailto:')))->for('mail_to'),
(new Input('mail_to'))->class('maximal')->size(30)->maxlenght(255)->value(''),
]),
(new Para())->items([
(new Label(__('Subject:')))->for('mail_subject'),
(new Input('mail_subject'))->class('maximal')->size(30)->maxlenght(255)->value(''),
]),
(new Para())->items([
(new Label(__('Content:')))->for('mail_content'),
(new Textarea('mail_content', ''))->class('maximal')->cols(50)->rows(7),
]),
(new Para())->items([
(new Checkbox('active_headers', false))->value(1),
(new Label(__('Active mail headers')))->for('active_headers')->class('classic'),
]),
(new Para())->items([
(new Submit('save'))->accesskey('s')->value(__('Send')),
dcCore::app()->formNonce(false),
]),
]),
])->render();
<p><label for="mail_to">' . __('Mailto:') . ' ' .
form::field('mail_to', 30, 255, self::$mail_to, 'maximal') .
'</label></p>
dcPage::closeModule();
}
<p><label for="mail_subject">' . __('Subject:') . ' ' .
form::field('mail_subject', 30, 255, self::$mail_subject, 'maximal') .
'</label></p>
<p>' . __('Content:') . '</p>
<p class="area">' .
form::textarea('mail_content', 50, 7, html::escapeHTML(self::$mail_content)) . '
</p>
<p><label class="classic" for="active_headers">' .
form::checkbox('active_headers', 1, self::$active_headers) . ' ' .
__('Active mail headers') .
'</label></p>
<p class="border-top">' .
'<input type="submit" value="' . __('Save') . ' (s)" accesskey="s" name="save" /> ' .
dcCore::app()->formNonce() . '</p>' .
'</form>
</div>
</body></html>';
private static function getHeaders(): array
{
return [
'From: ' . mail::B64Header(dcCore::app()->blog->name) .
'<no-reply@' . str_replace('http://', '', http::getHost()) . ' >',
'Content-Type: text/HTML; charset=UTF-8;' .
'X-Originating-IP: ' . http::realIP(),
'X-Mailer: ' . My::X_MAILER,
'X-Blog-Id: ' . mail::B64Header(dcCore::app()->blog->id),
'X-Blog-Name: ' . mail::B64Header(dcCore::app()->blog->name),
'X-Blog-Url: ' . mail::B64Header(dcCore::app()->blog->url),
];
}
}

38
src/My.php Normal file
View file

@ -0,0 +1,38 @@
<?php
/**
* @brief testMail, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Osku 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\testMail;
use dcCore;
class My
{
public const X_MAILER = 'Dotclear';
/**
* This module id
*/
public static function id(): string
{
return basename(dirname(__DIR__));
}
/**
* This module name
*/
public static function name(): string
{
return __((string) dcCore::app()->plugins->moduleInfo(self::id(), 'name'));
}
}

View file

@ -1,49 +0,0 @@
<?php
/**
* @brief testMail, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Osku 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\testMail;
/* clearbricks ns */
use Clearbricks;
class Prepend
{
private const LIBS = [
'Admin',
'Manage',
];
protected static $init = false;
public static function init(): bool
{
self::$init = defined('DC_RC_PATH');
return self::$init;
}
public static function process(): ?bool
{
if (!self::$init) {
return false;
}
foreach (self::LIBS as $lib) {
Clearbricks::lib()->autoload([
__NAMESPACE__ . '\\' . $lib => __DIR__ . DIRECTORY_SEPARATOR . $lib . '.php',
]);
}
return true;
}
}