web-dev-qa-db-fra.com

Passer des paramètres d'URL aux rappels de menu

J'ai implémenté hook_menu() pour créer un nouveau chemin appelé 'user-login'. La fonction de rappel de page reçoit des paramètres d'URL comme $_GET['parameter']; cependant, quand je vais à http://site.com/user-login?parameter=test , j'obtiens une erreur 404. Comment dois-je implémenter hook_menu() pour que cela fonctionne?

C'est le code que j'utilise

/**
 * Implementation of hook_menu()
 */
function login_menu() {
  //$items = array();

  $items['user-login'] = array(
    'title' => 'External login',
    'page callback' => 'user_login_callback',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function user_login_callback() {

  // Get the URL params
  $uid = urldecode($_GET['uid']);
  $expiry = urldecode($_GET['expiry']);
  $provided_hash = urldecode($_GET['hash']);  

}

La page serait appelée comme http://site.com/user-login?uid=2?expiry=3?hash=sd7wdah

7
Matthew Hui

Le système de menu drupal ne se soucie pas des arguments $ _GET, vous pouvez faire ce que vous voulez avec eux, cela n'affecte pas l'implémentation hook_menu () **.

Donc, l'erreur se situe ailleurs. Le résultat de hook_menu () est stocké, il n'est pas appelé sur chaque page. Si vous modifiez/ajoutez quelque chose dans cette fonction, vous devez reconstruire les menus. La façon la plus rapide de le faire est d'utiliser la commande drush "drush cc all" ou "rebuild menus" dans le bloc de liens de développement de devel.module. Vous pouvez également soumettre la page des modules.

** Cela dit, il est beaucoup plus courant de passer des arguments through le système de menus comme arguments de chemin supplémentaires. Tout ce qui est passé après le chemin sera automatiquement transmis en tant qu'arguments à votre rappel de page. Donc, appeler user-login/2/3/sd7wdah passera ces trois arguments à votre fonction en tant que user_login_callback (2, 3, 'sd7wdah'). Vous pouvez également rendre ces arguments obligatoires en spécifiant le chemin d'accès comme ceci dans hook_menu (): user-login/%/%/% Et en définissant les arguments de chemin d'accès comme ceci: 'path arguments' => array(1, 2, 3),. Cela garantira que votre fonction ne peut être appelée qu'avec ces trois arguments et qu'ils ne sont pas facultatifs.

4
Berdir

Pour plus de clarté,

http://site.com/user-login?uid=2?expiry=3?hash=sd7wdah

ne fonctionnera pas, il devrait être:

http://site.com/user-login?uid=2&expiry=3&hash=sd7wdah

Notez qu'il n'y a qu'un seul "?" et chaque paramètre supplémentaire est séparé par "&"

1
DeeZone