আপনি কিভাবে একটি রুটি কাটা বাস্তবায়ন করবেন?


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

আমি ড্রপাল ৮ টি ব্রেডক্র্যাম্বসে যে একমাত্র রাইটআপটি পেয়েছিলাম তা বন্ধ করে দিয়ে কাজ শুরু করেছি , তবে জিনিসটি মনে হচ্ছে যে এটি আর নেই এমন পিএসআর -4 অটোলয়েডিংয়ের একটি পুরানো সংস্করণ ব্যবহার করছে (রেকর্ডের জন্য আমি 8.0.0 এ আছি -দেব-বিটা 3), এবং তাই আমি কোডবেসে অন্যান্য সমস্ত মডিউল কীভাবে কাজ করে তা দেখে চলেছি।

মডিউলটি লোড করার জন্য আমি এখন এই সঠিকটি নিশ্চিত করছি; তবে আমি নিশ্চিত না

class BreadcrumbBuild extends BreadcrumbBuilderBase

সঠিক. সমস্যাটি হ'ল আমি যে পুরানো টিউটোরিয়ালটি যুক্ত করেছি তার সাথে প্রসারিত উল্লেখ রয়েছে BreadcrumbBuilderBase, তবে বর্তমানের নথিগুলি উল্লেখ করেছে বলে মনে হয় না এবং আমি ভাবছি যে এটির মেয়াদ শেষ হয়ে গেছে - এবং কীভাবে আমার এটি করা উচিত।

তেমনি, services.ymlফাইলটি এই ক্ষেত্রে কী করছে তা আমি সত্যিই বুঝতে পারি না , এর জন্য কোথাও কোনও দলিল নেই।

উত্তর:


8

হ্যাঁ ব্রেডক্রাম্ব পরিবর্তন হয়েছে এবং ডকুমেন্টেশন অবশ্যই আপডেট হতে হবে।

তেমনি, পরিষেবাদি.আইএমএল ফাইল এই ক্ষেত্রে কী করছে তা আমি সত্যিই বুঝতে পারি না, এর জন্য কোথাও কোনও দলিল নেই।

জন্য | ক্র্যাশ কোর্স: Drupal এর 8 ড্রুপালকন আমস্টারডাম 2014 , দুর্দান্ত উপস্থাপনা, প্রায় 47:02:

2 পদক্ষেপে 8 টি ড্রুপাল:

  1. একটি সরঞ্জাম তৈরি করুন
  2. এটি তারে আপ

তারের বিভিন্ন হতে পারে, পদ্ধতির একই।

আমরা কীভাবে ব্রেডক্রাম্বকে "ওয়্যার আপ করি":

জন্য http://www.palantir.net/blog/d8ftw-breadcrumbs-work :

এখন আমাদের ক্লাস সম্পর্কে সিস্টেমটি বলা দরকার। এটি করতে, আমরা একটি নতুন পরিষেবা সংজ্ঞায়িত করি (তাদের মনে রাখবেন?) আমাদের নতুন ক্লাসটি উল্লেখ করে। আমরা আমাদের * .services.yml ফাইলটিতে এটি করব, যা ঠিক এই উদ্দেশ্যে উপস্থিত রয়েছে

পূর্ববর্তী দ্রুপাল সংস্করণগুলিতে একটি "ইনফো হুক" এর মতো, আমরা মাইমডিউল.ব্রেডক্রাম্ব নামের একটি পরিষেবা সংজ্ঞায়িত করছি। এটি আমাদের ব্রেডক্রাম্ব ক্লাসের উদাহরণ হবে। প্রয়োজনে আমরা আমাদের ক্লাসের কনস্ট্রাক্টরের সাথে যুক্তিগুলিও পাস করতে পারি। গুরুত্বপূর্ণ, যদিও, আমরা পরিষেবাটি ট্যাগ করি। ট্যাগ করা পরিষেবাগুলি বিশেষত সিমফনি নির্ভরতা ইন্জেকশন উপাদানটির একটি বৈশিষ্ট্য এবং সিস্টেমটিকে আমাদের বিল্ডারকে স্বয়ংক্রিয়ভাবে ব্রেডক্রাম্ব ম্যানেজারের সাথে সংযোগ করতে বলে। অগ্রাধিকারটি নির্দিষ্ট করে যে বিভিন্ন বিল্ডারকে কী অর্ডার করা উচিত, সর্বোচ্চ first যদি দুটি প্রয়োগ হয় () পদ্ধতি উভয়ই সত্য হতে পারে তবে যে কোনও বিল্ডারের উচ্চতর অগ্রাধিকার থাকবে তা ব্যবহার করা হবে এবং অন্যটি অগ্রাহ্য করা হবে।

আপনার লক্ষ্যটির জন্য আপনি এই কোডটি ব্যবহার করতে পারেন:

কাঠামো (বেশি কিছু নয়):

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

মনে রাখবেন, শেষে ক্যাশে পরিষ্কার করুন।


এখন পর্যন্ত কোনও আনন্দ নেই। আমি বাস্তবে কার্যনির্বাহীটিকে যথাযথভাবে অনুলিপি করেছিলাম যত তাড়াতাড়ি সম্ভব প্রয়োগযোগ্য প্রয়োগ হয়েছে (আমি প্রয়োগ করতে পারি) পদ্ধতি থেকে এটি ডিপিএম ('টেস্ট') বলতে পারি এবং এটি আউটপুট দেয় But তবে আমার কোডে এটি নয়; এমনকি উদ্দেশ্যমূলক সিনট্যাক্স ত্রুটিও নয় প্রদর্শিত - যার ফলে, আমাকে আবার সন্দেহ সেবা রাউটিং সঠিক নয় কিন্তু আমার yaml বৈধ ... দীর্ঘশ্বাস :(।
njp

1
@njp আপনার Breadcrumb বর্গের পথ পর্যালোচনা করুন (আমি একটি ফোল্ডার Breadcrumb যুক্ত করি) এবং এটি অবশ্যই আপনার পরিষেবা ফাইলে "বর্গ" প্যারামিটারের সাথে মেলে। ক্লাসের সমস্ত নামের জন্য খুব চেক করুন, কিছু ফাইল বা প্যারামিটারে কখনও কখনও মিলবে না।
rpayanm

1
অভিনন্দন! একটি প্রশ্ন: আপনি পরিবর্তনগুলি পরে "ক্যাশে সাফ" করেছিলেন? সম্ভবত এটি হতে পারে।
rPayanm

1
হ্যাঁ, আপনাকে ক্যাশে সাফ করতে হবে, পরিষেবাগুলি আপডেট করার জন্য এটি যথেষ্ট হওয়া উচিত। এছাড়াও, উল্লেখযোগ্য যে একটি হতে পারে অগ্রাধিকার হয়। প্রযোজ্য () থেকে সত্য ফেরত দেওয়া প্রথম নির্মাতা জিতে যাচ্ছে, সুতরাং আপনাকে সেই ট্যাগ (যা একটি সহজ পাঠ্য অনুসন্ধান) সহ অন্যান্য পরিষেবাদি অনুসন্ধান করতে হবে এবং তাদের ওজন পরীক্ষা করতে হবে এবং প্রয়োগগুলি প্রয়োগ করতে হবে।
বারদির

1
বিপরীতে @ এনজেপি, অগ্রাধিকারটি নির্দিষ্ট করে যে বিভিন্ন নির্মাতাকে কী আদেশ করা উচিত, সর্বোচ্চ first যদি দুটি প্রয়োগ হয় () পদ্ধতি উভয়ই সত্য হতে পারে তবে যে কোনও বিল্ডারের উচ্চ অগ্রাধিকার থাকবে তা ব্যবহার করা হবে এবং অন্যটি অগ্রাহ্য করা হবে।
rayanm

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

এই ক্যাচিংয়ের সমস্যাটি আমাকে বাদাম চালিয়ে যাচ্ছিল এবং ব্লগ ইত্যাদিতে অনলাইনে প্রচুর তথ্য এই পয়েন্টটি মিস করতে পারে - ধন্যবাদ!
কেব্রিনার

8

আপডেট 2016 ড্রুপাল 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 }

PS: আপনি যদি বুটস্ট্র্যাপ ব্যবহার করছেন তবে আপনার /admin/appearance/settingsসেটিংস পৃষ্ঠায় যান এবং ব্রেডক্র্যাম্বস সেটিংসটি দেখুন। Show 'Home' breadcrumb linkচেক করা উচিত। এবং Show current page title at endচেক করা উচিত।

এত কিছুর পরে আপনার ক্যাশে সাফ করুন। আপনি যখনই কোনও ওয়াইএমএল ফাইল পরিবর্তন করেন, এমনকি ডিবাগ মোডেও আপনাকে আপনার ক্যাশে সাফ করা দরকার। /core/rebuild.phpআটকে গেলে এবং পুনর্নির্মাণ না করতে পারলে আপনি যেতে পারেন।


7

ক্যাচিং ভুলবেন না

ডি 8 বিকাশ চক্রটিতে রেন্ডার ক্যাশে মোটামুটি দেরিতে পরিবর্তিত হয়েছিল, এবং তাই এটি ডি 8 ফুটড সিরিজ বা এই প্রশ্নের অন্যান্য উত্তরগুলিতে উল্লেখ করা হয়নি।

ক্যাশে এপিআই ডকুমেন্টেশন বিশেষভাবে উল্লেখ অ্যারে রেন্ডার করতে, কিন্তু সেসব নির্দেশাবলীর সব ব্রেডক্রাম্ব সমানভাবে প্রযোজ্য। ব্রেডক্রাম্ব একটি আছে toRenderable()পদ্ধতি, Drupal এর তাদের ক্যাশে রেন্ডার মধ্যে ক্যাশে করার চেষ্টা করবে, এবং তার মানে কি উচিত নয় Drupal এর এটি সঠিকভাবে করতে অনুমতি দেয় যথেষ্ট তথ্য উল্লেখ করুন।

বিশদটি ডক্সে রয়েছে তবে সংক্ষিপ্ত সংস্করণটি এটি Breadcrumbপ্রয়োগ করে RefinableCachableDependencyInterface। আপনার বিল্ডার শ্রেণিতে, আপনি addCachableDependency()ব্রেডক্রাম্ব তৈরির জন্য ব্যবহৃত যে কোনও এবং সমস্ত সত্ত্বা বা কনফিগারেশন অবজেক্টের সাথে কল করতে চান । 'ক্যাশেবল ডিপেন্ডেনসিআই ইন্টারফেস এবং ফ্রেন্ডস' এর ডকুমেন্টেশন কীভাবে এবং কেন তার আরও বিশদে যায়।

যদি এমন অন্যান্য প্রসঙ্গে থাকে যেখানে ব্রেডক্রাম্ব পরিবর্তন হতে পারে তবে আপনাকে 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() 
   );
  }
}

এবং তারপরে আপনার থিমের টেম্পলেট ফোল্ডারে অন্য একটি ফাইল তৈরি করুন যার নাম "ব্রেডক্রাম্বইচটিএমএল.টুইগ" রয়েছে এবং এই ফাইলে কোডের নীচে রাখুন:

{% 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 ফোল্ডার থেকে কোডটি টানতে পারেন। আপনি ড্রুপাল 8 টি ব্রেডক্র্যাম্বস সম্পর্কে আরও বিশদ এখানে পেতে পারেন: http://www.gregboggs.com/drupal8-breadcrumbs/


এটি এতটাই হতাশাব্যঞ্জক যে এটির মতো সহজ কিছুতে এটির জন্য অবদানের মডিউলগুলি ধরতে হবে
কেভিন

যেমন ড্রুপাল উপায়। যদিও ড্রুপাল 8 এখন মূলত একটি টন করে যা দ্রুপাল 7 কখনও করেনি। আমি কোর ড্রুপাল ৮ টি ব্রেডক্র্যাম্বস ঠিক করতে পারতাম যদি পারতাম। কিন্তু, drush en current_page_crumbএতটা খারাপ নয়।
গ্রেগ বোগস

0

আমি ড্রুপাল in-তে টোকেন ব্যবহার করে কাস্টম ব্রেডক্রাম্ব ব্যবহার করেছি এবং যখন সেই মডিউলটি দ্রুপাল 8-র জন্য উপলব্ধ ছিল না তখন আমি মূলত টোকেন ক্ষেত্রের ক্ষেত্রগুলি ব্যবহার করে আমার পৃথক সামগ্রীর ধরণের জন্য দৃষ্টিভঙ্গি তৈরি করে শেষ করেছি। এটি একটি ব্লক হিসাবে ব্যবহার করে এবং সাধারণ ব্রেডক্রাম্ব অক্ষম করে। এটি কাস্টম ব্রেডক্র্যাম্বসের চেয়ে কিছুটা বেশি কাজ ছিল তবে এটি কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.