web-dev-qa-db-ja.com

テーマ関数を直接呼び出すのではなく、なぜtheme()を使用する必要があるのですか?

テーマ関数を直接呼び出すのではなく、theme()を使用する必要があるのはなぜですか?

theme('box', $title, drupal_get_form('comment_form', $edit, $title));

次のコードのように、コードがテーマ関数を直接呼び出さないのはなぜですか?

theme_box($title, drupal_get_form('comment_form', $edit, $title));
4
enjoylife

オーバーライドシステムを機能させるには、theme()関数を使用する必要があります。たとえば、テーマがモジュールのテーマ関数をオーバーライドしたり、テンプレート(.tpl.php)ファイルが代わりに使用されたりする場合があります。

13
davidhernandez

作成した例では、theme_box()を呼び出すと、特定の関数が呼び出されます。 theme('box')を呼び出すとき、関数は通常theme_box()である関数を呼び出していますが、モジュールが次のコードを使用して hook_theme_registry_alter() を実装する場合、関数は呼び出されるのはtheme_mymodule_box()です。

function mymodule_theme_registry_alter(&$theme_registry) {
  // Kill the next/previous forum topic navigation links.
  if (!empty($theme_registry['box'])) {
      $theme_registry['box']['function'] = 'theme_mymodule_box';
    }
  }
}

Drupal 7では、テンプレートファイルを使用するテーマ関数だけでなく、すべてのテーマ関数に前処理関数があります。これは、ほとんどの場合、テーマ関数をオーバーライドする必要がないことを意味します。コードがテーマ関数に渡された変数の内容を変更する必要があるだけの場合、前処理関数を使用することは、Drupal 7。

1
kiamlaluno