Comment limiter le nombre de mots ?

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

J'ai vainement cherché sur le forum une réponse à mon problème, donc je vous l'expose.

Je cherche un moyen de limiter le nombre de mots (ou de lettres / ou de caractères) dans le corps de texte écrit par un utilisateur quand celui-ci propose un contenu.

Par exemple, un utilisateur n'aurait pas le droit de proposer un article de plus de 30 mots.

Existe-t-il un outil simple pour cela ?

Merci, je vous aime.

Version de Drupal : 

Je verrai 2 manieres de faire ca:
- en javascript via jquery et une tite fonction qui checke le nombre de mot de ton champs body
- via hook_form_alter une fois que le node est poste et tu fais le compte en PHP

Pour faire cela il faut soit connaitre le javascript soit le PHP. Donc si t'es plus a l'aise avec du JS, je recommande la methode jQuery, si c'est PHP, alors il faut alterer les entrailles de Drupal via le hook_form_alter hook_nodeapi au niveau "validate". Desole pour l'erreur :D Sincerement ca devient un peu plus complexe car il faut intercepter la validation de ton formulaire et renvoyer une erreur sur la taille de ton body.

Un ti schema qui aide a comprendre le workflow que suit un formulaire avec les differents niveau d'alteration http://drupal.org/node/165104 Form's API http://drupal.org/node/204266

Bon comme je pense que tout ca ca va etre du chinois pour toi je t'ai fait un exemple tout pret en creant un module max_body: name = Max Body tu mets ca ds un fichier max_body.info

<?php
function max_body_nodeapi(&$node, $op, $teaser) {
  switch (
$op) {
    case
'validate':
      if (isset(
$node->body) && count(explode(' ', $node->body)) > 10) {
       
form_set_error('body', t('The body is too long.'));
      }
      break;
  }
}
?>

Et ca dans max_body.module en enlevant le dernier ?> T'actives ton module et zou tu pourras plus creer de contenu de plus de 10 mots... Apres evidemment tu peux rafiner en choisissant le type de contenu: $node-type == 'page' etc...

Voila je pense que ca devrait t'aider et que tu approfondiras tout ca en lisant la doc meme si c'est clair que c'est un peu technique :D

Bon courage

Excuse-moi, j'aurais juste besoin de trois petites précisions (pour ne pas faire trop de bêtises) :

  • dans le fichier maxbody.info, je ne mets que name = Max Body c'est ça ?

  • pourquoi dans le max_body.module faut-il enlever le dernier ?> ?

  • j'ai eu beau chercher dans ta doc, et faire travailler mes neurones de newbie limité, je ne suis pas sûr de savoir où placer $node-type == ‘news’ (puisque ce n'est qu'au type de contenu 'news' que je souhaite appliquer cette règle).

C'est dur le chinois... :)

- dans le fichier maxbody.info, je ne mets que name = Max Body c'est ça ?
Ouep
- pourquoi dans le max_body.module faut-il enlever le dernier ?> ?
Ca vient d'une convention Drupal (et meme PHP d'ailleurs) qui permet d'eviter des pb d'espaces apres "?>" qui generent des erreurs PHP lorsque tu inclus ces fichiers (ce qui est le cas des modules).
Bref si tu regardes aucun fichier php/module de drupal ne devrait contenir ce signe qui est optionnel ds la doc de PHP

- j'ai eu beau chercher dans ta doc, et faire travailler mes neurones de newbie limité, je ne suis pas sûr de savoir où placer $node-type == ‘news’ (puisque ce n'est qu'au type de contenu 'news' que je souhaite appliquer cette règle).
Comme tu peux le voir, le code est en train de faire une analyse du $node (qui est un objet) pour savoir le nbr de mots du body.
Donc si tu mets if (isset($node->body) && count(explode(' ', $node->body)) > 10 && $node->type == 'news') tu vas rajouter automatiquement la restriction sur le type de node...

Ca marche, c'est magnifique, merci !

(Note : la fonction bogue un peu quand on dépasse le nombre de mots indiqué --> si on n'en enlève alors pas plus que le nécessaire, le message indiquant que le corps est trop long réapparaît et la proposition est rejetée. Ex: pour une limite à 30 mots, si le premier coup on en met 32, le message apparaît; si on descend alors à 29 mots, il s'affiche à nouveau; il faut encore enlever des mots. --> mais ce n'est pas grave, tostinni, merci encore !)

EDIT: La cerise sur le gâteau, y aurait-il un moyen simple dans ce module pour supprimer le saut à la ligne (le remplacer par un espace par exemple) ? Je suis gourmant là, je sais !

Oublie pas que la fonction que j'ai faite compte le nombre d'espaces donc c'est aps vraiment un vrai compte de mots, a la limite utilise plutot str_word_count

Pour la cerise, je te laisse regarder des fonctions de remplacement de "\n" ou "\n\r" (sous win) en PHP...
Hum...
Bon ca peut se faire sous "validate", mais sinon c'est plus logique de le faire dans la partie "submit" donc jette un oeil dans le hook_nodeapi.

Alors, j'ai essayé de pondre un code avec les renseignements que tu m'as fournis, mais comme je n'y connais pas grand chose en programmation donne-moi ton avis éclairé, s'il te plaît :

<?php
function max_body_nodeapi(&$node, $op, $teaser) {
  switch ($op) {
    case 'validate':
      if (isset($node->body) && str_word_count($node->body, 0)) > 10 && $node->type == 'news') {
        form_set_error('body', t('The body is too long.'));
      }
      break;

case 'submit':
if ($node->body && $node->type == 'news') {
              $$node->body=str_replace(CHR(13),"",$node->body);
      }
break;
}
}

Alors, c'est la cata ? :)

Bon, j'ai essayé et le résultat n'est pas bien brillant. J'ai eu le droit à un :

Parse error: syntax error, unexpected '>' in /home.52/l/e/k/monsite/www/V2/modules/max_body/max_body.module on line 5

Alors je suis revenu en arrière, puis j'ai ajouté uniquement la fonction de remplacement à la suite du 'validate':

<?php
function max_body_nodeapi(&$node, $op, $teaser) {
  switch ($op) {
    case 'validate':
      if (isset($node->body) && count(explode(' ', $node->body)) > 10) {
        form_set_error('body', t('The body is too long.'));
      }
      break;

case 'submit':
if ($node->body && $node->type == 'news') {
              $node->body=str_replace(CHR(13),"",$node->body);
  }
break;
}
}

Et là, rien ne se passe. J'ai toujours mes retours à la ligne.
Tu as une idée pour :
- le 'str_word_count' (la ligne 5 du "Parse Error") ?
- la fonction de remplacement qui n'a aucun effet ?

Merci de ta patience.