Mengubah isi remah roti

13

Saya mencoba menggunakan pengait ini untuk mengubah tautan remah roti:

hook_menu_breadcrumb_alter(&$active_trail, $item)

Pengait sepertinya tidak disebut.

Saya sudah mencoba:

  • Menggunakan kait pada sebuah tema
  • Menggunakan pengait pada modul khusus (breadcrumb_finder_fix)
  • Membersihkan semua cache menggunakan Drush

Saya memiliki modul Devel diinstal dan diaktifkan, dan berikut ini tidak menghasilkan output apa pun.

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

Ada ide? Petunjuk arah? Mohon saran.

OBS: Saya sudah membaca jawaban ini: /drupal//a/7659/12647

Jean-Michel Garcia
sumber
Saya mempunyai masalah yang sama. Saya telah membuat fungsi kait MYMODULE_menu_breadcrumb_alter (), mengaktifkan modul, membersihkan cache, dan kait sepertinya tidak pernah dipanggil pada halaman pengguna. Ironisnya, itu sepertinya dipanggil di halaman admin (saya mendapatkan output krumo di halaman admin). Level _breadcrumb () tema tampaknya merupakan tempat yang salah untuk melakukan ini.
Peter Murray

Jawaban:

4

Berikut ini cuplikan untuk menunjukkan bagaimana Anda dapat mengubah remah roti.

Ingatlah yang berikut:

  • Metode ini mengubah remah roti pada tingkat tema, yang merupakan tempat terakhir untuk mengubah apa pun sebelum mencapai file templat, jadi mengubah di sini tidak akan memungkinkan modul lain untuk mengubah remah roti nanti.
  • Pertimbangkan cara ini sebagai opsi terakhir untuk mengubah remah roti Anda.
  • Tambahkan potongan ini ke file template.php dari tema Anda.

    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
sumber
@ jean Saya telah melakukan beberapa perubahan, lihat itu (bukan di snippet), tapi di disclaimer
arpitr
13

Mungkin agak terlambat untuk merespons, tetapi saya menemukan utas ini pagi ini sambil mencari cara untuk menimpa remah roti di Drupal 7, itu sedikit membantu jadi saya pikir saya akan menambahkan solusi saya.

Ini membuat remah tambahan berdasarkan jenis konten dan menambahkan halaman saat ini ke remah. Saya menggunakan ini untuk menambahkan remah ke tampilan penyaringan yang terlihat sebelum node yang diberikan.

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
sumber
2
Ini sepertinya cara yang benar, tetapi itu tidak berhasil untuk saya. Ironisnya, ini berfungsi pada halaman admin, tetapi tidak berfungsi pada konten pengguna umum. Saran tentang cara men-debug?
Peter Murray
Saya memiliki masalah yang sama dengan @PeterMurray. Saya belum menyelesaikannya sepenuhnya, tetapi dari apa yang saya tahu sekarang, ini disebabkan oleh modul custom_breadcrumbs yang entah bagaimana menimpa tautan. 2 sen saya, sih.
Pax
9

hook_menu_breadcrumb_alter () tidak berfungsi pada halaman di mana drupal_set_breadcrumb () telah dipanggil sebelumnya.

hook_menu_breadcrumb_alter () dipanggil dari menu_get_active_breadcrumb () . Ini dipanggil dari drupal_get_breadcrumb () , tetapi hanya jika sebelumnya tidak ada breadcrumb yang disetel dengan drupal_set_breadcrumb () .

Itu tidak terlihat seperti drupal_set_breadcrumb () dipanggil dari halaman pengguna. Tapi mungkin ada modul contrib yang melakukan itu. Anda bisa meletakkan dpm () atau ddebug_backtrace () di drupal_set_breadcrumb () untuk melihat apakah ini masalahnya (perlu modul devel untuk diaktifkan, dan Anda memiliki izin untuk melihat informasi devel).

Anda bisa menggunakan hook_preprocess_breadcrumb (), tetapi ini membutuhkan penguraian tautan breadcrumb yang ingin Anda ubah. Karena dalam kait ini tautan breadcrumb sudah dirender sebagai html, jadi Anda perlu ekspresi reguler (preg_match ()) atau yang serupa untuk menentukan misalnya url.

Solusi yang jauh lebih baik adalah dengan menggunakan salah satu dari berbagai modul penyesuaian remah roti yang tersedia untuk Drupal.

donquixote
sumber
2

ini mungkin bukan cara yang paling efisien, tetapi cobalah:

function THEME_breadcrumb($variables)

dan kemudian baca variabelnya.

... juga tuhan saya, saya benci remah roti. sekali.

jdu
sumber
1
Saya melihat ini. Tapi sepertinya itu bukan "cara Drupal". Ini adalah pengait tema dan karena itu tidak boleh digunakan untuk memodifikasi input
Jean-Michel Garcia
Saya akan melakukannya karena cara lain tidak bekerja. Saya membatalkan pertanyaan Anda, tetapi tidak menerima. Berharap seseorang menemukan "jalan yang benar".
Jean-Michel Garcia
1

Jika Anda hanya perlu mengubah remah roti pada halaman tertentu, mungkin solusi berikut dapat membantu Anda. Contoh ini memperbarui remah roti untuk formulir edit.

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

Cara Drupal lain adalah untuk pengguna hook_menu_breadcrumb_altertetapi pastikan untuk menamainya YOUR_MODULE_menu_breadcrumb_alterdan menghapus cache setelah menambahkan fungsi.

Atau juga theme_breadcrumbmerupakan cara Drupal untuk memperbarui remah roti tetapi dalam kait ini Anda hanya harus mengubah markah roti, bukan tautan.

bogtan
sumber
0

yang THEME_NAME_breadcrumbtidak bekerja untuk saya. Namun, saya berhasil mengganti remah roti dengan fungsi ini:

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

kredit jatuh ke: /programming/10087168/how-to-add-breadcrumb

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

}

kode sebanyak ini cukup untuk memodifikasi url breadcrumb.

Nayana
sumber