maxlength - visuel

Limiter de manière programmée la longeur d'un textarea avec le module MaxLength

Petite astuce bien utile pour limiter la longueur maximum d'un texte.

Sur ce blog, j'utilise un type de contenu "billet de blog" qui me permet de créer des articles. J'utilise également d'autres types de contenus pour mon site officiel, qui est basé sur le même noyau, en utilisant les modules "domain" de Drupal pour séparer les contenus du domaine principal et ceux du blog.

Sur l'architecture du site, j'utilise le module "metatag" pour agrémenter de balises méta le code source, afin que les partages vers les réseaux sociaux prennent en compte certaines données telles qu'un titre, une description, une ou plusieurs images à choix. 

Pour ne pas multiplier les champs sans raison, je me suis dit qu'utiliser la partie "résumé" du champ body conviendrait très bien pour la partie "description" de mes méta-données. Seulement, la méta description ne peut pas être illimitée en terme de nombre de caractères. Les principaux moteurs d'indexation préconisent une longueur d'environ 160 caractères. Pour éviter de dépasser cette longueur, je voulais mettre en place un petit système qui permettre d'indiquer le nombre de caractères restants par rapport à une base de 160 caractères autorisés. 

J'aurai pu mettre en place un petit code en JQuery afin de faire l'affaire, mais j'ai effectué quelques recherches pour savoir si il existait un module Drupal permettant de faire le job. Pourquoi ré-inventer la roue quand elle existe déjà, me direz-vous... 

Bref. Je suis tombé sur le module "MaxLength", qui, dans les grandes lignes, permet d'appliquer une limite au nombre de caractère d'un champ texte. Malheureusement, le champ "body" par défaut d'un contenu, avec son second champ "résumé", est un peu spécial. MaxLength me permettrait de limiter le champ body, mais pas la partie résumé. J'ai donc continué les recherches jusqu'à trouver une petite explication sur "comment appliquer par code" le comportement du module MaxLength (malheureusement je n'ai pas retrouvé le lien... c'était sur stackoverflow).

Au final, voici le résultat : 

function mymodule_form_alter( &$form, &$form_state, $form_id ) {
  if( module_exists( 'maxlength' ) && isset( $form['#node_edit_form'] ) ) {
    $maxlength = 160;
    $form['body'][LANGUAGE_NONE][0]['summary']['#maxlength'] = $maxlength;
    $form['body'][LANGUAGE_NONE][0]['summary']['#maxlength_js'] = TRUE;
    $form['body'][LANGUAGE_NONE][0]['summary']['#attributes']['maxlength_js_label'] = t("Summary should be a maximum of @maxlength characters.  Number of characters remaining: @remaining", array( '@maxlength' => $maxlength ) );
  }
}

J'implémente hook_form_alter sur un module custom, je teste si le module MaxLength est actif, et si je suis sur l'édition d'un noeud. Si c'est le cas, alors j'applique quelques modifications sur la partie "summary" du champ body : 

  • #maxlength est valorisé à 160
  • #maxlength_js est passé à VRAI
  • #attributes->maxlength_js_label est valorisé avec un texte indicatif du nombre de caractères restants.

Le tour est joué. Il ne me reste plus qu'à indiquer au module Metatags que c'est la valeur de sommaire qui doit être utilisée pour les méta-données description et og:description.

J'ai en réalité implémenté hook_token_info et hook_tokens afin de créer un token personnalisé qui tente de récupérer la valeur du sommaire, et si le sommaire n'est pas rempli, alors il récupère la valeur du champ body, coupée après 160 caractères, mais ça, c'est une autre histoire ;-)

Ajouter un commentaire

CAPTCHA
Cette question permet de savoir si vous êtes un visiteur ou un robot de soumission de spams