Voilà, voilà... Fin de l'aventure...

 

Fermeture de kolossaldrupal.org dans...


Bonjour tout le monde,

Drupal évolue, les versions changent et Kolossaldrupal.org était essentiellement consacré à la version 6 de Drupal.

Autant dire que les infos présentées ici commencent à dater...

Faute de temps, je ne peux plus garder le site Kolossaldrupal à jour...

Je vous aurais bien proposé de reprendre le flambeau mais... c'est tellement simple de nos jours de se faire son propre site à soi...Pourquoi s'embêter alors ? :-)

Ce site restera donc en l'état, tel qu'il était en 2011...

Ah la la ! Cela ne nous rajeunit pas !

Manuel Vila - Avril 2016

Utilisation des wildcards et wildcards du core

Référence en anglais sur drupal.org : 25 Mai 2008 - 03h48
http://drupal.org/node/209056


Utilisation des caractères jokers/génériques (wildcards)

(Cette article est un bref résumé de Remplacement dynamique d'arguments ).

Avec Drupal 5, si vous voulez définir un chemin de menu dynamique (comme node/1, node/342, node/563, tous manipulés par la fonction node_page_view), vous devez vérifier le flag $may_cache dans votre implémentation du hook_menu et vérifier chaque partie du path en utilisant arg, comme dans cet exemple du module node de Drupal 5 :

<?php
    
if (arg(0) == 'node' && is_numeric(arg(1))) {
      
$node node_load(arg(1));
      if (
$node->nid) {
        
$items[] = array('path' => 'node/'arg(1), 'title' => t('View'),
          
'callback' => 'node_page_view',
          
'callback arguments' => array($node),
          
'access' => node_access('view'$node),
          
'type' => MENU_CALLBACK); 
?>

Drupal 6 utilise un système beaucoup plus élégant, ce qui suit est le code équivalent du module node de Drupal 6 :

<?php
  $items
['node/%node'] = array(
    
'title' => 'View',
    
'page callback' => 'node_page_view',
    
'page arguments' => array(1),
    
'access callback' => 'node_access',
    
'access arguments' => array('view'1),
    
'type' => MENU_CALLBACK);
?>

Au lieu de contrôler que arg(0) soi node et que arg(1) soit un ID de node correct, le "joker" %node est indiqué dans le chemin de menu (% est le caractère générique, ce qui suit sert simplement à nommer la fonction load).

C'est le système de menu lui-même qui appellera node_load et vérifiera que l'ID du node est valide, et ainsi, au lieu de spécifier $node dans les arguments callbacks, c'est 1 qui est utilisé puisque %node est la première partie du chemin (en débutant le compte à zéro, avec / comme séparateur).

Pour utiliser des caractères génériques dans votre hook_menu, utilisez %loader_name comme une des parties du path et placez le nombre correspondant à la position du caractère générique dans les tableaux adéquats des arguments callback. Cela fera passer le résultat de loader_name au callback.

Les modules du core de Drupal 6 fournissent quelques caractères loaders génériques que vous pouvez utiliser dans votre hook menu, ou vous pouvez déclarer les vôtres.

Déclarer vos propres caractères loaders génériques

Comme pour tout autre caractère loader générique, placez votre %your_loader_name dans le path du menu (on se répète : % est le caractère générique, le reste est le nom de votre fonction de chargement) puis implémentez une fonction appelée your_loader_name_load. Si vous utilisez %flexifilter dans votre path de menu, vous implémenterez ce qui suit :

<?php
/**
* Menu callback; loads a flexifilter object
*/
function flexifilter_load($fid) {
  if (!
is_numeric($fid)) {
    return 
FALSE;
  }
  
$filters flexifilter_get_filters();
  if (!isset(
$filters[$fid])) {
    return 
FALSE;
  }
  return 
$filters[$fid];
}
?>

La fonction load prend un seul argument, qui est la partie de l'URL correspondant au caractère générique (si l'URL est admin/flexifilter/34/edit, alors l'argument sera 34). Souvenez-vous que cet argument provient de l'URL qui, elle, est fournie par l'utilisateur. Utilisez-la avec beaucoup de précautions. Ne supposez pas qu'il s'agisse d'un entier positif, ne supposez pas qu'il corresponde à un ID d'un node/user/entité existant, ne l'insérez pas aveuglément dans une requête SQL et ne l'affichez pas dans une page sans avoir appelé check_plain. Sachez quel est le type de saisie requis, validez-le, echappez-le dans toute requête SQL et prenez toutes les précautions d'usage qui doivent être prises avec les données venant de l'utilisateur.

L'exemple précédent contient une simple (mais suffisante) erreur de validation. D'abord, si l'argument n'est pas un nombre, et n'a par conséquent aucune chance d'être un ID, la fonction retourne false (ce qui aboutit à une page page non trouvée). Puis on récupère une liste d'entités valides, et si l'ID n'en fait pas partie on retourne false. Mais si l'ID en fait partie, on retourne l'entité correspondante. Cette valeur retour est transmise à toute fonction callback référencée par le caractère générique dans le tableau d'arguments.

(De crainte d'un contresens technique sur cette dernière phrase, je vous mets également la phrase originale en anglais : This return value is passed on to whatever callback functions referenced the wildcard in their arguments array..)

Le code du hook_menu pour utiliser le caractère loader générique ressemblera à ceci :

<?php
  $items
['admin/build/flexifilters/%flexifilter/edit'] = array(
    
'title' => 'Edit Flexifilter',
    
'type' => MENU_CALLBACK,
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('flexifilter_filter_edit_form'3),
    
'file' => 'flexifilter.admin.inc',
  ); 
?>

La fonction flexifilter_filter_edit_form indiquée devra alors avoir le prototype suivant :

<?php
function flexifilter_filter_edit_form($form_state$flexifilter) { 
?>

Le premier argument vient du système form et le second est le résultat de la fonction flexifilter_load.

Vous pouvez spécifier des arguments supplémentaires pour la fonction load avec l'entrée load arguments d'un élément de menu. Voir %user_category dans Remplacement dynamique d'arguments (wildcards) pour un exemple d'utilisation. En outre, la fonction loader_name_to_arg peut être implémentée pour provoquer la création d'un lien dans le menu lorsque le loader est spécifié dans un path de menu. Voir %user_id_optionnal dans la documentation _to_arg .

Loaders wildcards fournis par le core Drupal 6

%actions

Fonction load : actions_load

Utilisé par : module System du core D6.

Exemple d'utilisation : (de system.module) :

<?php
  $items
['admin/settings/actions/delete/%actions'] = array(
    
'title' => 'Delete action',
    
'description' => 'Delete an action.',
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('system_actions_delete_form'4),
    
'type' => MENU_CALLBACK,
  );
?>

Notez que %actions est la quatrième partie du path (en débutant le décompte à zéro, avec / comme séparateur), d'où le 4 dans le tableau page arguments.

%aggregator_category

Fonction load : %aggregator_category_load

Utilisé par : module Aggregator du core D6

Exemple d'utilisation : (de aggregator.module) :

<?php
  $items
['aggregator/categories/%aggregator_category'] = array(
    
'title callback' => '_aggregator_category_title',
    
'title arguments' => array(2),
    
'page callback' => 'aggregator_page_category',
    
'page arguments' => array(2),
    
'access callback' => 'user_access',
    
'access arguments' => array('access news feeds'),
    
'file' => 'aggregator.pages.inc',
  );
?>

Ici, le caractère générique est référencé dans title arguments comme dans page arguments. Il aurait aussi pu aller dans access arguments.

%%aggregator_feed

Fonction load : aggregator_feed_load

Utilisé par : module Aggregator du core D6

Exemple d'utilisation : (de aggregator.module) :

<?php
  $items
['admin/content/aggregator/remove/%aggregator_feed'] = array(
    
'title' => 'Remove items',
    
'page callback' => 'aggregator_admin_remove_feed',
    
'page arguments' => array(4),
    
'access arguments' => array('administer news feeds'),
    
'type' => MENU_CALLBACK,
    
'file' => 'aggregator.admin.inc',
  );
?>

%contact

Fonction load : contact_load

Utilisé par : module Contact du core D6

Exemple d'utilisation : (de contact.module) :

<?php
  $items
['admin/build/contact/edit/%contact'] = array(
    
'title' => 'Edit contact category',
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('contact_admin_edit'34),
    
'type' => MENU_CALLBACK,
    
'file' => 'contact.admin.inc',
  );
?>

Bien que la troisième partie du path ne soit pas un caractère générique, il peut quand même être inséré dans le tableau arguments, et ce sera la chaîne edit qui sera passée comme paramètre à la fonction callback.

%filter_format

Fonction load : filter_format_load

Utilisé par : module Filter du core D6

Exemple d'utilisation : (de filter.module):

<?php
  $items
['admin/settings/filters/%filter_format'] = array(
    
'type' => MENU_CALLBACK,
    
'page callback' => 'filter_admin_format_page',
    
'page arguments' => array(3),
    
'access arguments' => array('administer filters'),
    
'file' => 'filter.admin.inc',
  );
?>

%forum_term

Fonction load : forum_term_load

Utilisé par : module Forum du core D6

Exemple d'utilisation : (de forum.module) :

<?php
  $items
['admin/content/forum/edit/%forum_term'] = array(
    
'page callback' => 'forum_form_main',
    
'type' => MENU_CALLBACK,
    
'file' => 'forum.admin.inc',
  );
?>

%menu

Fonction load : menu_load

Utilisé par : module Menu du core D6

Exemple d'utilisation : (de menu.module) :

<?php
  $items
['admin/build/menu-customize/%menu'] = array(
    
'title' => 'Customize menu',
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('menu_overview_form'3),
    
'title callback' => 'menu_overview_title',
    
'title arguments' => array(3),
    
'access arguments' => array('administer menu'),
    
'type' => MENU_CALLBACK,
    
'file' => 'menu.admin.inc',
  );
?>

%menu_link

Fonction load : menu_link_load

Utilisé par : module Menu du core D6

Exemple d'utilisation : (de menu.module) :

<?php
  $items
['admin/build/menu/item/%menu_link/edit'] = array(
    
'title' => 'Edit menu item',
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('menu_edit_item''edit'4NULL),
    
'type' => MENU_CALLBACK,
    
'file' => 'menu.admin.inc',
  );
?>

Pour page arguments, 5 aurait pu être utilisé au lieu de edit.

%node

Fonction load : node_load

Utilisé par : modules Poll, Comment, Translation, Statistics, Node et Book du core D6

Exemple d'utilisation : (de poll.module) :

<?php
  $items
['node/%node/votes'] = array(
    
'title' => 'Votes',
    
'page callback' => 'poll_votes',
    
'page arguments' => array(1),
    
'access callback' => '_poll_menu_access',
    
'access arguments' => array(1'inspect all votes'FALSE),
    
'weight' => 3,
    
'type' => MENU_LOCAL_TASK,
    
'file' => 'poll.pages.inc',
  );
?>

%taxonomy_vocabulary

Fonction load : taxonomy_vocabulary_load

Utilisé par : module Taxonomy du core D6

Exemple d'utilisation : (de taxonomy.module) :

<?php
  $items
['admin/content/taxonomy/edit/vocabulary/%taxonomy_vocabulary'] = array(
    
'title' => 'Edit vocabulary',
    
'page callback' => 'taxonomy_admin_vocabulary_edit',
    
'page arguments' => array(5),
    
'type' => MENU_CALLBACK,
    
'file' => 'taxonomy.admin.inc',
  );
?>

%user

Fonction load : user_load

Utilisé par : modules Contact, Blog, User, Statistics, OpenID et Tracker du core D6

Exemple d'utilisation : (de contact.module) :

<?php
  $items
['user/%user/contact'] = array(
    
'title' => 'Contact',
    
'page callback' => 'contact_user_page',
    
'page arguments' => array(1),
    
'type' => MENU_LOCAL_TASK,
    
'access callback' => '_contact_user_tab_access',
    
'access arguments' => array(1),
    
'weight' => 2,
    
'file' => 'contact.pages.inc',
  );
?>

%user_category

Fonction load : user_category_load

Utilisé par : module Users du core D6

Exemple d'utilisation : (de user.module) :

<?php
  $items
['user/%user_category/edit'] = array(
    
'title' => 'Edit',
    
'page callback' => 'user_edit',
    
'page arguments' => array(1),
    
'access callback' => 'user_edit_access',
    
'access arguments' => array(1),
    
'type' => MENU_LOCAL_TASK,
    
'load arguments' => array('%map''%index'),
    
'file' => 'user.pages.inc',
  )
?>

Notez l'utilisation de load arguments, qui doivent être présents (comme montré ci-dessus) afin d'utiliser %user_category. Voir Remplacement dynamique d'arguments pour plus d'informations.

%user_uid_optional (était %user_current dans 6.0 et 6.1)

Fonction load : user_uid_optional_load

Utilisé par : modules User et Blog du core D6

Exemple d'utilisation : (de tracker.module) :

<?php
  $items
['tracker/%user_uid_optional'] = array(
    
'title' => 'My recent posts',
    
'access callback' => '_tracker_myrecent_access',
    
'access arguments' => array(1),
    
'page arguments' => array(1),
    
'type' => MENU_LOCAL_TASK,
  );
?>

%user_uid_optional se comporte exactement comme %user (user_uid_optional_load appelle directement user_load), cependant, user_uid_optional_load crée en plus un lien de menu. Il y a donc un lien « Mes articles récents » dans le menu Drupal 6 qui vous amène à tracker/(votre ID utilisateur), mais vous pouvez également vous rendre sur tracker/(ID d'un utilisateur) pour voir les publications récentes d'autres personnes. Voir _to_arg pour d'autres informations à ce sujet.