如何定义实体预处理功能


10

我的自定义模块定义了一个自定义实体,该实体扩展了EntityAPIController类。我设法使其基本工作,即通过我的自定义tpl.php文件显示字段等。不过,我想创建一个mymodule_preprocess_entity函数(如建议在这里),以自定义变量添加到tpl.php文件。但是此类功能未运行(未调用)。

另外,当我显示该实体时,我注意到template_preprocess_entity(&$variables)来自entity.module 的函数也未运行。

还需要定义什么才能使被调用的自定义实体具有预处理功能?


您使用MyModule的-建议用途的MyTheme
雷米

Answers:


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()是不检查活动主题是否实现了预处理钩子。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.