Submitted by zeurope on
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.
Je verrai 2 manieres de
Permalien Soumis par tostinni le 12 Mars, 2008 - 18:22
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
Ce que tu dis ressemble un
Permalien Soumis par zeurope le 12 Mars, 2008 - 20:00
Ce que tu dis ressemble un peu à du chinois pour un newbie comme moi, encore que certaines choses me parlent. Je vais essayer de creuser tes conseils. Merci.
Pour faire cela il faut soit
Permalien Soumis par tostinni le 12 Mars, 2008 - 21:38
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_alterhook_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.infoEt 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
Super, j'essaye ça très
Permalien Soumis par zeurope le 13 Mars, 2008 - 11:08
Super, j'essaye ça très vite. Je te dirai si je m'en sors. Merci !
Excuse-moi, j'aurais juste
Permalien Soumis par zeurope le 13 Mars, 2008 - 17:40
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
Permalien Soumis par tostinni le 13 Mars, 2008 - 18:15
- 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,
Permalien Soumis par zeurope le 13 Mars, 2008 - 21:52
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
Permalien Soumis par tostinni le 13 Mars, 2008 - 23:21
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
Permalien Soumis par zeurope le 14 Mars, 2008 - 11:58
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 ? :)
Ca a l'air bien ca, tu as
Permalien Soumis par tostinni le 14 Mars, 2008 - 18:36
Ca a l'air bien ca, tu as essaye voir si ca marche ?
Ya juste deux "$" devant "node->body"
Bon, j'ai essayé et le
Permalien Soumis par zeurope le 14 Mars, 2008 - 19:49
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.
- Le str_word_count ne lui
Permalien Soumis par tostinni le 14 Mars, 2008 - 20:17
Désolé, mais ça ne marche
Permalien Soumis par zeurope le 18 Mars, 2008 - 00:07
Désolé, mais ça ne marche pas.
Tant pis, le principal fonctionne donc je m'en contenterai.
Merci encore pour ton aide !