cómo definir la función de preproceso de entidad

10

Mi módulo personalizado define una entidad personalizada, que extiende la clase EntityAPIController. Logré hacerlo funcionar básicamente, es decir, mostrar campos, etc. a través de mi archivo tpl.php personalizado. Pero me gustaría crear una mymodule_preprocess_entityfunción (como se sugiere aquí ) para agregar variables personalizadas al archivo tpl.php. Pero dicha función no se está ejecutando (no se llama).

Además, cuando visualizo esta entidad, noté que la función template_preprocess_entity(&$variables)de entity.module tampoco se está ejecutando.

¿Qué más se debe definir para que la función de preproceso se llame a la entidad personalizada?

camcam
fuente
estás usando mymodule - la sugerencia usa mytheme
rémy

Respuestas:

9

Creé una mymodule_preprocess(&$variables, $hook)función general y demostró que el nombre de la función específica debería ser mymodule_preprocess_myentity. ¿Dónde myentityestá el nombre propio de la entidad?

Entonces, este código está funcionando para mí:

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

Un enfoque más genérico:

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

Lamentablemente module_implements()no comprueba si el tema activo implementa el enlace de preproceso.

fireh
fuente