web-dev-qa-db-ja.com

hook_process()およびhook_process_HOOK()を使用する必要があるのはどの場合ですか?

一部のモジュールが hook_process() を実装して一部の変数のコンテンツを変更し、それらのコンテンツをテーマ別コンテンツで置き換えることを考慮します。この場合、モジュールは の代わりにhook_process()を実装する必要がありますhook_preprocess() (または hook_preprocess_HOOK() )?

function rdf_process(&$variables, $hook) {
  // Handles attributes needed for content not covered by title, content,
  // and field items. It does this by adjusting the variable sent to the
  // template so that the template doesn't have to worry about it. See
  // theme_rdf_template_variable_wrapper().
  if (!empty($variables['rdf_template_variable_attributes_array'])) {
    foreach ($variables['rdf_template_variable_attributes_array'] as $variable_name => $attributes) {
      $context = array(
        'hook' => $hook, 
        'variable_name' => $variable_name, 
        'variables' => $variables,
      );
      $variables[$variable_name] = theme('rdf_template_variable_wrapper', array('content' => $variables[$variable_name], 'attributes' => $attributes, 'context' => $context));
    }
  }
  // Handles additional attributes about a template entity that for RDF parsing
  // reasons, can't be placed into that template's $attributes variable. This
  // is "meta" information that is related to particular content, so render it
  // close to that content.
  if (!empty($variables['rdf_metadata_attributes_array'])) {
    if (!isset($variables['content']['#prefix'])) {
      $variables['content']['#prefix'] = '';
    }
    $variables['content']['#prefix'] = theme('rdf_metadata', array('metadata' => $variables['rdf_metadata_attributes_array'])) . $variables['content']['#prefix'];
  }
}
1
kiamlaluno

テーマシステム全体の説明は避けます。関数の順序と使用法は、最もよく説明されています ここ

プリプロセッサ関数は、プロセス関数の前に実行されます。すべてのプリプロセッサが実行された後にすべてのテーマ呼び出しに影響を与えたい場合は、フックプロセスを実行する必要があります。 (まあ、私はそれが.tplファイルでのすべてのテーマ呼び出しであると信じています。)

RDFは、すべてのテーマテンプレートにメタデータを挿入したいので、良い例です。しかし、ほとんどの場合それはあなたがしたいことではありません。別の例は Pirate モジュールのようなものです。

プリプロセッサはよりターゲットを絞っています。たとえばリストのみを変更したい場合は、そこでプリプロセスフックを使用できます。 hook_preprocess_HOOK() sはテンプレートと関数に対して実行されると思います。

hook_preprocess()はトリガーしない限りトリガーされないため、テーマでオーバーライドされないものを前処理する場合は、theme_preprocess_HOOK()をテーマで使用できます。

3
Jeremy French