Приветствую. Пытаюсь тут разобраться в разработке модулей под друпал и хочу переписать крошки для различных типов материала. Насколько я понял из того что нашел, это то что сам сам 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_... , но тоже изменений не заметил.
В общем запутался) Буду благодарен за любые разъяснения, как это работает.
Комментарии
Например в template.php можно
$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);
}
}
То есть этот хук предназначен для использования только в template.php? В модуле его использовать нельзя? И что для подобных целей можно было бы использовать именно в модуле?
Здесь такое дело, это темизация, _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';
}
}
Попробуйте модуль path_braedcrumbs, он всё умеет из админки.
Модуль то умеет) я хочу разобраться именно с API. Ну и именно такую задачу как мне нужно он не сможет решить насколько я знаю. Мне бы разобраться с тем как это все программно переопределяется...
Здесь такое дело, это темизация, _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';
}
}
Спасибо, посмотрю сейчас, мне вот интересно, модули же которые предназначены для решения этих вопросов как то это реализуют)
В 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. "Переопределять местоположения" - не надо.
Спасибо, с той что формирует html разметку крошек да, я разобрался. Вторую я пробовал использовать как написано в первом сообщении, у меня результатов не было, может я неправильно переопределяю это дело?