как определить функцию предварительной обработки объекта

10

Мой пользовательский модуль определяет пользовательский объект, который расширяет класс EntityAPIController. Мне удалось заставить его в основном работать, то есть отображать поля и т. Д. Через мой пользовательский файл tpl.php. Но я хотел бы создать mymodule_preprocess_entityфункцию (как предложено здесь ) для добавления пользовательских переменных в файл tpl.php. Но такая функция не работает (не вызывается).

Кроме того, когда я отображал эту сущность, я заметил, что функция template_preprocess_entity(&$variables)из entity.module тоже не работает.

Что еще нужно определить, чтобы сделать функцию предварительной обработки для вызываемой пользовательской сущности?

CamCam
источник
вы используете mymodule - предложение использует mytheme
rémy

Ответы:

9

Я создал общую mymodule_preprocess(&$variables, $hook)функцию, и она показала, что конкретное имя функции должно быть mymodule_preprocess_myentity. Где myentityсобственное имя сущности.

Итак, этот код работает для меня:

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
источник
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(), не проверяет, реализует ли активная тема обработчик препроцесса.

fireh
источник