이동 경로 내용 변경


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);
      }
    }

@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;
        }       
    }

}

2
이것은 올바른 방법으로 보이지만 저에게는 효과가 없습니다. 아이러니하게도, 이것은 관리 페이지에서는 작동하지만 일반 사용자 콘텐츠에서는 작동하지 않습니다. 디버깅하는 방법에 대한 제안?
Peter Murray

@PeterMurray와 같은 문제가 있습니다. 아직 완전히 해결하지는 못했지만 지금 당장 말할 수있는 것은 custom_breadcrumbs 모듈이 어떻게 든 링크를 재정의했기 때문입니다. 어쨌든 내 2 센트.
Pax

9

drupal_set_breadcrumb ()가 이전에 호출 된 페이지에서는 hook_menu_breadcrumb_alter ()가 작동 하지 않습니다 .

hook_menu_breadcrumb_alter은 () 에서 호출 menu_get_active_breadcrumb ()을 . 이것은 drupal_get_breadcrumb () 에서 호출 되지만 이전에 drupal_set_breadcrumb ()로 설정된 빵 부스러기가없는 경우에만 해당됩니다 .

drupal_set_breadcrumb ()가 사용자 페이지에서 호출 된 것처럼 보이지 않습니다 . 그러나 아마도 그렇게하는 contrib 모듈 이있을 수 있습니다. drupal_set_breadcrumb ()에 dpm () 또는 ddebug_backtrace ()를 넣어이 경우에 해당하는지 확인할 수 있습니다 (devel 모듈이 활성화되어 있고 devel 정보를 볼 수있는 권한이 있어야 함).

대신 hook_preprocess_breadcrumb ()를 사용할 수 있지만 변경하려는 이동 경로 링크를 구문 분석해야합니다. 이 후크에서 이동 경로 링크는 이미 html로 렌더링되므로 URL과 같은 정규 표현식 (preg_match ()) 또는 이와 유사한 것이 필요합니다.

훨씬 더 나은 솔루션은 Drupal에 사용 가능한 다양한 이동 경로 사용자 정의 모듈 중 하나를 사용하는 것입니다 .


2

이것은 가장 효율적인 방법은 아니지만 다음을 시도하십시오.

function THEME_breadcrumb($variables)

변수를 읽습니다.

... 또한 나의 신은 빵 부스러기를 싫어한다. 너무 많이.


1
나는 이것을 보았다. 그러나 "중복 방법"은 아닌 것 같습니다. 이것은 테마 후크이므로 입력을 수정하는 데 사용해서는 안됩니다.
Jean-Michel Garcia

다른 방법으로 작동하지 않기 때문에 이것을하려고합니다. 귀하의 질문을지지하지만 동의하지 않습니다. 누군가가 "올바른 길"을 찾길 바라고 있습니다.
Jean-Michel Garcia

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 방법이지만 링크에서가 아니라 빵 부스러기의 마크 업 만 변경해야합니다.


0

THEME_NAME_breadcrumb나를 위해 작동하지 않았다. 그러나이 기능으로 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 로 이동합니다.


0

함수 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을 수정하기에 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.