Рейтинг:1

Попытка вернуть регион в предложениях темы для блока дерева книги модуля книги

флаг cn

Редактирование вопроса на основе информации от @NoSssweat

Модуль книги использует один и тот же хук для блока дерева книги и отображаемого индексного представления на странице книги.

Я использовал приведенный ниже код для возврата предложений имени файла, чтобы я мог переопределить вывод html для блока дерева книг в определенном регионе - «сначала боковая панель». Я ожидал, что приведенный ниже код выдаст что-то вроде book-tree--book-toc-180--sidebar-first.html.twig. Вместо этого он просто выдает предложение имени файла, которое уже предлагалось:

<!-- FILE NAME SUGGESTIONS:
   * book-tree--book-toc-180.html.twig
   * book-tree--book-toc-180.html.twig
   x book-tree.html.twig
-->

Это предложение имени файла одинаково для основного содержимого на странице книги. Как я могу настроить таргетинг на любые блоки дерева книг в боковая панель-первая область?

// Добавляем региональную переменную в блок.
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
функция uswds_subtheme_preprocess_book_tree__book_toc_180(&$variables) {
    если (isset($variables["элементы"]["#id"])) {
        $block_id = $variables["элементы"]["#id"];
        $block = \Drupal\block\Entity\Block::load($block_id);

        если ($ блок) {
            $variables["content"]["#attributes"]["region"] = $block->getRegion();
        }
    }
}

// добавить предложение шаблона на основе названия региона
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
function uswds_subtheme_theme_suggestions_book_tree__book_toc_180_alter (массив &$предложений, массив $переменных) {
    если (isset($variables["атрибуты"]["регион"])) {
        $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["атрибуты"]["регион"];
    }
}

2-я попытка Я сделал следующее, и это работает, но работает только для блока по умолчанию модуля книги, хотя все остальные плагины блока книжного модуля в основном используют книга-tree.html.twig

// Добавляем региональную переменную в блок.
функция uswds_subtheme_preprocess_block(&$variables) {
  если (isset($variables["элементы"]["#id"])) {
    $block_id = $variables["элементы"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);

    если ($ блок) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

// добавить предложение шаблона на основе названия региона
function uswds_subtheme_theme_suggestions_alter (массив и $ предложения, массив $ переменных, $ крючок) {
  если (isset($variables["атрибуты"]["регион"])) {
    $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["атрибуты"]["регион"];
  }
}
No Sssweat avatar
флаг ua
Отвечает ли это на ваш вопрос? [Определить, в каком регионе отображается блок меню] (https://drupal.stackexchange.com/questions/218907/determine-what-region-a-menu-block-is-rendered-in)
флаг cn
@NoSssweat - не совсем так, как я ищу, возможно ли это в twig
флаг cn
@NoSssweat - еще вопрос: я попытался добавить это через свою подтему, создав файл my_subtheme.theme, но это не сработало (я предполагаю, что наследование так не работает?).
No Sssweat avatar
флаг ua
Предполагая, что ваша подтема установлена ​​​​как текущая тема, она должна была сработать, возможно, вы не очистили кеш, чтобы ловушки были подхвачены?
флаг cn
@NoSssweat - см. обновлено. Кэш очищен.
Рейтинг:2
флаг ua

или как я могу сделать что-то в ветке, например {% if region == 'sidebar-first' %} и просто переопределите book-tree.html.twig

// Добавляет в блок атрибут региона.
функция uswds_subtheme_preprocess_block(&$variables) {
  если (isset($variables["элементы"]["#id"])) {
    $block_id = $variables["элементы"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);
    если ($ блок) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

/**
 * Реализует hook_preprocess_HOOK().
 *
 * Создает региональную переменную
 *
 * Удаляет атрибут региона, добавленный в uswds_subtheme_preprocess_block(), поскольку он
 * недопустимый атрибут HTML.
 */
функция uswds_subtheme_preprocess_book_tree(&$variables) {
  если (isset($variables['атрибуты']['регион'])) {
    // создает региональную переменную для book-tree.html.twig
    $variables['region'] = $variables['attributes']['region'];
    // сбросить недопустимый атрибут html.
    unset($variables['атрибуты']['регион']);
  }
}
флаг cn
К сожалению, это никогда не вызывается — `uswds_subtheme_preprocess_book_tree`.
No Sssweat avatar
флаг ua
Так и должно быть, ты кеш сбрасывал? Если да, проверьте, не нарушается ли условие isset.
Рейтинг:1
флаг ua

Хорошая попытка, так как это книга, а не меню, процесс похож, но не совсем такой же. Я надеялся, что ты разберешься.

Но в любом случае, вот:

/**
 * Реализует hook_preprocess_HOOK().
 *
 * Передайте значение области блока в контент, чтобы его можно было использовать в
 * uswds_subtheme_theme_suggestions_menu_alter(), поскольку $variables['elements']
 * там нет.
 */
функция uswds_subtheme_preprocess_block(&$variables) {
  if (isset($variables['elements']['#id']) && $variables['base_plugin_id'] === 'book_navigation') {
    $region = \Drupal\block\Entity\Block::load($variables['elements']['#id'])->getRegion();
    $content = $variables['content'];
    foreach ($content as $content_key => $content_info) {
      если (is_numeric($content_key)) {
        $variables['content'][$content_key]['#attributes']['region'] = $region;
      }
    }
  }
}

/**
 * Реализует hook_theme_suggestions_HOOK_alter().
 *
 * Предоставление предложений по книгам в зависимости от региона.
 */
function uswds_subtheme_theme_suggestions_book_tree_alter (& $ предложения, массив $ переменных) {
  если (isset($variables['атрибуты']['регион'])) {
    $suggestion = 'книга__' . $переменные['theme_hook_original'] . '__' . $variables['атрибуты']['регион'];
    $suggestion = str_replace('-', '_', $suggestion);
    $предложения[] = $предложение;
  }
}

/**
 * Реализует hook_preprocess_HOOK().
 *
 * Избавьтесь от атрибута региона, добавленного в uswds_subtheme_preprocess_block(), так как он
 * недопустимый атрибут HTML.
 */
функция uswds_subtheme_preprocess_book_tree(&$variables) {
  если (isset($variables['атрибуты']['регион'])) {
    unset($variables['атрибуты']['регион']);
  }
}
флаг cn
К сожалению, я не вижу никаких изменений в предложениях для book-tree.html.twig.
флаг cn
Глядя дальше, я не верю, что вторая функция выполняется, так как я могу изменить некоторые значения, например, «book__» на «books__», и это изменение никогда не произойдет.
Рейтинг:1
флаг cn

Используя всю помощь от @NoSssweat, я смог заставить это работать:

// Добавляем региональную переменную в блок.
функция uswds_subtheme_preprocess_block(&$variables) {
  если (isset($variables["элементы"]["#id"])) {
    $block_id = $variables["элементы"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);

    если ($ блок) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

// добавить предложение шаблона на основе названия региона
function uswds_subtheme_theme_suggestions_alter (массив и $ предложения, массив $ переменных, $ крючок) {
  если (isset($variables["атрибуты"]["регион"])) {
    $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["атрибуты"]["регион"];
  }
}

Какие результаты (второе предложение, включая регион):

<!-- FILE NAME SUGGESTIONS:
   * book-tree--book-toc-180.html.twig
   * book-tree--book-toc-180--sidebar-first.html.twig
   x book-tree.html.twig
-->

Обновление до рабочей версии:

<?php
// Добавляем региональную переменную в блок. Применяется только к некоторым версиям плагинов, которые используют book-tree.html.twig. 
функция uswds_subtheme_preprocess_block(&$variables) {
    если (isset($variables["элементы"]["#id"])) {
      $block_id = $variables["элементы"]["#id"];
      $block = \Drupal\block\Entity\Block::load($block_id);
  
      если ($ блок) {
        $variables["content"]["#attributes"]["region"] = $block->getRegion();
      }
    }
  }

// Добавляет предложение шаблона в блоки. Кажется, работает везде, но не нацелен на дерево книг
функция uswds_subtheme_theme_suggestions_block_alter (массив &$предложений, массив $переменных){
    если (!пусто($переменные['элементы']['#id'])) {
        $block = \Drupal\block\Entity\Block::load($variables['elements']['#id']);
        $region = $block->getRegion();
        // добавляет предложение с регионом и id блока
        $suggestions[] = 'block__' . $ регион . '__' . $переменные['элементы']['#id'];
        // добавляет предложение с идентификатором региона
        $suggestions[] = 'block__' . $регион;
    }
}


// добавить предложение шаблона на основе названия региона
function uswds_subtheme_theme_suggestions_alter (массив и $ предложения, массив $ переменных, $ крючок) {
  если (isset($variables["атрибуты"]["регион"])) {
    $suggestions[] = $variables["theme_hook_original"] . "__" . $variables["атрибуты"]["регион"];
  }
}
No Sssweat avatar
флаг ua
Я использовал Bartik, когда писал свой код, вы должны добавить мою последнюю функцию ловушки; в противном случае вы получите недопустимый атрибут HTML.
флаг cn
@NoSssweat - еще один вопрос (и спасибо за всю помощь) - мой приведенный выше код работает только с блоком, предоставленным модулем книги. Он не предлагает никаких других плагинов, хотя другие плагины также зависят от `book-tree.html.twig`. Как получить дополнительные предложения для ЛЮБОГО блока, который использует book-tree.html.twig и уже выводит book-tree--book-toc-180.html.twig?
флаг cn
@NoSssweat или как я могу сделать что-то в twig, например `{% if region == 'sidebar-first' %}` и просто переопределить `book-tree.html.twig`?
No Sssweat avatar
флаг ua
см. [мой новый ответ] (https://drupal.stackexchange.com/a/308235/27710)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.