Modulentwicklung, Tabs unter dem Edit-Tab einer Node

Drupal 6

Wie bekommt man unter den Tab "Bearbeiten" einer Node weitere Tabs? Also Unter- oder Children-Tabs wenn man sie so nennen will.

Wer die Frage so stellt ist aber erst bei der Hälfte des Themas angelangt.
Denn wenn man Children-Tabs erfolgreich erzeugt muss man sich auch die Frage stellen wie man diese Tabs wieder wegbekommt.

Beispiel-Screenshot:

Es geht also um die kontrollierbare Anzeige der Children-Tabs. An dieser Stelle liegt der Hase im Pfeffer.

Beispiel

Der Pfad zum Bearbeiten einer Node ist: node/x/edit

Die aktuelle Node ID ist x.

Im hook_menu() des Modules werden zu diesem Pfad 2 Menüs als Tab erzeugt.

/**
 * Implementation of hook_menu().
 */
function gmap_node_menu() {
  $items = array();
  ...
  $items['node/%node_category/edit/map'] = array(
    'title' => 'Node',
    'access callback' => 'node_access',
    'access arguments' => array('update', 1),
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => 0,
    'tab_parent' => 'node/%/edit',
  );
  $items['node/%node_category/edit/map/edit'] = array(
    'title' => 'Map',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('gmap_node_map', 1),
    'access callback' => 'node_access',
    'access arguments' => array('update', 1),
    'type' => MENU_LOCAL_TASK,
    'weight' => 1,
    'load arguments' => array('%map'),
    'tab_parent' => 'node/%/edit',
  );
  return $items;
}

Hierbei erfolgt bereits die Vorbereitung für die Möglichkeit der Einflussnahme auf die beiden Menüinträge.

Dies sind zum Einen die Wildcard

%node_category

im Pfad der Menüs und zum Anderen ist es

'load arguments' => array('%map').

Damit ist man in der Lage in einer Funktion Bedingungen zu definieren um die Anzeige der beiden Menü-Tabs zu kontrollieren.

Wildcard loader: %wildcard_load()

Hier eine Beispiel-Funktion die mit dem Wildcard-Argument und dem map-Argument vom hook_menu() zusammenarbeitet.

/**
 * Wildcard loader function.
 *
 * @return
 *   TRUE or FALSE
 */
function node_category_load(&$map) {
  $node = node_load($map);
  $types = gmap_node_check_set_nodetypes();
 
  $valid = TRUE;
 
  return $valid ? $types['type'][$node->type] : FALSE;
}

  • Gibt die Wildcard loader Funktion TRUE zurück werden die Menü-Tabs angezeigt.
  • Gibt die Wildcard loader Funktion FALSE zurück werden die Menü-Tabs nicht angezeigt.

Das ist eine der möglichen Vorgehensweisen.

Problem an dieser Stelle ist unter Umständen, das in der Callback-Funktion die mit

'page arguments' => array('gmap_node_map', 1),

aufgerufen wird und in der das Formular aufgebaut wird NICHT das Nodeobjekt zur Verfügung steht. Um das Nodeobjekt in der Callback-Funtion zur Verfügung zu haben kann man etwas anders vorgehen.

%wildcard_to_arg()

Als Erstes wird auf

'load arguments' => array('%map'),

verzichtet und in diesem Zusammenhang als Zweites eine Wildcard loader Funktion verwendet die exakt der Funktion node_load() entspricht.
Man verwendet dabei den Funktionsnamen node_category_load(). In dieser Funktion wird der Code der Funktion node_load() verwendet.

Da diese Wildcard loader Funktion nun nicht mehr TRUE oder FALSE zurückgibt hat man an dieser Stelle auch keine Kontrolle mehr über die Children-Tabs.

Um nun diese Kontrolle zu erlangen wird eine weitere Funktion 

node_category_to_arg($arg)

verwendet. In dieser Funktion kann man auf irgendwelche Bedingungen prüfen. Werden die Bedingungen erfüllt dann wird der Funktions-Parameter $arg zurückgegeben. Wird die Bedingung nicht erfüllt dann wird FALSE zurückgegeben.

Beispiel einer solchen Funktion:

function node_category_to_arg($arg) {
  $node = node_load($arg);
  $types = gmap_node_check_set_nodetypes();
  if ($types['type'][$node->type] == 1) {
    return $arg;
  }
  else {
    return FALSE;
  }
}

  • Gibt die Wildcard _to_arg Funktion $arg zurück werden die Menü-Tabs angezeigt.
  • Gibt die Wildcard _to_arg Funktion FALSE zurück werden die Menü-Tabs nicht angezeigt. 

Damit hat man wieder die Kontrolle über die Children-Tabs.

Mit dieser Vorgehensweise macht auch die "1" in

'page arguments' => array('gmap_node_map', 1),

Sinn. Denn diese "1" repräsentiert in der Callback-Funktion

gmap_node_map($form_state, &$node)

als 2. Funktionsparameter das Nodobject.

Links

Dynamic argument replacement (wildcard)

Wildcard Loader Arguments

Powered by Drupal. Created with ZenWalk.