web-dev-qa-db-fra.com

comment définir la fonction de prétraitement d'entité

Mon module personnalisé définit une entité personnalisée, qui étend la classe EntityAPIController. J'ai réussi à le faire fonctionner, c'est-à-dire à afficher des champs, etc. via mon fichier tpl.php personnalisé. Mais je voudrais créer une fonction mymodule_preprocess_entity (Comme suggéré ici ) pour ajouter des variables personnalisées au fichier tpl.php. Mais une telle fonction n'est pas en cours d'exécution (n'est pas appelée).

De plus, lorsque j'affiche cette entité, j'ai remarqué que la fonction template_preprocess_entity(&$variables) de entity.module n'est pas non plus en cours d'exécution.

Que faut-il définir d'autre pour que la fonction de prétraitement de l'entité personnalisée soit appelée?

10
camcam

J'ai créé une fonction générale mymodule_preprocess(&$variables, $hook) et cela a montré que le nom de la fonction spécifique devrait être mymodule_preprocess_myentity. Où myentity est le nom propre de l'entité.

Donc, ce code fonctionne pour moi:

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

Une approche plus générique:

/**
 * 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);
    }
  }
}

Malheureusement, module_implements() ne vérifie pas si le thème actif implémente le hook de prétraitement.

2
fireh