Разные шаблоны для одного блока (разные режимы отображения)

Главные вкладки

Аватар пользователя avtomoda avtomoda 25 апреля 2020 в 20:22

Друпал 8. Пользовательский блок id = time_work (block_custom id = time_work). Добавил режим отображения (test).В блоке добавил поле с contrib модулем office hours. Для каждого режима отображения блока настроил forrmater поля office hours. В footer добавил этот блок с режимом отображения full (default). На странице добавляю этот же блок с режимом отображения test. Мне надо для каждого из этих блоков определить свой собственный шаблон. В самом office hours не за что зацепиться.
array:5 [▼
"office_hours" => array:3 [▶]
"item_separator" => "
"
"slot_separator" => ", "
"closed_text" => null
"theme_hook_original" => "office_hours"
Пытался сделать так, что бы получить режимы отображения:
$block = \Drupal::entityTypeManager()->getStorage('block_content')->load(2);
$block_view = \Drupal::entityTypeManager()->getViewBuilder('block_content')->view($block);
Но в обоих случаях получаю режим full.
Может кто подскажет, как мне переопределить шаблоны для одного блока, но для разных режимов, что бы в одном режиме один шаблон, в другом режиме другой шаблон.
Нужно что то вроде этого:
function hook_theme_suggestions_office_hours_alter(array &$suggestions, array $variables) {
$suggestions[] = $variables['theme_hook_original'] . '__' . '$block' . '__' . $block_view;
}

Комментарии

Аватар пользователя OldWarrior OldWarrior 26 апреля 2020 в 1:41

avtomoda wrote: как мне переопределить шаблоны для одного блока, но для разных режимов, что бы в одном режиме один шаблон, в другом режиме другой шаблон.
Нужно что то вроде этого:
function hook_theme_suggestions_office_hours_alter(array &$suggestions, array $variables) {

Намекну:

<?php
function hook_theme_suggestions_block_alter(array &$suggestions, array $variables)  {
  ...
  
$view_mode strtr($variables['elements']['#configuration']['view_mode'], '.''_');
  
$suggestions[] = 'block__block_content__' $view_mode;
  ...
}
?>
Аватар пользователя avtomoda avtomoda 26 апреля 2020 в 1:46

Спасибо за намек, но это не то. Здесь решение для шаблона блока. А мне нужен шаблон для contib модуля в поле (field) пользовательского блока.

Аватар пользователя OldWarrior OldWarrior 26 апреля 2020 в 2:06

Так а какие проблемы сделать то же для поля?
Ещё намёк.

<?php
function hook_theme_suggestions_field_alter(&$suggestions$variables) {
  ...
  
$suggestions[] = 'field__' $variables['element']['#field_name'] . '__' $variables['element']['#bundle'] . '__' $variables['element']['#view_mode'];
  ...
 
// зы. Здесь ещё конкретнее: $variables['element']['#bundle'] по идее - машинное имя блока
}
?>
Аватар пользователя avtomoda avtomoda 26 апреля 2020 в 2:17

мне нужен шаблон для contib модуля в поле (field) - не для поля и не для блока.
И шаблон блока, и шаблон field я смог бы переопределить на раз. Это не проблема.
Мне нужен шаблон для templates самого модуля в поле field. А вывод модуля:
office_hours" => array:3 [▶]
"item_separator" => "
"
"slot_separator" => ", "
"closed_text" => null
"theme_hook_original" => "office_hours"
К чему привязаться? Ни variables element от блока, ни variables element с field? Мне их откуда брать?
То есть по сути мне надо в theme_suggestions_office_hours_alter определить родителя (то есть в каком блоке он находиться), определить режим view_mode у родителя (то есть у блока), а потом передать данный параметр в theme_suggestions_office_hours_alter

Аватар пользователя OldWarrior OldWarrior 26 апреля 2020 в 3:25

В office_hours.module есть 3 препроцесс-функции:

function template_preprocess_office_hours_table(&$variables)
function template_preprocess_office_hours(&$variables)
function template_preprocess_office_hours_status(&$variables)

Судя по всему, вам нужна вторая (office_hours).
Имплементируйте её в модуле или теме.
Покопайтесь в $variables (dpm() или var_dump())
Возможно, найдёте текущий #view_mode или (возможно) родительскую сущность.

Если найдёте - вытаскивайте на верхний уровень: $variables['view_mode']. Дальше можно даже в .twig'е разделиться по режимам, если что.

Аватар пользователя avtomoda avtomoda 26 апреля 2020 в 3:30

Это первое что я сделал. Я покопался в preprocess_office_hours. Там есть arrai attributes и conten attributes , но не разобрался как туда передать свои параметры. К чему либо другому там привязаться нет возможности. И родительской сущности там нет.

Аватар пользователя avtomoda avtomoda 26 апреля 2020 в 9:49

template_preprocess_office_hours(&$variables)
array:18 [▼
"office_hours" => array:3 [▶]
"item_separator" => "
"
"slot_separator" => ", "
"closed_text" => null
"theme_hook_original" => "office_hours"
"attributes" => []
"title_attributes" => []
"content_attributes" => []
"title_prefix" => []
"title_suffix" => []
"db_is_active" => true
"is_admin" => false
"logged_in" => false
"user" => Drupal\Core\Session\AccountProxy {#1606 ▶}
"directory" => "themes/custom/avtomoda_mdbbootstrap"
"items" => array:3 [▶]
"label_length" => 23
"#cache" => array:1 [▶]

Аватар пользователя avtomoda avtomoda 26 апреля 2020 в 21:34

Я конечно решил по быстрому. Присмотрелся - в выводе template_preprocess_office_hours(&$variables) у разных блоков разный "label_length". К нему и привязался. А к theme_suggestions_office_hours_alter привязал id block. Это костыльное решение, неправильное. Но пока как есть.