Coup de balai

L'homme au balai, Treffiagat, France, août 2010
La zone de carénage et de remise en état des bateaux au Guilvinec

J’en parlais hier :

Après avoir poussé le commit d’hier, j’en ai à peu près fini avec le cœur de Dotclear, reste à faire un tour du côté des plugins et des thèmes et enfin de la partie administration où j’ai quelques idées pour rendre ça un poil plus lisible.

Au hasard, le fichier admin/blog_del.php passer de ceci :

<?php
/**
 * @package Dotclear
 * @subpackage Backend
 *
 * @copyright Olivier Meunier & Association Dotclear
 * @copyright GPL-2.0-only
 */
require __DIR__ . '/../inc/admin/prepend.php';

dcPage::checkSuper();

$blog_id   = '';
$blog_name = '';

$rs = null;

if (!empty($_POST['blog_id'])) {
    try {
        $rs = dcCore::app()->getBlog($_POST['blog_id']);
    } catch (Exception $e) {
        dcCore::app()->error->add($e->getMessage());
    }

    if ($rs->isEmpty()) {
        dcCore::app()->error->add(__('No such blog ID'));
    } else {
        $blog_id   = $rs->blog_id;
        $blog_name = $rs->blog_name;
    }
}

# Delete the blog
if (!dcCore::app()->error->flag() && $blog_id && !empty($_POST['del'])) {
    if (!dcCore::app()->auth->checkPassword($_POST['pwd'])) {
        dcCore::app()->error->add(__('Password verification failed'));
    } else {
        try {
            dcCore::app()->delBlog($blog_id);
            dcPage::addSuccessNotice(sprintf(__('Blog "%s" successfully deleted'), html::escapeHTML($blog_name)));

            dcCore::app()->adminurl->redirect('admin.blogs');
        } catch (Exception $e) {
            dcCore::app()->error->add($e->getMessage());
        }
    }
}

dcPage::open(
    __('Delete a blog'),
    '',
    dcPage::breadcrumb(
        [
            __('System')        => '',
            __('Blogs')         => dcCore::app()->adminurl->get('admin.blogs'),
            __('Delete a blog') => '',
        ]
    )
);

if (!dcCore::app()->error->flag()) {
    echo
    '<div class="warning-msg"><p><strong>' . __('Warning') . '</strong></p>' .
    '<p>' . sprintf(
        __('You are about to delete the blog %s. Every entry, comment and category will be deleted.'),
        '<strong>' . $blog_id . ' (' . $blog_name . ')</strong>'
    ) . '</p></div>' .
    '<p>' . __('Please give your password to confirm the blog deletion.') . '</p>';

    echo
    '<form action="' . dcCore::app()->adminurl->get('admin.blog.del') . '" method="post">' .
    '<div>' . dcCore::app()->formNonce() . '</div>' .
    '<p><label for="pwd">' . __('Your password:') . '</label> ' .
    form::password('pwd', 20, 255, ['autocomplete' => 'current-password']) . '</p>' .
    '<p><input type="submit" class="delete" name="del" value="' . __('Delete this blog') . '" />' .
    ' <input type="button" value="' . __('Cancel') . '" class="go-back reset hidden-if-no-js" />' .
    form::hidden('blog_id', $blog_id) . '</p>' .
        '</form>';
}

dcPage::close();

À cela :

<?php
/**
 * @package Dotclear
 * @subpackage Backend
 *
 * @copyright Olivier Meunier & Association Dotclear
 * @copyright GPL-2.0-only
 */
require __DIR__ . '/../inc/admin/prepend.php';

class adminBlogDel
{
    /**
     * Initializes the page.
     */
    public static function init()
    {
        dcPage::checkSuper();

        dcCore::app()->admin->blog_id   = '';
        dcCore::app()->admin->blog_name = '';

        if (!empty($_POST['blog_id'])) {
            try {
                $rs = dcCore::app()->getBlog($_POST['blog_id']);
            } catch (Exception $e) {
                dcCore::app()->error->add($e->getMessage());
            }

            if ($rs->isEmpty()) {
                dcCore::app()->error->add(__('No such blog ID'));
            } else {
                dcCore::app()->admin->blog_id   = $rs->blog_id;
                dcCore::app()->admin->blog_name = $rs->blog_name;
            }
        }
    }

    /**
     * Processes the request(s).
     */
    public static function process()
    {
        if (!dcCore::app()->error->flag() && dcCore::app()->admin->blog_id && !empty($_POST['del'])) {
            // Delete the blog
            if (!dcCore::app()->auth->checkPassword($_POST['pwd'])) {
                dcCore::app()->error->add(__('Password verification failed'));
            } else {
                try {
                    dcCore::app()->delBlog(dcCore::app()->admin->blog_id);
                    dcPage::addSuccessNotice(sprintf(__('Blog "%s" successfully deleted'), html::escapeHTML(dcCore::app()->admin->blog_name)));

                    dcCore::app()->adminurl->redirect('admin.blogs');
                } catch (Exception $e) {
                    dcCore::app()->error->add($e->getMessage());
                }
            }
        }
    }

    /**
     * Renders the page.
     */
    public static function render()
    {
        dcPage::open(
            __('Delete a blog'),
            '',
            dcPage::breadcrumb(
                [
                    __('System')        => '',
                    __('Blogs')         => dcCore::app()->adminurl->get('admin.blogs'),
                    __('Delete a blog') => '',
                ]
            )
        );

        if (!dcCore::app()->error->flag()) {
            $msg = '<strong>' . __('Warning') . '</strong></p><p>' . sprintf(
                __('You are about to delete the blog %s. Every entry, comment and category will be deleted.'),
                '<strong>' . dcCore::app()->admin->blog_id . ' (' . dcCore::app()->admin->blog_name . ')</strong>'
            );
            dcAdminNotices::warning($msg, false, true);

            echo
            // Legend
            (new formPara())
            ->items([
                (new formText())->text(__('Please give your password to confirm the blog deletion.')),
            ])->render() .
            // Form
            (new formForm('form-del'))
            ->action(dcCore::app()->adminurl->get('admin.blog.del'))
            ->method('post')
            ->fields([
                dcCore::app()->formNonce(false),
                (new formPara())
                    ->items([
                        (new formPassword('pwd'))
                            ->size(20)
                            ->maxlength(255)
                            ->autocomplete('current-password')
                            ->label((new formLabel(
                                __('Your password:'),
                                formLabel::OUTSIDE_LABEL_BEFORE
                            ))),
                    ]),
                (new formPara())
                    ->separator(' ')
                    ->items([
                        (new formSubmit('del'))
                            ->class('delete')
                            ->value(__('Delete this blog')),
                        (new formButton('back'))
                            ->class(['go-back', 'reset', 'hidden-if-no-js'])
                            ->value(__('Cancel')),
                    ]),
                (new formHidden('blog_id', dcCore::app()->admin->blog_id)),
            ])->render();
        }

        dcPage::close();
    }
}

adminBlogDel::init();
adminBlogDel::process();
adminBlogDel::render();

En gros :

  • Une classe statique avec (en général) trois méthodes, une pour l’initialisation ::init(), une pour le traitement de la ou des requêtes ::process(), une pour le rendu de la page ::render().
  • Suppression des variables (globales) et basculement vers des propriétés de l’instance d’administration dcCore::app()->admin->….
  • Utilisation de la bibliothèque d’abstraction pour la construction des formulaires (essentiellement).

Un premier pas vers une gestion un peu plus objet des pages de l’administration des blogs.

En particulier j’envisage, plus tard, d’extraire les classes — qui resteront statiques ou pas, on verra —, pour pouvoir les étendre ; je pense entre autre à la page d’édition d’une page qui ressemble furieusement à celle de l’édition d’un billet, à quelques choses près, et où la première pourrait hériter de la seconde pour éviter la redondance de code.

Perso — et je sais que certains ne seront pas d’accord avec moi — j’aime bien :-)

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15475

Haut de page