web-dev-qa-db-ja.com

エンティティの前処理関数を定義する方法

私のカスタムモジュールは、EntityAPIControllerクラスを拡張するカスタムエンティティを定義します。私はそれを基本的に機能させることができました。つまり、カスタムtpl.phpファイルを介してフィールドなどを表示します。しかし、私は_mymodule_preprocess_entity_関数(推奨 here )を作成して、tpl.phpファイルにカスタム変数を追加したいと考えています。しかし、そのような関数は実行されていません(呼び出されていません)。

また、このエンティティを表示すると、entity.moduleの関数template_preprocess_entity(&$variables)も実行されていないことがわかりました。

呼び出されるカスタムエンティティの前処理関数を作成するには、他に何を定義する必要がありますか?

10
camcam

一般的なmymodule_preprocess(&$variables, $hook)関数を作成しましたが、特定の関数名はmymodule_preprocess_myentity。ここで、myentityはエンティティの適切な名前です。

だから、このコードは私のために働いています:

function mymodule_preprocess(&$variables, $hook) {
  if (isset($variables['elements']['#entity_type'])) { // or maybe check for $hook name
    $function = __FUNCTION__ . '_' . $variables['elements']['#entity_type'];
    if (function_exists($function)) {
      $function($variables, $hook);
    }
  }
}

function mymodule_preprocess_myentity(&$vars) {
  ...
}
9
camcam

より一般的なアプローチ:

_/**
 * Implements hook_preprocess().
 */
function mymodule_preprocess(&$variables, $hook) {
  if (isset($variables['elements']['#entity_type'])) {
    $myhook = "preprocess_{$variables['elements']['#entity_type']}_{$variables['elements']['#bundle']}_{$variables['elements']['#view_mode']}";
    $modules = module_implements($myhook);

    foreach ($modules as $module) {
      $function = "{$module}_{$myhook}";
      $function($variables);
    }
  }
}
_

残念ながら、module_implements()は、アクティブなテーマがプリプロセスフックを実装しているかどうかをチェックしません。

2
fireh