Wenn Sie einen anderen Menü-Rückruf verwenden möchten, können Sie hook_menu_alter () implementieren , um den Menü-Rückruf zu ändern. Angenommen, Sie möchten den Menü-Rückruf überschreiben, den Drupal für die Suche definiert , und Sie könnten den folgenden Code verwenden.
function mymodule_menu_alter(&$items) {
if (isset($items['search'])) {
$items['search']['page callback'] = 'mymodule_search_view';
}
}
Von können mymodule_search_view()
Sie search_view () aufrufen, ohne zuerst die Datei einzuschließen, die es enthält, wie dies von Drupal aus erfolgt, bevor Sie den Menü-Rückruf aufrufen.
Ein ähnlicher Code könnte ausgeführt werden, wenn der Menü-Rückruf ein Formular zurückgibt , mit der Ausnahme, dass Sie anstelle des Seitenrückrufs ( wahrscheinlich drupal_get_form () ) die Seitenargumente ändern würden, um als erstes Argument den Rückrufnamen des zu verwenden Funktion, die das Formulararray zurückgibt. Anstatt dies zu tun, sollten Sie hook_form_alter () implementieren und die nicht erforderlichen Formularelemente mit $form['element']['#access'] = FALSE', and not with
unset ($ form ['element']) ` ausblenden .
Zum Ersetzen einer Funktion, die von einem Hook aufgerufen wird, können Sie die Hook-Implementierung entfernen, die diese Funktion aufruft, und sie durch eine andere Implementierung ersetzen. Dies ist nur mit Drupal 7 möglich und muss sorgfältig durchgeführt werden. (Ich werde erklären, warum richtig.)
Angenommen, Sie möchten die in menu_node_update () (die Implementierung von hook_node_update () ) aufgerufene Funktion von menu_node_save () in ändernmymodule_node_save()
. Sie können den folgenden Code verwenden.
function mymodule_module_implements_alter(&$implementations, $hook) {
if ($hook == 'node_update') {
$group = $implementations['mymodule'];
unset($implementations['mymodule']);
unset($implementations['menu']);
$implementations = array('mymodule' => group) + $implementations;
}
}
function mymodule_node_update($node) {
mymodule_node_save();
}
Auf diese Weise menu_node_update()
würde nicht mehr aufgerufen, sondern mymodule_node_update()
würde.
Normalerweise prüfen Module, die von einem von einem anderen Modul implementierten Hook abhängen, nicht, ob dieser Hook ausgeführt wird. Sie überprüfen, ob das Modul aktiviert ist (und nehmen an, dass der Hook aufgerufen wird), oder sie fügen dieses Modul als ihre Abhängigkeit hinzu. Das Vermeiden eines Hooks kann zu Problemen mit anderen Modulen führen, die möglicherweise schwer zu verfolgen sind. Wenn es wirklich notwendig ist, zu vermeiden, dass ein von einem anderen Modul implementierter Hook ausgeführt wird, sollten Sie zuerst auf einer Test-Site überprüfen, ob alles wie erwartet funktioniert. Denken Sie daran, dass die zukünftige Drupal-Version Ihren Code beschädigen kann und der Code, den Sie schreiben, auch auf der zukünftigen Drupal-Version getestet werden sollte (sofern verfügbar).