adaptivetheme-8.x-3.x-dev/at_core/includes/suggestions.inc
at_core/includes/suggestions.inc
<?php
/**
* @file
*/
use Drupal\at_core\Theme\ThemeConfig;
use Drupal\block_content\BlockContentInterface;
/**
* Implements hook_theme_suggestions_HOOK_alter().
*
* @param array $suggestions
* @param array $variables
*/
function at_core_theme_suggestions_page_alter(array &$suggestions, array $variables) {
// Add content type suggestions, e.g. page--node--article.html.twig.
if ($node = \Drupal::routeMatch()->getParameter('node')) {
if (is_object($node)) {
array_splice($suggestions, 1, 0, 'page__node__' . $node->getType());
}
// If no page--front template is set, inherit the page--node-[id] template
// when a node/nid is set as the homepage.
if (\Drupal::service('path.matcher')->isFrontPage() == TRUE) {
array_splice($suggestions, 2, 0, 'page__node__' . $node->id());
}
}
// Show template suggestions.
if (\Drupal::currentUser()->hasPermission('administer themes')) {
// Config.
$theme = &drupal_static(__FUNCTION__);
if (!isset($theme)) {
$data = new ThemeConfig(\Drupal::theme()->getActiveTheme()->getName());
$theme = $data->getConfig();
}
$config = $theme['config'];
if (isset($config['enable_extensions']) && $config['enable_extensions'] === 1) {
if (isset($config['enable_devel']) && $config['enable_devel'] === 1) {
if (isset($config['show_page_suggestions']) && $config['show_page_suggestions'] === 1) {
$formatted_suggestions = [];
if ($suggestions) {
foreach ($suggestions as $suggestion_name) {
if ($suggestion_name === 'page__') {
$suggestion_name = str_replace('_', '', $suggestion_name);
}
$formatted_suggestions[] = str_replace('_', '-', $suggestion_name);
}
$these_suggestions = ['#theme' => 'item_list', '#items' => $formatted_suggestions];
\Drupal::messenger()->addMessage(t('Template suggestions for this page:<br>@these_suggestions <p>To stop showing suggestions switch them off in your themes Appearance settings > Developer tools.</p>', ['@these_suggestions' => \Drupal::service('renderer')->renderPlain($these_suggestions)]), 'status');
}
}
}
}
}
}
/**
* Implements hook_theme_suggestions_HOOK_alter() for row templates.
*
* @param array $suggestions
* @param array $variables
*/
function at_core_theme_suggestions_row_alter(array &$suggestions, array $variables) {
if (isset($variables['regions']['#row'])) {
$row = $variables['regions']['#row'];
$suggestions[] = 'row__' . $row;
// Add content type suggestions, e.g. page--node--article.html.twig.
if ($node = \Drupal::routeMatch()->getParameter('node')) {
if (is_object($node)) {
array_splice($suggestions, 1, 0, 'row__' . $row . '__node_' . $node->getType());
}
// Row front.
if (\Drupal::service('path.matcher')->isFrontPage() == TRUE) {
array_splice($suggestions, 2, 0, 'row__' . $row . '__front');
}
}
}
}
/**
* Implements hook_theme_suggestions_HOOK_alter() for field templates.
*
* @param array $suggestions
* @param array $variables
*/
function at_core_theme_suggestions_field_alter(array &$suggestions, array $variables) {
// Add the entity reference type as a field template suggestion.
if (isset($variables['element']['#items']) && is_object($variables['element']['#items'])) {
$target_type = $variables['element']['#items']->getSetting('target_type') ?: NULL;
if ($target_type !== NULL) {
array_splice($suggestions, 1, 0, 'field__entity_reference_type__' . $target_type);
}
}
}
/**
* Implements hook_theme_suggestions_HOOK_alter() for form templates.
*
* @param array $suggestions
* @param array $variables
*/
function at_core_theme_suggestions_block_alter(array &$suggestions, array $variables) {
// Config.
$theme = &drupal_static(__FUNCTION__);
if (!isset($theme)) {
$data = new ThemeConfig(\Drupal::theme()->getActiveTheme()->getName());
$theme = $data->getConfig();
}
// Block suggestions for custom block bundles.
if (isset($variables['elements']['content']['#block_content']) && $variables['elements']['content']['#block_content'] instanceof BlockContentInterface) {
array_splice($suggestions, 1, 0, 'block__bundle__' . $variables['elements']['content']['#block_content']->bundle());
}
// Use a custom block suggestion for responsive menus.
if (isset($theme['path_skin'])) {
// Skin themes need to use the base themes block elements id to match the config setting.
$variables['elements']['#id'] = str_replace($theme['name'], $theme['base'], $variables['elements']['#id']);
}
if (isset($theme['config']['responsive_menu_block'], $variables['elements']['#id']) && $theme['config']['responsive_menu_block'] === $variables['elements']['#id']) {
// If (isset($theme['config']['responsive_menu_block']) && $theme['config']['responsive_menu_block'] === $variables['elements']['#id']) {.
if (isset($theme['config']['enable_extensions']) && $theme['config']['enable_extensions'] === 1) {
if (isset($theme['config']['enable_responsive_menus']) && $theme['config']['enable_responsive_menus'] === 1) {
if (isset($theme['config']['responsive_menu_block'])) {
if (isset($variables['elements']['#base_plugin_id'])) {
// Support System module and Menu Block module blocks.
if ($variables['elements']['#base_plugin_id'] === 'system_menu_block' || $variables['elements']['#base_plugin_id'] === 'menu_block') {
if (isset($variables['elements']['#derivative_plugin_id'])) {
$suggestions[] = 'block__responsive_menu';
}
}
}
}
}
}
}
// Drupal core, may at times, generate a suggestion with camel casing, or even
// spaces in the name. Fix it, always. Note this is due to how core adds
// suggestions based on the #plugin_id and #id and fails to adequately clean
// them up. See: block_theme_suggestions_block()
foreach ($suggestions as $key => $suggestion) {
$suggestions[$key] = str_replace(' ', '_', strtolower($suggestion));
}
}
/**
* Implements hook_theme_suggestions_HOOK_alter().
* TODO: keep on on https://drupal.org/node/2247677
*
* @param array $suggestions
* @param array $variables
*/
function at_core_theme_suggestions_user_alter(array &$suggestions, array $variables) {
$suggestions[] = 'user__' . $variables['elements']['#view_mode'];
}
/**
* Implements hook_theme_suggestions_HOOK_alter() for form templates.
*
* @param array $suggestions
* @param array $variables
*/
function at_core_theme_suggestions_form_alter(array &$suggestions, array $variables) {
if ($variables['element']['#form_id'] === 'search_block_form') {
$suggestions[] = 'form__search_block_form';
}
}
