[Résolu] Mettre en place un hook_link_alter

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.

Salut. ^^
Pour résoudre un problème sur un autre on m'a suggéré de mettre en place la fonction hook_link_alter, seulement je ne vois pas comment le mettre en place.
Je n'ai rien trouvé dans la doc et sur le forum, mis à part qu'il faut créer un module je crois...
Pourriez-vous me détailler la marche à suivre svp ? :p
Promis j'ajouterai la solution dans la doc. :p
Merci. ^^

Forum : 
Version de Drupal : 

Déjà il faut que tu crées un module (http://arnumeral.fr/node/14) dans lequel tu inséreras ton implémentation de hook_link_alter. Par exemple pour ajouter une classe à un lien spécifique (ici le lien d'ajout d'un commentaire) :

<?php
function mon_module_link_alter(&$links, $node) {
  foreach (
$links as $name => $link) {
    if (
$name=="comment_add") {
     
$links[$name]['attributes']['class'] .= " ma_classe";
    }
  }
}
?>

Si tu ne sais pas trop quel lien modifier ou la structure du lien, tu peux remplacer le corps de la fonction par un var_dump($links). Cela videra le contenu de $links à l'écran et tu pourrais ainsi expérimenter.

Génial merci !
Super tuto en passant. ;)

Alors je voulais remplacer le "User's blog" de ma page de blog par le nom de mon site.
Voici le script adapté :

<?php
  
function TitreBlog_link_alter(&$links, $node)
  {
      foreach (
$links as $name => $link)
      {
          if (
$name=="blog_usernames_blog")
            {
             
$links[$name]['title'] = "Le nom de mon site";
         }
      }
  }
?>

Comme indiqué dans le site (http://arnumeral.fr/node/14)

j ai créé un module contenu

Dans mon fichier module contenu j ai inséré le code (je suis sous drupal5)

<?php
function mon_module_link_alter(&$links, $node) {
  foreach (
$links as $name => $link) {
    if (
$name=="comment_add") {
     
$links[$name]['attributes']['class'] .= " ma_classe";
    }
  }
}
?>

mais rien ne se produit

Alors qu avec le code

<?php

function tutoriel_modules_link($type, $object, $teaser = FALSE) {
  // Seulement si l'utilisateur a les droits d'administration
  if (!user_access("administer site configuration")) {
    return;
  }

  $links = array ();

  // Si l'objet est un node
  if ($type == 'node') {
    // On ajoute un nouveau lien
    $links['editer-node'] = array (
      'title' => t('Edit'),
      'href' => "node/".$object->nid."/edit",

    );
  }

  // On renvoie les liens au module "node"
  return $links;
}

j ai bien l ajout du lien

j ai pas compris le truc

Link_alter et Link sont deux choses. Dans le premier cas tu modifies un lien créé par un autre module, dans le second tu ajoutes un nouveaux liens à ceux générés par les autres modules.

Ensuite il y a une erreur dans ton premier exemple avec link_alter, il y a eu entre la version 5 et la version 6 de Drupal, une inversion de paramètres (http://api.drupal.org/api/function/hook_link_alter). Là tu utilises la syntaxe de la version 6, cela explique sans doute que cela ne fonctionne pas.

ET oui cela marche j'arrive maintenant a modifier le lien

Il m'a suffit comme tu me l'a fait remarqué de placer le code comme suivant pour Drupal5

<?php

function offre_link_alter(&$node, &$links,$html = TRUE) {
var_dump($links);
  foreach (
$links as $name => $link) {
var_dump($links);
    if (
$name=="comment_add") {
     
$links[$name]['title']= "<img src=toto.gif >";
    }
  }
}
?>

par contre le html du remplacment n'est pas pris en compte.

Avez vous une ruse de sioux pour que le html soit pris en compte?

MErci beaucoup

Bon j ai un nouveau probleme surement simple mais c est la premiere fois que je le rencontre.

j'ai créé mon alter link qui fonctionne tres bien

var_dump($links);
    if ($name=="comment_add" ) {
    $title = t('Postuler à cette annonce');    // change the title to suit
    $path = path_to_theme() . '/2009/fr/bt_postulerannonce.gif';  // make an image path
// now update the links array
      // set the title to some html of the image and choice of link text
      $links[$name]['title'] = theme('image', $path, $title, $title) . ''.$base_path.'';
      $links[$name]['href'] = $links[$name]['href'].'#post';
 

  
     // let's set some attributes on the link
      $links[$name]['attributes'] = array(
        'title' => $title,
        //'class' => 'forward-page',
        //'rel' => 'nofollow',
      'name'=>'post',
    
       );

      // this must be set, so that l() interprets the image tag correctly
      $links[$name]['html'] = TRUE;

je change le texte par une image et je souhaite modifier le lien en ajoutant une ancre.

j'ajoute donc mon code
$links[$name]['href'] = $links[$name]['href'].'#post';

malheureusement lorsque je génére la page le # est remplacé par %23.

je suis bien encodé en utf8 et je suis sous drupal5

si vous avez déjà rencontré ce probleme je prend.

MErci

C'est tout à fait normal, il essaye de renseigner (de tête j'ai pas mon code sous la main) le champ fragment

<?php
 $links
[$name]['fragment']='#post'
?>

Je ne suis pas certain qu'il soit nécessaire de spécifier le #

Je suis en train de migrer sous D6

il y a une différence entre D5 et D6

la synthax n'a pas besoin d'etre
$links[$name]['title'] = theme('image', $path, $title, $title) . ..';
mais $links[$name]['title'] = '<img...>';