Titre dynamique dans une vue avec argument(s)

  • warning: array_map(): Argument #2 should be an array in /var/www/titouille.ch/www/modules/system/system.module on line 1050.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
  • warning: Invalid argument supplied for foreach() in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
Portrait de titouille

ça, c'est pour pas l'oublier Tongue

Dans le module Views de Drupal, on peut généralement utiliser un caractère du type '%1' pour dire qu'on fait référence au premier argument passé à la vue.
Lorsque le premier argument est l'UID utilisateur, c'est cool, ça permet de récupérer le nom d'utilisateur. Dans le titre de notre display (page, bloc, ...) on peut donc spécifier par exemple '%1's page', ce qui affichera une info du type "titouille's page".

Maintenant, le problème, c'est quand on veut avoir autre chose que le nom d'utilisateur... Sur le site sur lequel je travaille, nous utilisons le module "Real name" qui permet d'afficher dans bien des situations un nom complet plutôt que le nom d'utilisateur. Il faut bien entendu configurer "Real name" pour lui indiquer quel est le ou quels sont les champs à utiliser pour créer le nom complet.
Bref, c'est très bien, mais dès fois, c'est pas assez. Exemple avec les vues, si j'utilise %1, il ne changera pas la valeur username par realname, retour au point de départ.

J'avais trouvé il y a quelques jours comment faire ça, mais j'ai eu besoin de le refaire et j'ai du retrouver la bonne vue. C'est pour ça que cette fois, je le note, comme ça je saurais où retrouver l'information Tongue

Le truc est très simple. Puisque notre vue utilise un argument, on va rajouter une petite étape pour arriver à nos fins. Tout d'abord, dans mon cas, la vue utilise un argument "uid". L'identifiant utilisateur est récupéré via l'url (j'ai coché la case "User ID from URL"). L'étape supplémentaire, c'est de sélectionner la validation et de choisir "PHP Code". Il est facile de récupérer la valeur de l'argument :

$argument

Ou encore de reprendre l'argument de l'url :

$uid = arg(1);

pour peu que l'identifiant utilisateur soit l'argument numéro 1 dans l'url, la liste des arguments de l'url commençant à l'index 0, comme d'habitude en informatique. Exemple : user/1234/view : le uid est à l'index 1 (1234).

Donc en ayant l'argument, on va pouvoir récupérer les informations qu'on désire en rapport avec l'utilisateur... Exemple, son "realname" en faisant une petite requête dans la base de données, ou en utilisant les fonctions natives du module realname, si il existe une fonction pour ça bien entendu.

Une fois qu'on a récupéré le nécessaire, il ne reste plus qu'à utiliser la notation suivante, toujours dans le code PHP de la validation de l'argument :

$view->display[$view->current_display]->handler->handlers['argument']['uid']->options['title'] = t( "@realname's page", array( "@realname" => $realname->name ) );

Comme vous pouvez le voir dans la partie "->handlers['argument']['uid']", je fais pointer sur l'argument "uid", qui est l'argument sur lequel je travaille. Si ça avait été le nid, alors j'aurai eu "->handlers['argument']['nid']", bien entendu.

Voilà l'exemple complet :

// get realname with realname module native function
$realname = realname_get_user( $argument );
 
// set full title with retrieved informations
$view->display[$view->current_display]->handler->handlers['argument']['uid']->options['title'] = t( "@realname's page", array( "@realname" => $realname->name ) );
 
// finally don't forget to return TRUE, 
// this is needed by the validation to get the view working correctly
return TRUE;

Vu que c'est un système de validation, il est bien entendu possible de tester si la valeur récupérée dans l'url correspond bien à un identifiant utilisateur existant et autorisé. A vous de voir comment vous désirez finaliser le code.

Et voilà. Avec un peu d'astuce, on peut modifier facilement les titres dans les vues Big smile