आप एक ब्रेडक्रम्ब कैसे लागू करते हैं?


18

मैंने एक नए ब्रेडक्रंब ओवरराइड को परिभाषित करने की कोशिश की है, लेकिन मुझे अभी भी साइट डिफ़ॉल्ट मिल रही है।

मैंने एक कस्टम मॉड्यूल बनाया है, foo_breadcrumb:

   - modules/custom/foo_breadcrumb
     - foo_breadcrumb.info.yml
     - foo_breadcrumb.services.yml
     - src/
         - BreadcrumbBuild.php

यहाँ है foo_breadcrumb.services.yml:

services:
    foo_breadcrumb.breadcrumb:
        class: Drupal\foo_breadcrumb\BreadcrumbBuild
        tags:
            - { name: breadcrumb_builder, priority: 100 }

अंदर src/BreadcrumbBuild.php, मेरे पास है:

<?php

namespace Drupal\foo_breadcrumb;

use Drupal\Core\Breadcrumb\BreadcrumbBuilderBase;

class BreadcrumbBuild implements BreadcrumbManager {
    /**
     * {@inheritdoc}
     */
    public function applies(array $attributes) {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function build(array $attributes) {
        $breadcrumb[] = $this->l($this->t('Test'), NULL);
        $breadcrumb[] = $this->l($this->t('Test2'), 'test');
        return $breadcrumb;
    }
}
?>

मैंने ड्रुपल 8 ब्रेडक्रंब पर मिलने वाले एकमात्र राइटअप से काम करना शुरू कर दिया , लेकिन बात यह है कि यह PSR-4 के पुराने संस्करण का उपयोग करता प्रतीत होता है, जो कि अब ऑटोलिडिंग नहीं है (रिकॉर्ड के लिए मैं 8.0.0 पर हूं) -देव-बीटा 3), और इसलिए मैं कोडबेस में अन्य सभी मॉड्यूल कैसे काम करता हूं, इसके बारे में बताता हूं।

मॉड्यूल लोड करने के लिए सही होने के लिए अब मुझे यह निश्चित है; हालाँकि मुझे यकीन नहीं है कि अगर

class BreadcrumbBuild extends BreadcrumbBuilderBase

सही है। समस्या यह है कि मैं जिस पुराने ट्यूटोरियल से जुड़ा था BreadcrumbBuilderBaseउसका विस्तार किया जा रहा है , लेकिन अधिक वर्तमान डॉक्स इसका उल्लेख नहीं करते हैं और मुझे आश्चर्य है कि अगर यह पुराना है - और मुझे यह कैसे करना चाहिए।

इसी तरह, मैं वास्तव में यह नहीं समझता कि services.ymlइस संबंध में फाइल क्या कर रही है, इसके लिए कहीं भी कोई दस्तावेज नहीं है।

जवाबों:


8

हाँ ब्रेडक्रंब बदल गया है और प्रलेखन अद्यतन होना चाहिए।

इसी तरह, मैं वास्तव में समझ में नहीं आता है कि इस संबंध में services.yml फ़ाइल क्या कर रही है, इसके लिए कहीं भी कोई दस्तावेज नहीं है।

के लिए | क्रैश कोर्स: Drupal 8 DrupalCon एम्स्टर्डम 2014 , भयानक प्रस्तुति, 47:02 के बारे में:

2 चरणों में ड्रुपल 8:

  1. एक उपकरण बनाएँ
  2. इसे तार दें

वायरिंग भिन्न हो सकती है, दृष्टिकोण समान है।

हम ब्रेडक्रंब को "वायर इट अप" कैसे करते हैं:

के लिए http://www.palantir.net/blog/d8ftw-breadcrumbs-work :

अब हमें अपनी कक्षा के बारे में प्रणाली बताने की आवश्यकता है। ऐसा करने के लिए, हम अपनी नई कक्षा को संदर्भित करते हुए एक नई सेवा परिभाषित करते हैं (उन्हें याद रखें?)। हम अपनी * .services.yml फ़ाइल में ऐसा करेंगे, जो वास्तव में इस उद्देश्य के लिए मौजूद है

पिछले Drupal संस्करणों में "जानकारी हुक" के समान, हम mymodule.breadcrumb नामक एक सेवा को परिभाषित कर रहे हैं। यह हमारे ब्रेडक्रंब वर्ग का एक उदाहरण होगा। यदि आवश्यक हो तो हम अपने वर्ग के निर्माता के साथ भी तर्क पारित कर सकते हैं। महत्वपूर्ण रूप से, हालांकि, हम सेवा को भी टैग करते हैं। टैग की गईं सेवाएं विशेष रूप से सिम्फनी डिपेंडेंसी इंजेक्शन घटक की एक विशेषता हैं और सिस्टम को स्वचालित रूप से हमारे बिल्डर को ब्रेडक्रंब प्रबंधक से कनेक्ट करने के लिए बताती हैं। प्राथमिकता निर्दिष्ट करती है कि किस क्रम में विभिन्न बिल्डरों को बुलाया जाना चाहिए, सबसे पहले। मामले में दो लागू होते हैं () विधियां दोनों सही हो सकती हैं, जो भी बिल्डर की उच्च प्राथमिकता है उसका उपयोग किया जाएगा और दूसरे को अनदेखा किया जाएगा।

आप इस कोड का उपयोग आपके लिए कर सकते हैं:

संरचना (बहुत ज्यादा नहीं):

- modules/custom/foo_breadcrumb
  - foo_breadcrumb.info.yml
  - foo_breadcrumb.services.yml
  - src/
    - Breadcrumb/
      - BlogBreadcrumbBuilder.php

foo_breadcrumb.services.yml:

services:
  foo_breadcrumb.breadcrumb_blog:
    class: Drupal\foo_breadcrumb\Breadcrumb\BlogBreadcrumbBuilder
    tags:
      - { name: breadcrumb_builder, priority: 100 }

BlogBreadcrumbBuilder.php:

class BlogBreadcrumbBuilder implements BreadcrumbBuilderInterface {
  use StringTranslationTrait;
  use LinkGeneratorTrait;

  /**
   * @inheritdoc
   */
  public function applies(RouteMatchInterface $route_match) {
    // This breadcrumb apply only for all articles
    $parameters = $route_match->getParameters()->all();
    if (isset($parameters['node'])) {
      return $parameters['node']->getType() == 'article';
    }
  }

  /**
   * @inheritdoc
   */
  public function build(RouteMatchInterface $route_match) {
    $breadcrumb = [Link::createFromRoute($this->t('Home'), '<front>')];
    $breadcrumb[] = Link::createFromRoute($this->t('Blog'), '<<<your route for blog>>>');
    return $breadcrumb;
  }
}

याद रखें, अंत में स्पष्ट कैश।


अब तक कोई खुशी नहीं हुई। मैंने वास्तव में जितना संभव हो उतना मुख्य रूप से टैक्सोनॉमी की नकल की, क्योंकि इसमें एक कार्यशील कार्यान्वयन था (मैं लागू () विधि से dpm ('टेस्ट') कह सकता हूं और यह आउटपुट देगा। लेकिन मेरे कोड में ऐसा नहीं है, जानबूझकर वाक्यविन्यास त्रुटियां भी नहीं हैं। प्रकट - जो मुझे संदेह करता है कि सेवा मार्ग सही नहीं है। लेकिन मेरा याम वैध है ... आह :(
njp

1
@njp आप ब्रेडक्रंब क्लास के पथ की समीक्षा करें (मैं एक फ़ोल्डर ब्रेडक्रंब जोड़ता हूं) और यह आपको सर्विस फाइल पर "क्लास" पैरामीटर के साथ मेल खाना चाहिए। वर्ग के सभी नामों की जाँच करें, कभी-कभी कुछ फ़ाइल या मापदंडों में मेल नहीं खाते।
rpayanm

1
बधाई हो! एक सवाल: क्या आपने संशोधनों के बाद "स्पष्ट कैश" किया? शायद ऐसा हो सकता है।
rpayanm

1
हां, आपको कैश साफ़ करने की आवश्यकता है, जो सेवाओं को अपडेट करने के लिए पर्याप्त होना चाहिए। इसके अलावा, जो उल्लेख के लायक हो सकता है वह प्राथमिकता है। TRUE से लागू होने वाला (रिटर्न) जीतने वाला पहला बिल्डर जीतने वाला है, इसलिए आपको उस टैग के साथ अन्य सेवाओं की खोज करने की आवश्यकता हो सकती है (जो एक आसान पाठ खोज है) और उनके वजन की जाँच करें और लागू करें () लागू करें।
बरादिर

1
@ इसके विपरीत, प्राथमिकता यह निर्दिष्ट करती है कि किस क्रम में विभिन्न बिल्डरों को बुलाया जाना चाहिए, सबसे पहले। मामले में दो लागू होते हैं () विधियां दोनों सही हो सकती हैं, जो भी बिल्डर की उच्च प्राथमिकता है उसका उपयोग किया जाएगा और दूसरे को अनदेखा किया जाएगा।
rpayanm

10

चलो हम फिरसे चलते है। ये जवाब ज्यादातर सही हैं। एक चीज जिसके बारे में आप नहीं भूल सकते, वह है "कैश टैग" और "कैश संदर्भ"।

मैं एक नोड पर ब्रेडक्रंब के रूप में एक टैक्सोनॉमी शब्द सेट कर रहा था।

मुझे इस पोस्ट से सलाह लेकर काम करना पड़ा, लेकिन फिर मैंने चारों ओर क्लिक किया और हर पेज पर उसी ब्रेडक्रंब को देखा।

लंबी कहानी छोटी, कुछ कैश संदर्भ और टैग सेट करना सुनिश्चित करें।

यहाँ एक जिस्ट में मेरी सेवा है: https://gist.github.com/jonpugh/ccaeb01e173abbc6c88f7a332d271e4a

यहाँ मेरा निर्माण () विधि है:

/**
 * {@inheritdoc}
 */
public function build(RouteMatchInterface $route_match) {
  $node = $route_match->getParameter('node');
  $breadcrumb = new Breadcrumb();

  // By setting a "cache context" to the "url", each requested URL gets it's own cache.
  // This way a single breadcrumb isn't cached for all pages on the site.
  $breadcrumb->addCacheContexts(["url"]);

  // By adding "cache tags" for this specific node, the cache is invalidated when the node is edited.
  $breadcrumb->addCacheTags(["node:{$node->nid->value}"]);

  // Add "Home" breadcrumb link.
  $breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));

  // Given we have a taxonomy term reference field named "field_section", and that field has data,
  // Add that term as a breadcrumb link.
  if (!empty($node->field_section->entity)) {
    $breadcrumb->addLink($node->field_section->entity->toLink());
  }
  return $breadcrumb;
}

यह कैशिंग मुद्दा मुझे पागल कर रहा था और ब्लॉग आदि में बहुत सारी जानकारी इस बिंदु पर याद आती है - धन्यवाद!
kbrinner

8

अद्यतन 2016 Drupal 8

दस्तावेज़ में कहा गया है कि आपको ब्रेडक्रम्ब क्लास का एक उदाहरण वापस करना होगा। अगर आपको काम करने में परेशानी हो रही है। यहाँ समाधान है कि मेरे लिए काम किया है।

<?php

//modules/MY_MODULE/src/MyBreadcrumbBuilder.php

namespace Drupal\registration;

use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Breadcrumb\Breadcrumb;
use Drupal\Core\Link;

class MyBreadcrumbBuilder implements BreadcrumbBuilderInterface {

    /**
     * @inheritdoc
     */
    public function applies(RouteMatchInterface $route_match) {
        /* Allways use this. Change this is another module needs to use a new custom breadcrumb */
        return true;
        /* This code allows for only the registration page to get used by this breadcrumb
         * $parameters = explode('.', $route_match->getRouteName());
         * if ($parameters[0] === 'registration') {
         *     return true;
         * } else {
         *     return false;
         * }
         */
    }

    /**
     * @inheritdoc
     */
    public function build(RouteMatchInterface $route_match) {
        $parameters = explode('.', $route_match->getRouteName());
        $b = new Breadcrumb();
        if ($parameters[0] === 'registration') {
            /* If registration page use these links */
            $b->setLinks($this->buildRegistration($parameters[1]));
        }
        return $b;
    }

    /**
     * Creates all the links for the registration breadcrumb
     * @param type $page
     * @return type
     */
    private function buildRegistration($page) {
        return [
            Link::createFromRoute(t('Step One'), 'registration.one'),
            Link::createFromRoute(t('Step Two'), 'registration.two'),
            Link::createFromRoute(t('Step Three'), 'registration.three'),
            Link::createFromRoute(t('Step Four'), 'registration.four'),
            Link::createFromRoute(t('Step Five'), 'registration.five'),
            Link::createFromRoute(t('Step Six'), 'registration.six'),
            Link::createFromRoute(t('Step Seven'), 'registration.seven')
        ];
    }

}

फिर yml फ़ाइल

# modules/MY_MODULE/registration/MY_MODULE.services.yml
services:
  registration.breadcrumb:
    class: Drupal\registration\MyBreadcrumbBuilder
    tags:
      - { name: breadcrumb_builder, priority: 100 }

पुनश्च: यदि आप बूटस्ट्रैप का उपयोग कर रहे हैं तो अपने /admin/appearance/settingsसेटिंग पृष्ठ पर जाएं और ब्रेडक्रंब सेटिंग देखें। Show 'Home' breadcrumb linkपर जाँच होनी चाहिए। और Show current page title at endजांच की जानी चाहिए।

आखिरकार यह आपके कैश को साफ कर देता है। हर बार जब आप YML फ़ाइल बदलते हैं, तब भी डिबग मोड में, आपको अपना कैश साफ़ करना होगा। आप के लिए जा सकते /core/rebuild.phpयदि आप अटक जाते हैं और पुनर्निर्माण नहीं कर सकता।


7

कैशिंग मत भूलना

D8 विकास चक्र में रेंडर कैश को काफी देर से बदल दिया गया था, और इसलिए इसे d8ftw श्रृंखला में उल्लेख नहीं किया गया है, या इस प्रश्न के अन्य उत्तर हैं।

कैश API दस्तावेज़ विशेष रूप से संदर्भित करता है सरणियों रेंडर करने के लिए, लेकिन उन निर्देशों के सभी ब्रेडक्रंब के लिए समान रूप से लागू होते हैं। ब्रेडक्रंब की एक toRenderable()विधि है, ड्रुपल उन्हें रेंडर कैश में कैश करने की कोशिश करेगा, और इसका मतलब है कि आपको ड्रुपल को ठीक से करने की अनुमति देने के लिए पर्याप्त जानकारी निर्दिष्ट करनी होगी

विवरण डॉक्स में हैं, लेकिन संक्षिप्त संस्करण यह है कि इसे Breadcrumbलागू करता है RefinableCachableDependencyInterface। अपने बिल्डर वर्ग में, आप addCachableDependency()ब्रेडक्रंब के निर्माण के लिए उपयोग की जाने वाली किसी भी और सभी संस्थाओं या कॉन्फ़िगरेशन ऑब्जेक्ट के साथ कॉल करना चाहेंगे । 'CacheableD dependencyInterface और दोस्तों' के लिए प्रलेखन कैसे और क्यों के अधिक विस्तार में जाता है।

यदि अन्य संदर्भ हैं, जहां ब्रेडक्रम्ब बदल सकता है, तो आपको यह addCacheContexts()सुनिश्चित करने के लिए मैन्युअल रूप से उपयोग करना होगा कि ब्लॉक भिन्न होता है, addCacheTags()यह सुनिश्चित करने के लिए कि कैश प्रविष्टि को सही तरीके से अमान्य किया जा सकता है, और mergeCacheMaxAge()यदि कैश समय-संवेदनशील है और समाप्त होने की आवश्यकता है।

यदि यह ठीक से नहीं किया गया है, तो आपके कस्टम ब्रेडक्रंब बिल्डर सेवाओं में से एक 'जीत' होगा, और उस विशिष्ट पेज के लिए ब्रेडक्रंब हर पृष्ठ पर, सभी आगंतुकों को, हमेशा के लिए परोसा जाएगा।


4

इसे प्राप्त करने का एक और तरीका है।

/**
 * Implements hook_preprocess_breadcrumb().
 */
 function theme_name_preprocess_breadcrumb(&$variables){
  if(($node = \Drupal::routeMatch()->getParameter('node')) && $variables['breadcrumb']){
    $variables['breadcrumb'][] = array(
     'text' => $node->getTitle() 
   );
  }
}

और फिर अपने विषय के टेम्पलेट फ़ोल्डर में एक और फ़ाइल बनाएं जिसका नाम "ब्रेडक्रंब.html.twig" है और इस फ़ाइल में नीचे कोड डालें:

{% if breadcrumb %}
  <nav class="breadcrumb" role="navigation" aria-labelledby="system-breadcrumb">
    <h2 id="system-breadcrumb" class="visually-hidden">{{ 'Breadcrumb'|t }}</h2>
    <ul>
    {% for item in breadcrumb %}
      <li>
        {% if item.url %}
          <a href="{{ item.url }}">{{ item.text }}</a>
        {% else %}
          {{ item.text }}
        {% endif %}
      </li> /
    {% endfor %}
    </ul>
  </nav>
{% endif %}

बस। अब कैश फ्लश करें और आपको वर्तमान पृष्ठ शीर्षक जैसे होम / करंट पेज शीर्षक के साथ ब्रेडक्रम्ब मिलेगा। आप "/" को वांछित के साथ बदलकर विभाजक को बदल सकते हैं।


2

ब्रेडक्रम्ब में करंट पेज का शीर्षक जोड़ने के लिए आपको एक कंट्रिब मॉड्यूल का उपयोग करना चाहिए जैसे करंट पेज क्रम्ब: https://www.drupal.org/project/current_page_crumb

यदि इसे हाथ से-कोड करना चाहते हैं, तो आप उस मॉड्यूल के src फ़ोल्डर से कोड खींच सकते हैं। आप Drupal 8 breadcrumbs के बारे में और जानकारी यहाँ प्राप्त कर सकते हैं: http://www.gregboggs.com/drupal8-breadersrum/


यह इतना निराशाजनक है कि कुछ सरल के रूप में इसे जोड़ने के लिए कंट्रिब मॉड्यूल को हथियाने की आवश्यकता होती है।
केविन

ऐसा द्रुपाल तरीका है। हालाँकि Drupal 8 अब कोर में एक TON करता है जो Drupal 7 ने कभी नहीं किया। मैं कोर ड्रुपल 8 ब्रेडक्रंब को कोर में ठीक कर दूंगा अगर मैं कर सकता था। लेकिन, drush en current_page_crumbइतना बुरा नहीं है।
ग्रेग बोग्स

0

मैंने Drupal 7 में टोकन का उपयोग करके कस्टम ब्रेडक्रंब का उपयोग किया था और जब वह मॉड्यूल Drupal 8 के लिए उपलब्ध नहीं था, तो मैंने मूल रूप से टोकन फ़ील्ड वाले फ़ील्ड का उपयोग करके अपने व्यक्तिगत सामग्री प्रकारों के लिए विचार बनाना समाप्त कर दिया था। इसे ब्लॉक के रूप में उपयोग करना और सामान्य ब्रेडक्रंब को अक्षम करना। यह कस्टम ब्रेडक्रंब की तुलना में थोड़ा अधिक काम था लेकिन यह काम करता है।

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