Übergeben Sie Argumente mit hook_menu

7

Ich würde einen Bestätigungsbildschirm erstellen. Also habe ich den Pfad so initialisiert, hook_menuwie er sein sollte, aber aus irgendeinem Grund wird das Argument $nodenicht mit der Funktion gesendet ... Was mache ich falsch?

Das ist mein 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;

Und das ist meine Funktion:

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'));
}

Die $nodeVariable in meiner Funktion bleibt jedoch leer ... Was muss ich tun, um diese Variable auszufüllen?

Michiel
quelle

Antworten:

13

Ihr Seitenrückruf ist drupal_get_formund Ihr Seitenargument ist _mymodule_confirm_offline, also ist der Aufruf von Drupal drupal_get_form('_mymodule_confirm_offline');, der überhaupt nicht das zu sein scheint, was Sie tun möchten.

Was Sie brauchen, ist stattdessen ein benutzerdefinierter Rückruf.

Im hook_menu:

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

Und dann

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'));
}

Um ein Objekt automatisch aus der URL zu laden, muss es benannt werden , andernfalls kann Drupal das Laden nicht ausführen. In einer URL wie "node /% nid" heißt das Argument "nid". In der Realität würde das Argument normalerweise% node heißen, aber ich wollte die Teile unterscheiden. Drupal sucht dann nach einer Funktion namens load_nid, übergibt die Nummer von der URL in und diese Funktion ist für die Rückgabe des vollständig geladenen Objekts verantwortlich. Core verfügt über eine Funktion "load_node", sodass Argumente mit dem Namen% node ohne weiteren Aufwand von Ihrer Seite automatisch geladen werden.

Um Ihrem Rückruf dann das automatische Laden hinzuzufügen, benötigen Sie

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

Dies gibt Ihnen jedoch immer noch nur den richtigen Knoten, nicht die richtige Revision. node_load () unterstützt ein zweites Argument, $viddas wir verwenden müssen, um die richtige Revision zu erhalten. Mit dem load argumentsSchlüssel wird Drupal angewiesen, zusätzliche Argumente weiterzugeben node/%node/revision/%/offline. Dazu müssen wir das vierte Argument aus der URL verwenden .

Zusammenfassend lautet die Implementierung von hook_menu also:

$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;
Letharion
quelle
1
OK danke! Und worum geht es bei 1 und 3? Kann ich so viele Elemente hinzufügen, wie ich möchte?
Michiel
2
Die 1 und 3 entsprechen den Argumenten in 'node /% / revisions /% / offline', wobei 'node' 0 ist. Dadurch wird der Inhalt der beiden% an Ihren Rückruf übergeben.
Letharion
Ok, großartig! Ich lerne :) Wie bekomme ich eine Variable einer vorherigen Seite in den Argumenten (sagen wir mal $node)
Michiel
1
Zweites Update, Autoloading-Informationen hinzugefügt.
Letharion
1
Wow, über ein Jahr später bin ich versehentlich zurückgekommen. Ich habe den Code jetzt aktualisiert.
Letharion
0

hook_menu erhält kein $ node-Objekt als Parameter. Der Knoten in 'Knoten /% / Revisionen /% / Offline' ist nur ein Pfad, es ist kein Knoten.

15dk51
quelle