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


10

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

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

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


ご使用のmymodule -提案の用途はmytheme
レミー

回答:


9

一般的なmymodule_preprocess(&$variables, $hook)関数を作成しましたが、特定の関数名はである必要がありますmymodule_preprocess_myentitymyentityエンティティの適切な名前はどこにありますか。

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

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) {
  ...
}

2

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

/**
 * 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()、アクティブなテーマがプリプロセスフックを実装しているかどうかはチェックしません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.