Blog Tags
Blog Archiv
- Oktober, 2010 (1)
- April, 2010 (1)
- Dezember, 2009 (2)
News
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)
- Blog von quiptime
- Anmelden um Kommentare zu schreiben
- Druckversion