web-dev-qa-db-fra.com

Passer des arguments en utilisant hook_menu

Je construirais un écran de confirmation. J'ai donc initialisé le chemin dans le hook_menu comme il se doit mais pour une raison quelconque, l'argument $node n'est pas envoyé avec la fonction ... Qu'est-ce que je fais mal?

C'est mon hook_menu:

$items['node/%/revisions/%/offline'] = array(
      'title' => 'Offline,
      'description' => 'Confirm the action "Fiche offline".',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('_mymodule_confirm_offline'),
      'type' => MENU_LOCAL_TASK,
      'weight' => -4,
    ); 
    return $items;

Et voici ma fonction:

function _redactie_omgeving_confirm_offline($form, $form_state, $node) {
    $question = t('Take fiche offline. ');

    return confirm_form($form,
                    $question,
                    'node/7', t('You\'re about to depublish this fiche. <br />Are you sure you want to depublish this fiche?'),
                    t('Yes'), t('Cancel'));
}

Mais le $node- la variable de ma fonction reste vide ... Que dois-je faire pour remplir cette variable?

7
Michiel

Votre rappel de page est drupal_get_form, Et votre argument de page est _mymodule_confirm_offline, Donc l'appel Drupal fait est drupal_get_form('_mymodule_confirm_offline');, ce qui ne fait pas du tout semble être ce que vous voulez faire.

Vous avez plutôt besoin d'un rappel personnalisé.

Dans hook_menu:

'page callback' => '_confirmation_form_page',
'page arguments' => array(1, 3),

Et alors

function _confirmation_form_page($node) {
  $question = t('Take fiche offline. ');

  return confirm_form($form, $question, 'node/' . $node->nid, t('You\'re about to depublish this fiche. <br />Are you sure you want to depublish this fiche?'), t('Yes'), t('Cancel'));
}

Pour "charger automatiquement" un objet à partir de l'url, il doit être nommé , sinon Drupal can ne sais pas comment effectuer le chargement. Sur une URL comme "node /% nid", l'argument est nommé "nid". En réalité, l'argument serait généralement appelé% node, mais je voulais distinguer les parties. Drupal recherchera alors une fonction appelée load_nid, transmettra le numéro à partir de l'URL et cette fonction est chargée de renvoyer l'objet entièrement chargé. Core a une fonction "load_node", donc les arguments nommés% node seront être chargé automatiquement sans autre effort de votre part.

Pour ajouter le chargement automatique à votre rappel, vous devez

$items['node/%node/revisions/%/offline'] = array(

Cependant, cela ne vous donnera toujours que le bon nœud, pas la bonne révision. node_load () supporte un deuxième argument, $vid, que nous devons utiliser pour obtenir la bonne révision. Dire Drupal pour transmettre des arguments supplémentaires est utilisé avec la clé load arguments, Et nous devons utiliser le quatrième argument de l'url node/%node/revision/%/offline Pour cela.

Donc en conclusion, l'implémentation hook_menu devient:

$items['node/%node/revisions/%/offline'] = array(
  'title' => 'Offline',
  'description' => 'Confirm the action "Fiche offline".',
  'page callback' => '_confirmation_form_page',
  'page arguments' => array(1),
  'load arguments' => array(3),
);
return $items;
13
Letharion

hook_menu n'obtient pas $ node object comme paramètre. Node dans 'node /%/revisions /%/offline' est juste un chemin, ce n'est pas un nœud.

0
15dk51