Drupal 7: hook_menu mit Wildcards

In Zeile 6, registriere ich hier einen Menü-Pfad mit einer sog. Wildcard, also einem Platzhalter.

Das bedeutet in diesem Fall, dass während der Pfad-Anteil example/ fix ist, dass der zweite Pfad-Anteil %node_type_nid, wie hoffentlich schon durch seine Benennung deutlich wird, Node-ID's (nids) von Node-Typ example enthalten soll.

  1. /**
  2.  * Implements hook_menu().
  3.  */
  4. function example_menu() {
  5.   $items = array();
  6.   $items['example/%node_type_example_nid'] = array(
  7.     'title' => 'Example page title',
  8.     'description' => 'Example page description',
  9.     'page callback' => 'drupal_get_form',
  10.     'page arguments' => array('example_form', 1),
  11.     'access callback' => TRUE,
  12.   );
  13.   return $items;
  14. }
  • 404 bei Aufruf von example/123?
  • Wie bekomme ich es hin, dass der Pfad nur in Verbindung von Node-ID's vom Typ example valide ist?
  • ...vielleicht noch zusätzliche Validierungen?

Auto-Loader Wildcards

Registered paths may also contain special "auto-loader" wildcard components in the form of '%mymodule_abc', where the '%' part means that this path component is a wildcard, and the 'mymodule_abc' part defines the prefix for a load function, which here would be named mymodule_abc_load().1

Hier die special auto-loader Funktion, benannt nach dem Namen der Wildcard als Prefix, node_type_example_nid + _load.

function node_type_example_nid_load($nid) {
  $node = node_load($nid);
  if ($node) {
    if ($node->type == 'example_node_type') {
      global $user;
      // Only node author/owner might access.
      if ($user->uid == $node->uid) {
        return $nid;
      }
      else {
        return FALSE;
      }
    }
    else {
      return FALSE;
    }
  }
  else {
    return FALSE;
  }
}