Изменение содержимого крошки

13

Я пытаюсь использовать этот хук, чтобы изменить ссылку крошки:

hook_menu_breadcrumb_alter(&$active_trail, $item)

Крюк, кажется, не называется.

Я пробовал :

  • Использование крюка на тему
  • Использование хука в пользовательском модуле (breadcrumb_finder_fix)
  • Очистка всех кешей с помощью Drush

У меня установлен и активирован модуль Devel, и следующее не дает никакого результата.

function breadcrumb_finder_fix_menu_breadcrumb_alter(&$active_trail, $item) {
    drupal_set_message(krumo($active_trail));
}

Есть идеи ? Направления? Пожалуйста, порекомендуйте.

OBS: я прочитал этот ответ: /drupal//a/7659/12647

Жан-Мишель Гарсия
источник
У меня та же проблема. Я создал функцию хука MYMODULE_menu_breadcrumb_alter (), включил модуль, очистил кеш, и хук, кажется, никогда не вызывался на пользовательских страницах. По иронии судьбы, он, кажется, вызывается на страницах администратора (я получаю вывод krumo на страницах администратора). Уровень _breadcrumb () темы, кажется, не подходит для этого.
Питер Мюррей

Ответы:

4

Вот фрагмент, чтобы показать, как вы можете изменить панировочные сухари.

Имейте в виду следующее:

  • Этот метод изменяет хлебные крошки на уровне темы, что является последним местом для изменения любой вещи, прежде чем она достигнет файлов шаблонов, поэтому изменение здесь не позволит другому модулю изменить хлебные крошки позже.
  • Рассматривайте этот способ как последний вариант, чтобы изменить ваши крошки.
  • Добавьте этот фрагмент в файл 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);
      }
    }
arpitr
источник
@ Jean Я сделал несколько изменений, взгляните на это (не во фрагменте), но в заявлении об отказе
arpitr
13

Возможно, немного поздно, чтобы ответить, но я наткнулся на эту тему этим утром, когда искал способ переопределить крошку в Drupal 7, это немного помогло, поэтому я подумал, что добавлю свое решение.

Это создает дополнительные крошки на основе типов контента и добавляет текущую страницу в крошку. Я использую это, чтобы добавить крошку к фильтрующему представлению, замеченному перед данным узлом.

function MYMODULE_menu_breadcrumb_alter(&$active_trail, $item) {

    //STORE THE LAST ITEM
    $end = end($active_trail);

    foreach ($active_trail as $key => $crumb){

        //CHECK AGAINST NODE TYPE
        if($crumb['map'][1]->type == 'NODE_MACHINE_NAME'){

            //INSERT THE REPLACEMENT CRUMB
            $active_trail[$key] = array( 
                'title' => t("Title"),
                'href' => 'PATH',
                'link_path' => 'PATH', 
                'localized_options' => array(),
                'type' => 0
            );
            //RECREATE ITEM
            $active_trail[] = $crumb;
        }

    }


    //SHOW CURRENT PAGE IN BREADCRUMB BY DUPLICATING THE LAST ARRAY ITEM IN ACTIVE_TRAIL

    if (!drupal_is_front_page()) {
        if ($item['href'] == $end['href']) {
            $active_trail[] = $end;
        }       
    }

}
andrew_hoffi
источник
2
Кажется, это правильный путь, но он не работает для меня. По иронии судьбы, это работает на страницах администратора, но не работает с общим пользовательским контентом. Предложения по отладке?
Питер Мюррей
У меня та же проблема, что и у @PeterMurray. Я еще не решил полностью, но из того, что я могу сказать прямо сейчас, это вызвано тем, что модуль custom_breadcrumbs каким-то образом переопределяет ссылки. Мои 2 цента, так или иначе.
Пакс
9

Функция hook_menu_breadcrumb_alter () не работает на страницах, где ранее вызывался drupal_set_breadcrumb ().

hook_menu_breadcrumb_alter () вызывается из menu_get_active_breadcrumb () . Это вызывается из drupal_get_breadcrumb () , но только если хлебные крошки ранее не были установлены с помощью drupal_set_breadcrumb () .

Это не похоже на то, что drupal_set_breadcrumb () вызывается со страницы пользователя. Но, возможно, есть модуль contrib, который это делает. Вы можете поместить dpm () или ddebug_backtrace () в drupal_set_breadcrumb (), чтобы увидеть, так ли это (требуется, чтобы модуль devel был включен, и у вас было разрешение на просмотр информации devel).

Вместо этого вы можете использовать hook_preprocess_breadcrumb (), но для этого необходимо проанализировать ссылку на крошку, которую вы хотите изменить. Поскольку в этом хуке ссылки на хлебные крошки уже отображаются как html, поэтому вам нужны регулярные выражения (preg_match ()) или аналогичные для определения, например, url.

Гораздо лучшим решением является использование одного из различных модулей настройки крошки , доступных для Drupal.

Дон Кихот
источник
2

это может быть не самый эффективный способ, но попробуйте:

function THEME_breadcrumb($variables)

и затем прочитайте переменные.

... также мой бог, я ненавижу крошки. так много.

Jdu
источник
1
Я видел это. Но это не похоже на «путь Drupal». Это тематический хук, и поэтому его не следует использовать для изменения ввода
Жан-Мишель Гарсия,
Я иду на это, потому что другой путь не работает. Я поднимаю ваш вопрос, но не принимаю. Надеясь, что кто-то найдет «правильный путь».
Жан-Мишель Гарсия
1

Если вам нужно только изменить крошку на определенной странице, возможно, вам поможет следующее решение. В примере обновляется хлебная крошка для формы редактирования.

$breadcrumb = array();
$breadcrumb[] = l(t('Home'), '<front>');
$breadcrumb[] = l(t('Nodes listing'), 'nodes/listing');
# Update breadcrumb on the edit form
if (isset($form['nid']) && (is_numeric($form['nid']['#value']))) {
    $breadcrumb[] = l($form['#node']->title, 'node/' . $node->nid);
}

drupal_set_breadcrumb($breadcrumb);

Другой способ Drupal для пользователя hook_menu_breadcrumb_alter но не забудьте назвать его YOUR_MODULE_menu_breadcrumb_alterи очистить кеш после добавления функции.

Или же theme_breadcrumbэто Drupal-способ обновления хлебной крошки, но в этом хуке вы должны изменять только разметку хлебной крошки, а не ссылки.

bogtan
источник
0

THEME_NAME_breadcrumbне работает для меня. Тем не менее, мне удалось переопределить крошку с помощью этой функции:

function MODULE_node_view_alter(&$build) {
  $node = $build['#node'];
  if ($build['#view_mode'] == 'full' && $node->type == 'CONTENT_TYPE') {
    $breadcrumb = array();
    $breadcrumb[] = l('Home', '<front>');
    $breadcrumb[] = l('People', 'group/node/' . arg(2) . '/people');
    $breadcrumb[] = l('Attendance', 'group/node/' . arg(2) . '/people/attendance');
    drupal_set_breadcrumb($breadcrumb);
  }
}

кредит идет по адресу : /programming/10087168/how-to-add-breadcrumb

Turtletrail
источник
0

function MODULE_menu_breadcrumb_alter (& $ active_trail, $ item) {

//STORE THE LAST ITEM
$end = end($active_trail);
foreach ($active_trail as $key => $crumb){
    //CHECK AGAINST NODE TYPE
    if($crumb['map'][1]->type == 'CONTENT_TYPE' && $crumb['link_path'] == 'node/%'){
       //INSERT THE REPLACEMENT CRUMB
        //INSERT THE REPLACEMENT CRUMB
        $active_trail[$key] = array( 
            'title' => t("Title"),
            'href' => 'PATH',
            'link_path' => 'PATH', 
            'localized_options' => array(),
            'type' => 0
        );
    }
}

}

этого кода достаточно, чтобы изменить URL крошки.

Nayana
источник