Программное формирование breadcrumbs

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

Аватар пользователя y-vo y-vo 6 ноября 2019 в 11:20

Приветствую. Пытаюсь тут разобраться в разработке модулей под друпал и хочу переписать крошки для различных типов материала. Насколько я понял из того что нашел, это то что сам сам html крошек пишется через https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_br... , насколько я понял это делается в template.php. Дальше я начал искать чем же сама эта цепочка формируется, а тут куча хуков, в которых я не совсем разобрался в терминологии. Пытался повлиять на их формирование для теста так:

<?php
function my_module_set_breadcrumb($breadcrumb NULL) {
    
$breadcrumb = array();
    
$breadcrumb[] = l('Home11''');
    
$breadcrumb[] = l('Topics''taxonomy/term/1');
    return 
$breadcrumb;
}
?>

Чистил кэш, но никаких изменений не заметил, пробовал еще эту функцию https://api.drupal.org/api/drupal/includes%21menu.inc/function/menu_set_... , но тоже изменений не заметил.

В общем запутался) Буду благодарен за любые разъяснения, как это работает.

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 6 ноября 2019 в 11:39
1

Например в template.php можно

function THEME_NAME_breadcrumb($variables) {
  $breadcrumb = $variables['breadcrumb'];

  // check to ensure this is the one you want to alter
  // Custom rebuild process of breadcrumb with custom links.
  if ($breadcrumb[1] == 'your_breadcrumb_id') {
    // linking to home page
    $links[0] = l(t('Home'), '<front>');

    // Keeping the trail/current page as non linked
    $links[1] = ('your desired breadcrumb');
    drupal_set_breadcrumb($links);
  }
}

Аватар пользователя y-vo y-vo 6 ноября 2019 в 14:52

То есть этот хук предназначен для использования только в template.php? В модуле его использовать нельзя? И что для подобных целей можно было бы использовать именно в модуле?

Аватар пользователя sas@drupal.org sas@drupal.org 6 ноября 2019 в 15:18

Здесь такое дело, это темизация, _preprocess в модуле можно сделать, но для для перехвата темизации в модуле, надо переопределять местоположение обработчика для функции темы через
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21...
Вот хороший пример https://www.drupal.org/project/path_breadcrumbs

/**
 * Implements hook_theme_registry_alter().
 */

function path_breadcrumbs_theme_registry_alter(&$theme_registry) {
  global $theme_key;

  $internal_render = variable_get('path_breadcrumbs_internal_render', 1);
  $themes = variable_get('path_breadcrumbs_internal_render_themes', array());

  if ($internal_render && (empty($themes) || in_array($theme_key, $themes))) {
    $theme_registry['breadcrumb']['theme path'] = drupal_get_path('module', 'path_breadcrumbs');
    $theme_registry['breadcrumb']['function'] = 'path_breadcrumbs_breadcrumb';
  }
}

Аватар пользователя y-vo y-vo 6 ноября 2019 в 18:39

Модуль то умеет) я хочу разобраться именно с API. Ну и именно такую задачу как мне нужно он не сможет решить насколько я знаю. Мне бы разобраться с тем как это все программно переопределяется...

Аватар пользователя sas@drupal.org sas@drupal.org 7 ноября 2019 в 10:41
1

Здесь такое дело, это темизация, _preprocess в модуле можно сделать, но для для перехвата темизации в модуле, надо переопределять местоположение обработчика для функции темы через
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...
Вот хороший пример https://www.drupal.org/project/path_breadcrumbs

/**
* Implements hook_theme_registry_alter().
*/
function path_breadcrumbs_theme_registry_alter(&$theme_registry) {
global $theme_key;
$internal_render = variable_get('path_breadcrumbs_internal_render', 1);
$themes = variable_get('path_breadcrumbs_internal_render_themes', array());

if ($internal_render && (empty($themes) || in_array($theme_key, $themes))) {
$theme_registry['breadcrumb']['theme path'] = drupal_get_path('module', 'path_breadcrumbs');
$theme_registry['breadcrumb']['function'] = 'path_breadcrumbs_breadcrumb';
}
}

Аватар пользователя y-vo y-vo 7 ноября 2019 в 18:30

<a href="mailto:sas@drupal.org">sas@drupal.org</a> wrote:
Здесь такое дело, это темизация, _preprocess в модуле можно сделать, но для для перехвата темизации в модуле, надо переопределять местоположение обработчика для функции темы через
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/func...
Вот хороший пример https://www.drupal.org/project/path_breadcrumbs
/**
* Implements hook_theme_registry_alter().
*/
function path_breadcrumbs_theme_registry_alter(&$theme_registry) {
global $theme_key;
$internal_render = variable_get('path_breadcrumbs_internal_render', 1);
$themes = variable_get('path_breadcrumbs_internal_render_themes', array());
if ($internal_render && (empty($themes) || in_array($theme_key, $themes))) {
$theme_registry['breadcrumb']['theme path'] = drupal_get_path('module', 'path_breadcrumbs');
$theme_registry['breadcrumb']['function'] = 'path_breadcrumbs_breadcrumb';
}
}

Спасибо, посмотрю сейчас, мне вот интересно, модули же которые предназначены для решения этих вопросов как то это реализуют)

Аватар пользователя adano adano 7 ноября 2019 в 12:40
1

В общем запутался)

В API написано же все, с примерами:

Returns HTML for a breadcrumb trail.
https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_br...
Можно и в модуле использовать.

Sets the breadcrumb trail for the current page.
https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_...
Как показывает практика, лучше использовать в препроцессах.

P.S. "Переопределять местоположения" - не надо.

Аватар пользователя y-vo y-vo 7 ноября 2019 в 18:39

Спасибо, с той что формирует html разметку крошек да, я разобрался. Вторую я пробовал использовать как написано в первом сообщении, у меня результатов не было, может я неправильно переопределяю это дело?