[RÉSOLU] Emploi de hook_link_alter dans un template.php

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.

Bonjours à tous!

Je travail actuellement sur un thème Drupal version 6.x. Jusqu'ici, tout va à merveille. Cependant, je viens de frapper mon premier problème majeur (ça fait plus de 2 heures que je buche sur ce problème).

J'essai de modifier les titres des liens qui se trouvent dans le teaser. Les liens du genre 'Ajouter un commentaire' (comment_add) 'En savoir plus' (node_read_more) et '2 commentaires' (comment_comments).

J'aimerais simplement afficher des titres différents de ceux incluent dans le core.

J'ai déjà lu plusieurs billets à ce sujet. On y parle de la modification des termes avec le module de traduction, de création d'un module personnalisé avec la fonction hook_link_alter. Cependant, ce que j'aimerais faire, c'est d'insérer la fonction hook_link_alter dans le fichier template.php propre à mon thème sans faire appel à un module personnel ni à un tour de passe passe non exportable avec le module de traduction. Est-ce possible?

Le but étant simplement d'avoir un thème qui ne dépende pas d'autre ressources que le core Drupal pour être afficher convenablement.

N'hésitez pas à faire l'emploi d'exemples complet de votre code à ajouter au fichier template.php afin de simplifier la compréhension de la réponse.

Forum : 
Version de Drupal : 

L'obligation de charger plusieurs modules si je veux que mon thème s'affiche convenablement. C'est un peu lourds, finalement, non?

M'enfin... comment je m'y prend alors, pour créé ce fameux module et modifier le texte avec lui?

Tu peux faire ton module en suivant ce tuto : http://arnumeral.fr/node/14
Ici j'y explique l'ajout d'un lien, il suffit que tu remplaces le hook_link par le hook_link_alter et c'est bon. Pour le reste suis le lien donné par lienty, tout y est :)

Sinon pour ce qui est d'être lourd, je ne trouve pas spécialement, autant que peut l'être un thème au fond. Pour moi un site développé avec Drupal c'est au minimum 1 thème et 1 module custom. Avec cela tu fais absolument ce que tu veux.

Je suis nouveau en ce qui concerne Drupal. Alors, pour moi la notion de module custom est nouvelle et symbole de lourdeur de script alors qu'un thème, selon ma vision première, se devrait d'être le plus léger possible et simple à transposer d'un site à l'autre sans avoir à faire diverses installations pour parvenir aux fins de l'utilisateur final.

Cependant, étant totalement novice, je m'en remet à vos bons conseils et vos connaissances professionnelles.

Je vais donc essayer tout ça et je vous reviens avec mon verdict final (ou plein de points d'interrogation).

PS: Merci Yoran pour ton lien et ton aide.

C'est génial! Ça fonctionne à merveille.

Cependant.. j'ai tout de même une question (hehe) concernant 'comment_comments' (liens vers les commentaires avec, comme titre, le décompte du nombre de commentaires).

J'ai donc fait mon module avec le code suivant:

<?php
   
function NOMDEMONTHEME_link_alter(&$links, $node){
       foreach (
$links as $name => $link) {
            if (
$name=="comment_add"){
               
$links[$name]['title'] = "Ajoutez un commentaire"; }
            if (
$name=="node_read_more"){
               
$links[$name]['title'] = "Lisez la suite de l'article"; }       
           if (
$name=="comment_comments"){
                return
t('@commentaire', array('@commentaire' => format_plural($all, '1 commentaire à ce sujet', '@count commentaires à ce sujet'))); }   
        }
    }
?>

Malheureusement, comment_comments ne s'affiche pas correctement?

Des idées comment parvenir à afficher un texte différent selon la quantité de commentaire pour un node? :(

Concernant ton code et spécialement la ligne :

<?php
 
return t('@commentaire', array('@commentaire' => format_plural($all, '1 commentaire à ce sujet', '@count commentaires à ce sujet'))); }   
?>

1/ Tu devrais utiliser des switch / case qui rendrait le code plus rapide et plus compact
2/ Pourquoi fais tu un return plutôt qu'un $links[$name]['title'] =
3/ Tu utilises la fonction t() sur quelque chose de variable ce qui ne sert du coup pas à grand chose car il traduire @commentaire ;-)
4/ Même si tu mettais le t() au bons endroits, si tu laisses les chaînes en français, tu fais perdre du temps à ton code pour rien.
5/ Quelle valeur est censée avoir la variable $all qui n'est déclarée nul part ?

Pour ce qui est du nombre de commentaires, tu as cela normalement accessible dans le champ $node->comment_count

Voilà! C'est pourquoi j'étais frileux à la création d'un module. Cependant, si justement ce module était dans le dossier même de mon thème, je n'y verrais aucun problème. :)

Concernant la ligne de code pour la valeur 'comment_comments', j'étais vraiment dans le champ gauche. Il faut savoir que j'ai écrit cette dernière ligne tard de soir sous l'effet de caféine en la copiant intégralement d'un core Drupal sans chercher à la comprendre ou l'adapter. ;) Elle ressemble maintenant à ça...

<?php
           
if ($name=="comment_comments"){
               
$links[$name]['title'] = format_plural($node->comment_count, '1 commentaire', '@count commentaires'); }
/
?>

... et est entièrement fonctionnelle.

J'ai cependant essayer de changer le code complet pour une structure switch mais sans succès. J'en suis encore à mes débuts en PHP... ça doit être la raison principale de mon échec.

Est-ce que la structure actuelle (foreach) risque d'alourdir le fonctionnement du site??

Tu n'as pas tord. Philosophiquement cela pose en effet un problème. Au delà de la légèreté, un thème est censé opérer une séparation entre fonctionnalités (couche métier) et présentation. Les modules sont du domaine du métier, pas de la présentation. Donc je comprend assez bien ce qui te gène car tes modifications de liens sont de l'ordre de la présentation, pas du fonctionnel.

En réalité il manque une fonction à Drupal depuis un certain temps déjà, c'est la possibilité d'avoir un dossier de modules dans le thème lui-même. En attendant que ça arrive un jour (mais j'ai un doute car peu de gens ont cette approche ultra rigoureuse du développement, surtout web ;-) il faut faire comme on peut :)

Nouveau problème... :)

Les accents et caractères spéciaux. Comment on fait pour les écrire?

Voici un exemple

­

<?php
if ($name=="comment_add"){
$links[$name]['title'] = "Réagir"; }
?>

Ne fonctionne pas. En fait, si je met un accent ou un caractère spécial directement dans mon code, rien ne s'affiche.

J'ai donc tenter de corriger la situation en remplacant 'é' par 'é' comme ceci...

<?php
if ($name=="comment_add"){
$links[$name]['title'] = "Réagir"; }
?>

... et maintenant ça fonctionne. é est une correspondance UTF8 -> ISO-8859-1. Alors LÀ je me pose une question... qu'est-ce que du ISO-8859-1 vient faire dans Drupal. Il me semblait qu'il utilisait seulement du UTF8. ???

Bref, il y aurais moyen de pouvoir écrire mon texte directement sans avoir à trouver les correspondances pour tous les caractères 'spéciaux'?

EDIT: Étrangement... maintenant ça fonctionne sans l'ajout des correspondances. Allez savoir pourquoi.. je sais pas. Je viens d'ouvrir mon module personnalisé et tous mes caractères de correspondance étaient redevenu 'par eu-même' (oh comme ils sont sympas!) sous leur forme d'affichage. Donc, Réagir était devenu Réagir. Maintenant je peux taper n'importe quelle valeur sans avoir à me soucier d'inscrire un caractère de correspondance. Est-ce l'œuvre du Farfadet Drupal?

Là le blâmerais plutôt votre environnement de développement qui doit encoder les sources en ISO. Drupal n'a pas grand chose à voir avec cela. Personnellement je saisi les accents sans problème.

En effet, ça semble être le problème. J'emploi WAMP (versions 2.2.11/5.3.0/5.1.36) et mes variables MySQL me donnent ceci:

character set client utf8
(Valeur globale) latin1
character set connection utf8
(Valeur globale) latin1
character set database latin1
character set filesystem binary
character set results utf8
(Valeur globale) latin1
character set server latin1
character set system utf8
character sets dir c:\wamp\bin\mysql\mysql5.1.36\share\charsets\
collation connection utf8_general_ci
(Valeur globale) latin1_swedish_ci
collation database latin1_swedish_ci
collation server latin1_swedish_ci

T'aurais une idée comment arranger ce problème?

Comme dit Yoran ça vient de l'éditeur : l'encodage de celui-ci doit être en utf-8 (sans bom.)

Pour le tour de passe de passe avec le module de traduction je comprends ta réticence mais en fait ça dépend de ton objectif : si c'est juste pour ton besoin perso tu fais comme cela t'arranges le mieux.

Si tu penses le contribuer dans les bonnes pratiques de contribution Drupal, tu dois faire en sorte que ta chaine soit
1) traduisible en passant par la fonction t()
2) en anglais puisque c'est le langage par défaut de Drupal

Dans cette optique mieux vaut laisser t('read more') - le code existant à la base avant ton hook -, afin que les gens le traduisent comme ils le veulent.

Hello
j'ai un peu réfléchi tout à l'heure pour comprendre ce fameux preprocess est en fait tu peux faire ça avec template php en deux temps si tu es toujours intéressé
1) écrire ceci dans le template.php

<?php
function phptemplate_preprocess_node(&$vars) {
 
$vars['node']->links['comment_add']['title'] = 'Mon nouveau titre pour ajouter un commentaire';
}
?>

2) dans ton node.tpl.php il faut que tu vires la variables

<?php
 
print $links;
?>

et que tu mettres

<?php
 
print theme_links($node->links);
?>

à la place.

Merci de votre aide si précieuse.

J'ai réussi grâce à la technique de Yoran.

Je demeure cependant déçu de l'obligation de créé un module personnalisé pour effectuer des modifications qui (à mon avis) devraient être entièrement pris en charge par le template. Cependant, le fait que l'utilisateur a la chance de mettre module personnalisé et template dans un seul dossier commun m'aide à passer par dessus ce problème « philosophique »

Je conseille grandement les futurs utilisateurs ayant le même problème à se référer à l'excellent site web et tout dernier livre de Yoran.

Le problème est donc résolu.

"Je demeure cependant déçu de l'obligation de créé un module personnalisé pour effectuer des modifications qui (à mon avis) devraient être entièrement pris en charge par le template"

il reste la possibilité que j'ai indiqué pour éviter cet éceuil ;-)

Oui,en effet.

D'ailleur, j'essai actuellement de simplement modifier les titres des liens comment_delete comment_edit et comment_reply mais rien à faire, ils ne veulent pas changer. :(

Pourquoi la technique de Yoran ainsi que la tienne fonctionnent parfaitement pour les liens comment_add comment_comments et comment_new_comment mais pas pour comment_delete comment_edit et comment_reply ??

comment_add comment_comments et comment_new_comment sont reliés aux nodes alors que comment_delete comment_edit et comment_reply sont reliés aux commentaires mais je ne vois pas alors comment je pourrais bien faire pour les modifier... ?

Des suggestions?