Valider 640271e2 rédigé par tcharlss's avatar tcharlss
Parcourir les fichiers

Nouveau type de vérification pour les slugs : identifiants informatiques sans...

Nouveau type de vérification pour les slugs : identifiants informatiques sans charactères spéciaux ou accentués, espaces blancs, etc.
Plus que la vérif, l'intérêt principal est de pouvoir les normaliser automatiquement.

Pour cela il faut la fonction slugify() qui se trouve pour l'instant dans le plugin Bonux. En espèrant qu'elle intègre le core sous peu.
En attendant, lorsqu'on demande à normaliser un slug sans ce dernier, ça crée un log d'erreur (on ne veut pas de dépendance obligatoire).

Il y a également une option pour suggérer la valeur normalisée dans le message d'erreur plutôt que de la changer silencieusement en arrière-plan, ce qui permet à l'utilisateur⋅ice de relire et garder la main.
parent 63c7e0c6
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+12 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -56,6 +56,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
	'erreur_regex' => 'Le format de la chaîne n’est pas valide.',
	'erreur_siren' => 'Le numéro de SIREN n’est pas valide.',
	'erreur_siret' => 'Le numéro de SIRET n’est pas valide.',
	'erreur_slug' => 'Uniquement des charactères alphanumériques en minuscules ou « @separateur@ ».',
	'erreur_slug_longueur_maxi' => '@nb_max@ charactère(s) au maximum (actuellement @nb@).',
	'erreur_slug_confirmer_normaliser' => 'Essayez « @valeur@ ».',
	'erreur_taille_egal' => 'La valeur doit comprendre exactement @egal@ caractères (actuellement @nb@).',
	'erreur_taille_entre' => 'La valeur doit comprendre entre @min@ et @max@ caractères (actuellement @nb@).',
	'erreur_taille_fichier' => 'Le fichier « @name@ » est trop lourd : @taille@ (maximum @taille_max@).',
@@ -120,6 +123,13 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
	'option_siren_siret_mode_label' => 'Que voulez-vous vérifier ?',
	'option_siren_siret_mode_siren' => 'le SIREN',
	'option_siren_siret_mode_siret' => 'le SIRET',
	'option_slug_longueur_maxi_label' => 'Longueur maximale',
	'option_slug_normaliser_label' => 'Normaliser automatiquement la valeur',
	'option_slug_normaliser_explication' => 'Normaliser les charactères accentués, la ponctuation, etc.<br>Exemple : « Ô, toi, l’écureuil ! » devient « o_toi_l_ecureuil »',
	'option_slug_confirmer_normaliser_label' => 'Suggérer la valeur normalisée.',
	'option_slug_confirmer_normaliser_explication' => 'Par défaut la normalisation s’opère silencieusement en arrière-plan. Vous pouvez en faire une simple suggestion pour permettre de garder la main.',
	'option_slug_separateur_label' => 'Séparateur',
	'option_slug_separateur_explication' => 'Charactère employé pour séparer les mots.',
	'option_taille_max_label' => 'Taille maximum',
	'option_taille_min_label' => 'Taille minimum',
	'option_url_mode_complet' => 'Vérification complète de l’url',
@@ -172,6 +182,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
	'type_regex_description' => 'Vérifie que la valeur correspond au masque demandé. Pour l’utilisation des masques, reportez-vous à <a href="http://fr2.php.net/manual/fr/reference.pcre.pattern.syntax.php">l’aide en ligne de PHP</a>.',
	'type_siren_siret' => 'SIREN ou SIRET',
	'type_siren_siret_description' => 'Vérifie que la valeur est un numéro valide du <a href="http://fr.wikipedia.org/wiki/SIREN">Système d’Identification du Répertoire des ENtreprises</a> français.',
	'type_slug' => 'Identifiant informatique (slug)',
	'type_slug_description' => 'Un slug est un court texte utilisable pour décrire et identifier une ressource. Il ne contient que des caractères alphanumériques ou un séparateur (le charactère «_»).',
	'type_taille' => 'Taille',
	'type_taille_description' => 'Vérifie que la taille de la valeur correspond au minimum et/ou au maximum demandé.',
	'type_telephone' => 'Numéro de téléphone',

verifier/slug.php

0 → 100644
+105 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php
/**
 * API de vérification : vérification de la validité d'un slug
 *
 * Slug : court texte utilisable [...] pour décrire et identifier une ressource.
 * Ne contient ni espace blanc, ponctuation ou charatère accentué.
 * https://en.wikipedia.org/wiki/Clean_URL#Slug
 * 
 * @plugin     verifier
 * @copyright  2018
 * @author     Les Développements Durables
 * @licence    GNU/GPL
 */

// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

/**
 * Vérifie la validité d'un slug
 *
 * Un slug ne contient que des charactères alphanumérique ou un séparateur (par défaut, un underscore)
 * Donc ni charactère accentué, ni espace blanc ou ponctuation.
 *
 * @note
 *   La normalisation nécéssite la fonction `slugify` présente pur l'instant dans le plugin Bonux
 *
 * @param string $valeur
 *   La valeur à vérifier.
 * @param array $options
 *   - (bool)   normaliser : convertir automatiquement la chaîne au bon format.
 *   - (bool)   confirmer_normaliser : suggérer la nouvelle valeur au lieu de procéder silencieusement en arrière-plan.
 *   - (string) separateur : charactère pour séparer les mots, défaut = underscore
 *   - (int)    longueur_maxi : nombre maximal de charactères, défaut = 60
 * @param null $valeur_normalisee
 *   Si normalisation à faire, la variable sera remplie par la chaîne normalisée.
 *   Ex. : « Ô, toi, l’écureuil ! » devient « o_toi_l_ecureuil »
 * @return string
 *   Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
 */
function verifier_slug_dist($valeur, $options = array(), &$valeur_normalisee = null) {

	// On reprend les options par défaut de slugify() car on veut afficher ces valeurs dans les messages d'erreurs
	$options_defaut = array(
		'separateur'    => '_',
		'longueur_maxi' => 60,
	);
	$options = array_merge($options_defaut, $options);
	$erreur        = '';
	$erreurs       = array(); // On permet d'afficher plusieurs erreurs séparées par des retours ligne
	$normaliser    = !empty($options['normaliser']);
	$confirmer     = !empty($options['confirmer_normaliser']);
	$separateur    = $options['separateur'];
	$longueur_maxi = $options['longueur_maxi'];

	// Format : uniquement des charactères alphanumériques en minuscules ou le séparateur
	$is_slug = preg_match("/^[a-z0-9]+(?:${separateur}[a-z0-9]+)*\$/", $valeur);

	// Sans normalisation
	if (!$normaliser) {
		// Format incorrect
		if (!$is_slug) {
			$erreurs[] = _T('verifier:erreur_slug', array('separateur' => $separateur));
		}
		// Longeur max
		if (($longueur = strlen($valeur)) > $longueur_maxi) {
			$erreurs[] = _T('verifier:erreur_slug_longueur_maxi', array('nb_max' => $longueur_maxi, 'nb' => $longueur));
		}
	}

	// Avec normalisation
	if (
		$normaliser
		and !$is_slug
	) {
		if (function_exists('slugify')) {
			$options = array(
				'separateur'    => $separateur,
				'longueur_maxi' => $longueur_maxi,
			);
			$options = array_filter($options);
			$valeur_normalisee = slugify($valeur, '', $options);

			// Suggérer la valeur normalisée afin que l'utilisateur⋅ice garde la main.
			// La valeur normalisée tient compte de la longueur max, mais on l'indique au cas-où.
			if (
				$confirmer
				and $valeur != $valeur_normalisee
			) {
				$erreurs[] = _T('verifier:erreur_slug', array('separateur' => $separateur));
				if (($longueur = strlen($valeur)) > $longueur_maxi) {
					$erreurs[] = _T('verifier:erreur_slug_longueur_maxi', array('nb_max' => $longueur_maxi, 'nb' => $longueur));
				}
				$erreurs[] = _T('verifier:erreur_slug_confirmer_normaliser', array('valeur' => $valeur_normalisee));
			}
		} else {
			spip_log('La normalisation d’un slug nécéssite le plugin Bonux', 'verifier' . _LOG_ERREUR);
		}
	}

	$erreur = implode('<br>', $erreurs);

	return $erreur;
}

verifier/slug.yaml

0 → 100644
+32 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff

titre: '<:verifier:type_slug:>'
description: '<:verifier:type_slug_description:>'
options:
  -
    saisie: 'input'
    options:
      nom: 'longueur_maxi'
      label: '<:verifier:option_slug_longueur_maxi_label:>'
      defaut: 60
  -
    saisie: 'case'
    options:
      nom: 'normaliser'
      label_case: '<:verifier:option_slug_normaliser_label:>'
      explication: '<:verifier:option_slug_normaliser_explication:>'
  -
    saisie: 'case'
    options:
      nom: 'confirmer_normaliser'
      label_case: '<:verifier:option_slug_confirmer_normaliser_label:>'
      explication: '<:verifier:option_slug_confirmer_normaliser_explication:>'
      defaut: ''
      afficher_si: '@normaliser@ != ""'
  -
    saisie: 'input'
    options:
      nom: 'separateur'
      label: '<:verifier:option_slug_separateur_label:>'
      explication: '<:verifier:option_slug_separateur_explication:>'
      defaut: '_'
      afficher_si: '@normaliser@ != ""'
 No newline at end of file