jak zdefiniować funkcję wstępnego przetwarzania encji

10

Mój moduł niestandardowy definiuje niestandardową jednostkę, która rozszerza klasę EntityAPIController. Udało mi się sprawić, że w zasadzie działa, tzn. Wyświetla pola itp. Za pomocą mojego niestandardowego pliku tpl.php. Chciałbym jednak utworzyć mymodule_preprocess_entityfunkcję (jak sugerowano tutaj ), aby dodać niestandardowe zmienne do pliku tpl.php. Ale taka funkcja nie działa (nie jest wywoływana).

Ponadto, kiedy wyświetlam ten byt, zauważyłem, że funkcja template_preprocess_entity(&$variables)z bytu.module też nie działa.

Co jeszcze należy zdefiniować, aby wywołać funkcję wstępnego przetwarzania dla encji niestandardowej?

kamera
źródło
twój za pomocą mymoduła - sugestia używa mytematu
rem

Odpowiedzi:

9

Utworzyłem funkcję ogólną, mymodule_preprocess(&$variables, $hook)która pokazała, że ​​konkretna nazwa funkcji powinna być mymodule_preprocess_myentity. Gdzie myentityjest właściwa nazwa bytu.

Więc ten kod działa dla mnie:

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) {
  ...
}
kamera
źródło
2

Bardziej ogólne podejście:

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

Niestety module_implements()nie sprawdza, czy aktywny motyw implementuje hak wstępnego przetwarzania.

fireh
źródło