web-dev-qa-db-ja.com

hook_theme_registry_alter()およびtheme()

hook_theme_registry_alter()をどのようにして、たとえばtheme_mymodule_image_output()を「イメージ」テーマIDに関連付けることができますか?

3
enjoylife

ドキュメントで報告されているように、 hook_theme_registry_alter() はDrupalから呼び出され、サードパーティのモジュールが hook_theme()から返されるテーマレジストリ情報を変更できるようにします)

hook_theme()の実装から返される値は、モジュール(またはテーマ)によって実装されるさまざまなテーマ関数に関する情報を含む配列です。

_function node_theme() {
  return array(
    'node' => array(
      'arguments' => array('node' => NULL, 'teaser' => FALSE, 'page' => FALSE), 
      'template' => 'node',
    ), 
    'node_list' => array(
      'arguments' => array('items' => NULL, 'title' => NULL),
    ), 
    'node_search_admin' => array(
      'arguments' => array('form' => NULL),
    ), 
    'node_filter_form' => array(
      'arguments' => array('form' => NULL), 
      'file' => 'node.admin.inc',
    ), 
    'node_filters' => array(
      'arguments' => array('form' => NULL), 
      'file' => 'node.admin.inc',
    ), 
    'node_admin_nodes' => array(
      'arguments' => array('form' => NULL), 
      'file' => 'node.admin.inc',
    ), 
    'node_add_list' => array(
      'arguments' => array('content' => NULL), 
      'file' => 'node.pages.inc',
    ), 
    'node_form' => array(
      'arguments' => array('form' => NULL), 
      'file' => 'node.pages.inc',
    ), 
    'node_preview' => array(
      'arguments' => array('node' => NULL), 
      'file' => 'node.pages.inc',
    ), 
    'node_log_message' => array(
      'arguments' => array('log' => NULL),
    ), 
    'node_submitted' => array(
      'arguments' => array('node' => NULL),
    ),
  );
}
_

返された配列は、以前のコメントで私がテーマIDと呼んだものを使用しており、theme()に渡される値と同じです。
node_theme() はそれを使用しませんが、hook_theme()のドキュメントは、配列がfunctionインデックスを使用してどの関数を報告できるかを報告していますテーマ関数として呼び出す必要があります。

hook_theme_registry_alter()を実装するモジュールは、次のコードを使用して、theme('image')が呼び出されたときに呼び出される関数を変更する必要があります。

_function mymodule_theme_registry_alter(&$theme_registry) {
  if (isset($theme_registry['image'])) {
    $theme_registry['image']['function'] = 'theme_mymodule_image_output';
  }
}
_

モジュールがそのコードを使用してテーマレジストリを変更すると、theme('image', ...)への呼び出しは theme_image() を呼び出さなくなりますが、そのモジュールから定義された関数を呼び出します。
関数にtheme_mymodule_image_output()という名前を付ける必要がないことに注意してください。関数の名前がmymodule_image_output()に変更され、それに応じてmymodule_theme_registry_alter()のコードが変更されても、コードは同じように機能します。私は通常、プレフィックス_theme__を使用して、関数がテーマ関数であることを明確にします。

5
kiamlaluno