Développer un plugin, injection automatique, 1re partie

On continue avec le développement du plugin pour ajouter, cette fois, une fonction d’insertion automatique du bouton d’Access42, dans l’entête ou dans le pied de page du blog, à la place du widget proposé jusqu’ici.


Mais auparavant, pour simplifier un peu le code, je propose de supprimer les options (pour l’instant limitées à l’activation ou pas du plugin) des paramètres du blog ; on ne conservera que la page principale de réglage (celle gérée par le fichier index.php).

Pour ça j’ai supprimé le fichier inc/a11yconfig.behaviors.php et au passage le répertoire inc puisqu’il est désormais vide (on le recréera si besoin en fonction des développements futurs).

Puis dans le fichier _admin.php j’ai supprimé les deux enregistrements des traitements associés aux behaviors adminBlogPreferencesForm et adminBeforeBlogSettingsUpdate qui ne sont plus nécessaires.

Enfin, dans le fichier _define.php, j’ai supprimé la référence à ces réglages dans la page des paramètres du blog — ainsi que celle des préférences utilisateurs, pas encore utile.

Vous pouvez retrouver le commit correspondant ici.


Maintenant qu’on a fait un peu de ménage, passons au système d’injection automatique.

Première chose à prévoir, les réglages associés qui reprennent peu ou prou ceux disponibles pour le widget. Ça se passe dans le fichier index.php dont voici le code source complet :

<?php
/**
 * @brief a11yConfig, a plugin for Dotclear 2
 *
 * @package Dotclear
 * @subpackage Plugins
 *
 * @author Franck Paul, Biou and contributors
 *
 * @copyright Franck Paul carnet.franck.paul@gmail.com
 * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
 */

if (!defined('DC_CONTEXT_ADMIN')) {return;}

// Get current options
$core->blog->settings->addNamespace('a11yConfig');

$a11yc_positions = [
    0 => __('In header'),
    1 => __('In footer')
];

$a11yc_active = (boolean) $core->blog->settings->a11yConfig->active;

$a11yc_injection = (boolean) $core->blog->settings->a11yConfig->injection;
$a11yc_label     = $core->blog->settings->a11yConfig->label;
$a11yc_position  = (integer) $core->blog->settings->a11yConfig->position;

$a11yc_font          = (boolean) $core->blog->settings->a11yConfig->font;
$a11yc_linespacing   = (boolean) $core->blog->settings->a11yConfig->linespacing;
$a11yc_justification = (boolean) $core->blog->settings->a11yConfig->justification;
$a11yc_contrast      = (boolean) $core->blog->settings->a11yConfig->contrast;
$a11yc_image         = (boolean) $core->blog->settings->a11yConfig->image;

if (!empty($_POST)) {
    try
    {
        $a11yc_active = !empty($_POST['a11yc_active']);

        $a11yc_injection     = !empty($_POST['a11yc_injection']);
        $a11yc_label         = html::escapeHTML($_POST['a11yc_label']);
        $a11yc_position      = abs((integer) $_POST['a11yc_position']);
        $a11yc_font          = !empty($_POST['a11yc_font']);
        $a11yc_linespacing   = !empty($_POST['a11yc_linespacing']);
        $a11yc_justification = !empty($_POST['a11yc_justification']);
        $a11yc_contrast      = !empty($_POST['a11yc_contrast']);
        $a11yc_image         = !empty($_POST['a11yc_image']);

        # Everything's fine, save options
        $core->blog->settings->addNamespace('a11yConfig');

        $core->blog->settings->a11yConfig->put('active', $a11yc_active);

        $core->blog->settings->a11yConfig->put('injection', $a11yc_injection);
        $core->blog->settings->a11yConfig->put('label', $a11yc_label);
        $core->blog->settings->a11yConfig->put('position', $a11yc_position);
        $core->blog->settings->a11yConfig->put('font', $a11yc_font);
        $core->blog->settings->a11yConfig->put('linespacing', $a11yc_linespacing);
        $core->blog->settings->a11yConfig->put('justification', $a11yc_justification);
        $core->blog->settings->a11yConfig->put('contrast', $a11yc_contrast);
        $core->blog->settings->a11yConfig->put('image', $a11yc_image);

        $core->blog->triggerBlog();

        dcPage::addSuccessNotice(__('Settings have been successfully updated.'));
        http::redirect($p_url);
    } catch (Exception $e) {
        $core->error->add($e->getMessage());
    }
}

?>
<html>
<head>
  <title><?php echo __('a11yConfig'); ?></title>
</head>

<body>
<?php
echo dcPage::breadcrumb(
    [
        html::escapeHTML($core->blog->name) => '',
        __('a11yConfig')                    => ''
    ]);
echo dcPage::notices();

echo
'<form action="' . $p_url . '" method="post">' .
'<p>' . form::checkbox('a11yc_active', 1, $a11yc_active) . ' ' .
'<label for="a11yc_active" class="classic">' . __('Active a11yConfig') . '</label></p>';

echo
'<p class="form-note">' . sprintf(__('A widget is available (see <a href="%s">%s</a>)'), $core->adminurl->get('admin.plugin.widgets'), __('Presentation widgets')) . '</p>';

echo
'<h3>' . __('Automatic insertion') . '</h3>' .
'<p>' . form::checkbox('a11yc_injection', 1, $a11yc_injection) . ' ' .
'<label for="a11yc_injection" class="classic">' . __('Automatic insertion') . '</label></p>';

echo
'<p><label for="a11yc_label" class="required" title="' . __('Required field') . '"><abbr title="' . __('Required field') . '">*</abbr> ' . __('Label:') . '</label> ' .
form::field('a11yc_label', 30, 256, html::escapeHTML($a11yc_label), '', '', false, 'required placeholder="' . __('Accessibility parameters') . '"') .
    '</p>';

// Options for automatic insertion
echo '<h4>' . __('Position:') . '</h4>';
echo
'<p class="form-note">' . __('The automatic insertion in header depends on the <strong>publicTopAfterContent</strong> behavior and in footer on <strong>publicFooterContent</strong> behavior. Adapt theme\'s template files if necessary.') . '</p>';
$i = 0;
foreach ($a11yc_positions as $k => $v) {
    echo '<p><label for="a11yc_position_' . $i . '" class="classic">' .
    form::radio(['a11yc_position', 'a11yc_position_' . $i], $k, $a11yc_position == $k) . ' ' . $v . '</label></p>';
    $i++;
}

echo '<h4>' . __('Options:') . '</h4>';
echo
'<p>' . form::checkbox('a11yc_font', 1, $a11yc_font) . ' ' .
'<label for="a11yc_font" class="classic">' . __('Font adaptation') . '</label></p>' .
'<p>' . form::checkbox('a11yc_linespacing', 1, $a11yc_linespacing) . ' ' .
'<label for="a11yc_linespacing" class="classic">' . __('Line Spacing adaptation') . '</label></p>' .
'<p>' . form::checkbox('a11yc_justification', 1, $a11yc_justification) . ' ' .
'<label for="a11yc_justification" class="classic">' . __('Justification adaptation') . '</label></p>' .
'<p>' . form::checkbox('a11yc_contrast', 1, $a11yc_contrast) . ' ' .
'<label for="a11yc_contrast" class="classic">' . __('Contrast adaptation') . '</label></p>' .
'<p>' . form::checkbox('a11yc_image', 1, $a11yc_image) . ' ' .
'<label for="a11yc_image" class="classic">' . __('Image replacement') . '</label></p>';

echo
'<p>' . $core->formNonce() . '<input type="submit" value="' . __('Save') . '" /></p>' . '</form>';

?>
</body>
</html>

Une première partie, lignes 17 à 34, sert à récupérer les réglages enregistrés dans la base de données pour le blog courant.

Une deuxième partie, lignes 36 à 71, sert à enregistrer les réglages soumis via le formulaire lorsqu’on clique sur le bouton « Enregistrer ».

Une troisième partie, lignes 74 à la fin, sert à afficher le formulaire des réglages.

Et voilà à quoi ça ressemble côté affichage :

a11yConfig : options pour l'injection, déc. 2019

Vous noterez que par rapport à la version précédente, on a ajouté toute une section concernant l’insertion automatique avec :

  • Une case à cocher pour activer ce système
  • Un champs permettant de définir le libellé du bouton
  • Le choix de la position (dans l’entête du blog ou dans son pied de page)
  • Et enfin les options spécifiques aux réglages d’accessibilité (qu’on retrouve aussi du côté du widget)

Par ailleurs j’ai aussi ajouté dans le fichier _install.php ce qu’il fallait pour initialiser les valeurs par défauts :

$core->blog->settings->a11yConfig->put('injection', false, 'boolean', 'Automatic insertion', false, true);
$core->blog->settings->a11yConfig->put('label', 'Accessibility parameters', 'string', 'Label', false, true);
$core->blog->settings->a11yConfig->put('position', 0, 'integer', 'Position', false, true);

$core->blog->settings->a11yConfig->put('font', true, 'boolean', 'Font adaptation', false, true);
$core->blog->settings->a11yConfig->put('linespacing', true, 'boolean', 'Line spacing adaptation', false, true);
$core->blog->settings->a11yConfig->put('justification', true, 'boolean', 'justification adaptation', false, true);
$core->blog->settings->a11yConfig->put('contrast', true, 'boolean', 'contrast adaptation', false, true);
$core->blog->settings->a11yConfig->put('image', true, 'boolean', 'Image replacement', false, true);

Pour « forcer » ces nouvelles initialisations il faudra songer à modifier le numéro de version dans le fichier _define.php :

<?php
/**
 * @brief a11yConfig, a plugin for Dotclear 2
 *
 * @package Dotclear
 * @subpackage Plugins
 *
 * @author Franck Paul, Biou and contributors
 *
 * @copyright Franck Paul carnet.franck.paul@gmail.com
 * @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
 */

if (!defined('DC_RC_PATH')) {return;}

$this->registerModule(
    __("a11yConfig"),                                           // Name
    __("Implements Access42 accessibility configuration tool"), // Description
    "Franck Paul, Biou and contributors",                       // Author
    '1.1',                                                      // Version
    [
        'requires'    => [['core', '2.15']],
        'permissions' => 'admin',                                     // Permissions
        'type'        => 'plugin',                                    // Type
        'support'     => 'https://github.com/franck-paul/a11yConfig', // Support URL
    ]
);

On va s’arrêter là pour aujourd’hui et on reprendra demain avec la seconde partie concernant l’affichage côté public du blog.

Ajouter un commentaire

Comments can be formatted using the Markdown syntax.

Ajouter un rétrolien

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

Haut de page