ब्रेडक्रंब सामग्री को बदलना


13

ब्रेडक्रम्ब लिंक को बदलने के लिए मैं इस हुक का उपयोग करने की कोशिश कर रहा हूं:

hook_menu_breadcrumb_alter(&$active_trail, $item)

हुक नहीं कहा जाता है।

मैंने कोशिश की :

  • एक विषय पर हुक का उपयोग करना
  • कस्टम मॉड्यूल पर हुक का उपयोग करना (ब्रेडक्रंब_फाइंडर_फिक्स)
  • Drush का उपयोग करके सभी कैश को साफ़ करना

मेरे पास देवल मॉड्यूल स्थापित और सक्रिय है, और निम्नलिखित कोई आउटपुट नहीं देता है।

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 () हुक फ़ंक्शन बनाया है, मॉड्यूल को सक्षम किया है, कैश को साफ़ किया है, और हुक कभी भी उपयोगकर्ता पृष्ठों पर नहीं बुलाया गया लगता है। विडंबना यह है कि यह व्यवस्थापक पृष्ठों पर कहा जाता है (मुझे व्यवस्थापक पृष्ठों पर क्रामो आउटपुट मिलता है)। विषय का _breadcrumb () स्तर ऐसा करने के लिए गलत जगह है।
पीटर मूर्रे

जवाबों:


4

यहां यह दिखाने के लिए एक स्निपेट है कि आप ब्रेडक्रंब को कैसे बदल सकते हैं।

निम्नलिखित बातों का ध्यान रखें:

  • यह विधि थीम स्तर पर ब्रेडक्रंब को बदल देती है, जो टेम्पलेट फ़ाइलों तक पहुंचने से पहले किसी भी चीज को बदलने के लिए अंतिम स्थान है, इसलिए यहां बदलने से अन्य मॉड्यूल ब्रेडक्रंब को बाद में बदलने की अनुमति नहीं देंगे।
  • अपने ब्रेडक्रंब को बदलने के लिए अंतिम विकल्प के रूप में इस तरह से विचार करें।
  • इस स्निपेट को अपनी थीम की टेम्पलेट.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

13

शायद जवाब देने में थोड़ी देर हो गई, लेकिन मैं आज सुबह इस धागे के पार आया, जबकि ड्रुपल 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
यह सही तरीका लगता है, लेकिन यह मेरे लिए काम नहीं कर रहा है। विडंबना यह है कि यह व्यवस्थापक पृष्ठों पर काम करता है, लेकिन यह सामान्य उपयोगकर्ता सामग्री पर काम नहीं करता है। डिबग कैसे करें पर सुझाव?
पीटर मुर्रे

मुझे @PeterMurray जैसी ही समस्या है। मैंने इसे अभी तक पूरी तरह से हल नहीं किया है, लेकिन अभी जो मैं बता सकता हूं, यह कस्टम_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 की तरह नहीं दिखता है () उपयोगकर्ता पृष्ठ से कहा जाता है। लेकिन शायद एक कंट्रिब मॉड्यूल है जो ऐसा करता है। आप ड्रुपल_सेट_ब्रेडक्रम्ब () में यह देखने के लिए एक डीपीएम () या ddebug_backtrace () डाल सकते हैं कि क्या यह मामला है (डीवेल मॉड्यूल को सक्षम करने की आवश्यकता है, और आपको नई जानकारी देखने की अनुमति है)।

आप इसके बजाय hook_preprocess_breadcrumb () का उपयोग कर सकते हैं, लेकिन इसके लिए उस ब्रेडक्रंब लिंक को पार्स करना होगा जिसे आप बदलना चाहते हैं। क्योंकि इस हुक में ब्रेडक्रम्ब लिंक पहले से ही html के रूप में दिए गए हैं, इसलिए आपको उदाहरण के लिए url को निर्धारित करने के लिए नियमित अभिव्यक्ति (preg_match ()) या इसी तरह की आवश्यकता है।

एक बेहतर समाधान विभिन्न ब्रेडक्रंब-कस्टमाइज़िंग मॉड्यूल में से एक का उपयोग करना है जो ड्रुपल के लिए उपलब्ध हैं।


2

यह सबसे कुशल तरीका नहीं हो सकता है, लेकिन कोशिश करें:

function THEME_breadcrumb($variables)

और फिर चर पढ़ें।

... मेरे भगवान भी मैं ब्रेडक्रंब से नफरत करता हूं। बहुत ज्यादा।


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ब्रेडक्रंब को अपडेट करने के लिए एक ड्रुपल तरीका भी है लेकिन इस हुक में आपको केवल ब्रेडक्रंब के मार्कअप को बदलना चाहिए, लिंक को नहीं।


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


0

फ़ंक्शन MODULE_menu_breadcrumb_alter (और $ active_trail, $ आइटम) {

//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 को संशोधित करने के लिए पर्याप्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.