subentity-1.x-dev/subentity.module
subentity.module
<?php
/**
* @file
* Hook implementations of subentity module.
*/
use Drupal\Component\Utility\Html;
use Drupal\Core\Render\Element;
use Drupal\subentity\Entity\SubEntityBase;
/**
* Implements hook_theme().
*/
function subentity_theme(): array {
$themes = [
'subentity' => [
'render element' => 'elements',
],
];
$entity_types = \Drupal::entityTypeManager()->getDefinitions();
foreach ($entity_types as $type_id => $type) {
if (is_subclass_of($type->get('class'), SubEntityBase::CLASS)) {
$themes[$type_id] = [
'render element' => 'elements',
];
}
}
return $themes;
}
/**
* Implements hook_theme_registry_alter().
*/
function subentity_theme_registry_alter(array &$theme_registry): void {
$entity_types = \Drupal::entityTypeManager()->getDefinitions();
foreach ($entity_types as $type_id => $type) {
if (!is_subclass_of($type->get('class'), SubEntityBase::CLASS)) {
continue;
}
// No hook theme for subentity with type_id.
if (!isset($theme_registry[$type_id])) {
$theme_registry[$type_id] = $theme_registry['subentity'];
}
}
}
/**
* Implements hook_preprocess_HOOK().
*/
function template_preprocess_subentity(array &$variables): void {
$entity_type = $variables['elements']['#entity_type'];
$variables['attributes']['class'][] = Html::cleanCssIdentifier($entity_type);
$variables += ['content' => []];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Implements hook_theme_suggestions_alter().
*/
function subentity_theme_suggestions_alter(array &$suggestions, array $variables, string $hook): void {
if (isset($variables['elements']['#' . $hook]) && $variables['elements']['#' . $hook] instanceof SubEntityBase) {
$subentity = $variables['elements']['#' . $hook];
if (!empty($variables['elements']['#view_mode'])) {
$view_mode = $variables['elements']['#view_mode'];
$suggestions[] = $hook . '__' . $view_mode;
}
if ($subentity->bundle() !== 'subentity') {
$bundle = $subentity->bundle();
$suggestions[] = $hook . '__' . $bundle;
if (!empty($view_mode)) {
$suggestions[] = $hook . '__' . $bundle . '__' . $view_mode;
}
}
}
}
