การเปลี่ยนเนื้อหา breadcrumb


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 () ฟังก์ชั่น hook เปิดใช้งานโมดูลล้างแคชและดูเหมือนว่า hook จะไม่ถูกเรียกบนหน้าผู้ใช้ ดูเหมือนว่ามันจะถูกเรียกบนหน้าผู้ดูแลระบบ (ฉันได้รับผลลัพธ์ krumo บนหน้าผู้ดูแลระบบ) ระดับ _breadcrumb ของชุดรูปแบบดูเหมือนจะผิดที่จะทำเช่นนี้
Peter Murray

คำตอบ:


4

นี่เป็นตัวอย่างข้อมูลเพื่อแสดงวิธีที่คุณสามารถเปลี่ยนเกล็ดขนมปัง

โปรดจำไว้ว่า:

  • เมธอดนี้เปลี่ยน breadcrumbs ที่ระดับธีมซึ่งเป็นสถานที่สุดท้ายที่จะเปลี่ยนแปลงสิ่งใด ๆ ก่อนที่จะถึงเทมเพลตไฟล์ดังนั้นการเปลี่ยนแปลงที่นี่จะไม่อนุญาตให้โมดูลอื่นเปลี่ยน breadcrumbs ในภายหลัง
  • พิจารณาด้วยวิธีนี้เป็นตัวเลือกสุดท้ายในการเปลี่ยนเส้นทางของคุณ
  • เพิ่มตัวอย่างนี้ไปยังไฟล์ 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

อาจจะสายนิดหน่อยเพื่อตอบ แต่ฉันเจอกระทู้นี้เมื่อเช้านี้ในขณะที่มองหาวิธีที่จะแทนที่ breadcrumb ใน Drupal 7 มันช่วยได้เล็กน้อยฉันจึงคิดว่าฉันจะเพิ่มโซลูชันของฉัน

สิ่งนี้จะสร้าง crumbs พิเศษตามประเภทเนื้อหาและเพิ่มหน้าปัจจุบันไปที่ crumb ฉันใช้สิ่งนี้เพื่อเพิ่มเศษเล็กเศษน้อยลงในมุมมองการกรองที่เห็นก่อนโหนดที่กำหนด

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 เซ็นต์ของฉันต่อไป
สันติภาพ

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 () แทนได้ แต่จะต้องแยกวิเคราะห์ลิงก์ breadcrumb ที่คุณต้องการแก้ไข เนื่องจากในส่วนนี้ลิงก์ breadcrumb จะแสดงผลเป็น html อยู่แล้วดังนั้นคุณต้องใช้นิพจน์ทั่วไป (preg_match ()) หรือคล้ายกันเพื่อกำหนดเช่น url

ทางออกที่ดีกว่าคือการใช้หนึ่งในโมดูลการปรับแต่ง breadcrumb ที่หลากหลายที่ Drupal มีให้


2

นี่อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุด แต่ลอง:

function THEME_breadcrumb($variables)

แล้วอ่านตัวแปร

... ยังพระเจ้าของฉันฉันเกลียด breadcrumbs มากมาย.


1
ฉันเห็นสิ่งนี้ แต่ดูเหมือนจะไม่เป็น "วิธี Drupal" นี่เป็นเบ็ดธีมและดังนั้นจึงไม่ควรใช้เพื่อแก้ไขอินพุต
Jean-Michel Garcia

ฉันจะทำเช่นนี้เพราะวิธีอื่นไม่ทำงาน ฉันกำลังอัปเกรดคำถามของคุณ แต่ไม่ยอมรับ หวังว่าใครบางคนค้นหา "วิธีที่ถูกต้อง"
Jean-Michel Garcia

1

หากคุณต้องการเปลี่ยน breadcrumb ในหน้าใดหน้าหนึ่งโดยเฉพาะบางทีโซลูชันต่อไปนี้สามารถช่วยคุณได้ ตัวอย่างอัพเดต breadcrumb สำหรับฟอร์มแก้ไข

$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 เพื่ออัปเดต breadcrumb แต่ใน hook นี้คุณควรเปลี่ยน markup ของ breadcrumb ไม่ใช่ลิงก์


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 breadcrumb

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.