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 :
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.
1 De Bernard -
Petite remarque à la lecture du premier chapitre de ce post:
Bien que cela ne génère, apparemment, pas d’erreur, puisque le répertoire
/inc
et le fichierinc/a11yconfig.behaviors.php
ont été supprimés, il me semble qu’il faudrait aussi supprimer (ou mettre en commentaire) dans_prepend.php
la ligne d’autoload de la librairie devenue “inutile”:$autoload['a11yconfigAdminBehaviors'] = dirname(FILE__) .'/inc/a11yconfig.behaviors.php';
2 De Bernard -
Concernant le fichier _install.php je suppose qu’il est envisageable d’intégrer la possibilité de traduire la description, par ex :
$core->blog->settings->a11yConfig->put('injection', false, 'boolean', __('Automatic insertion'), false, true);
3 De Franck -
Concernant le __prepend.php on peut même le supprimer complètement puisqu’il ne faisait que ça ! Tu as raison Bernard.
Concernant les « traductions », il est d’usage de ne laisser que la version anglaise pour l’initialisation, puisque ça peut être utilisé par plusieurs, éventuellement de langues différentes.