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.
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.
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;
}
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.
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;
}
}
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:
[1] http://drupal.org/node/109153
[2] http://drupal.org/node/224170