Друпал 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;
}
Комментарии
Намекну:
<?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;
...
}
?>
Спасибо за намек, но это не то. Здесь решение для шаблона блока. А мне нужен шаблон для contib модуля в поле (field) пользовательского блока.
Так а какие проблемы сделать то же для поля?
Ещё намёк.
<?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'] по идее - машинное имя блока
}
?>
Блок на странице:
Блок (с другим режимом отображения view_mode) на этой же странице но в футере:
мне нужен шаблон для 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
Блок на странице:
Блок (с другим режимом отображения view_mode) на этой же странице но в футере:
В 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'е разделиться по режимам, если что.
Это первое что я сделал. Я покопался в preprocess_office_hours. Там есть arrai attributes и conten attributes , но не разобрался как туда передать свои параметры. К чему либо другому там привязаться нет возможности. И родительской сущности там нет.
У меня не установлен это модуль.
Приведите хотя бы дамп dpm(array_keys($variables))
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 [▶]
Я сдаюсь.
Я конечно решил по быстрому. Присмотрелся - в выводе template_preprocess_office_hours(&$variables) у разных блоков разный "label_length". К нему и привязался. А к theme_suggestions_office_hours_alter привязал id block. Это костыльное решение, неправильное. Но пока как есть.