Làm thế nào để bạn thực hiện một vụn bánh mì?


18

Tôi đã cố gắng xác định ghi đè bánh mì mới, nhưng tôi vẫn nhận được mặc định trang web.

Tôi đã tạo một mô-đun tùy chỉnh, foo_breadcrumb:

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

Đây là foo_breadcrumb.services.yml:

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

Bên trong src/BreadcrumbBuild.php, tôi có:

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

Tôi đã bắt đầu thực hiện bài viết duy nhất tôi có thể tìm thấy trên mẩu bánh mì Drupal 8 , nhưng có vẻ như nó đang sử dụng một phiên bản cũ hơn của tính năng tự động tải PSR-4 không còn nữa (đối với bản ghi tôi đang trên 8.0.0 -dev-beta3), và vì vậy tôi đã tìm hiểu cách tất cả các mô-đun khác hoạt động trong cơ sở mã.

Bây giờ tôi khá chắc chắn điều này đúng để tải mô-đun; tuy nhiên tôi không chắc nếu

class BreadcrumbBuild extends BreadcrumbBuilderBase

đúng. Vấn đề là hướng dẫn cũ mà tôi liên kết với đề cập đến từ đó BreadcrumbBuilderBase, nhưng các tài liệu hiện tại dường như không đề cập đến nó và tôi tự hỏi liệu nó đã lỗi thời - và tôi nên làm điều này như thế nào.

Tương tự như vậy, tôi không thực sự hiểu những gì services.ymltập tin đang làm về vấn đề này, không có tài liệu nào cho việc này.

Câu trả lời:


8

Yeah Breadcrumb đã thay đổi và tài liệu phải được cập nhật.

Tương tự như vậy, tôi không thực sự hiểu tập tin services.yml đang làm gì về vấn đề này, không có tài liệu nào cho việc này.

Đối với Drupal 8: Khóa học sụp đổ | DrupalCon Amsterdam 2014 , bài thuyết trình tuyệt vời, khoảng 47:02:

Drupal 8 trong 2 bước:

  1. Xây dựng một công cụ
  2. Dây nó lên

Hệ thống dây có thể khác nhau, cách tiếp cận là như nhau.

Làm thế nào chúng ta "Dây nó lên" vụn bánh mì:

Đối với http://www.palantir.net/blog/d8ftw-breadcrumbs-work :

Bây giờ chúng tôi cần nói với hệ thống về lớp học của chúng tôi. Để làm điều đó, chúng tôi định nghĩa một dịch vụ mới (nhớ những dịch vụ đó?) Tham chiếu lớp mới của chúng tôi. Chúng tôi sẽ làm điều đó trong tệp * .service.yml của chúng tôi, tồn tại cho chính xác mục đích này

Tương tự như "móc thông tin" trong các phiên bản Drupal trước đây, chúng tôi đang xác định một dịch vụ có tên mymodule.breadcrumb. Nó sẽ là một ví dụ của lớp Breadcrumb của chúng tôi. Nếu cần, chúng ta cũng có thể truyền đối số cho hàm tạo của lớp chúng ta. Điều quan trọng, mặc dù, chúng tôi cũng gắn thẻ dịch vụ. Các dịch vụ được gắn thẻ là một tính năng của thành phần Symfony DependencyInjection cụ thể và báo cho hệ thống tự động kết nối trình tạo của chúng tôi với trình quản lý Breadcrumb. Ưu tiên chỉ định theo thứ tự các nhà xây dựng khác nhau nên được gọi, cao nhất trước tiên. Trong trường hợp hai phương thức áp dụng () có thể trả về đúng, bất kỳ phương thức xây dựng nào có mức ưu tiên cao hơn sẽ được sử dụng và phương thức còn lại bị bỏ qua.

Bạn có thể sử dụng mã này cho mục tiêu của bạn:

Cấu trúc (không quan trọng lắm):

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

foo_breadcrumb.service.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;
  }
}

Hãy nhớ, xóa bộ nhớ cache ở cuối.


Không có niềm vui cho đến nay. Tôi thực sự đã sao chép phân loại trong lõi càng chặt chẽ càng tốt vì điều này đã có một triển khai hoạt động (tôi có thể gọi dpm ('Test') từ phương thức áp dụng () và nó sẽ xuất ra. Nhưng trong mã của tôi, thậm chí không phải lỗi cú pháp cố ý xuất hiện - điều này khiến tôi nghi ngờ việc định tuyến dịch vụ không chính xác. Nhưng yaml của tôi là hợp lệ ... thở dài :(
njp

1
@njp xem lại đường dẫn của lớp Breadcrumb (tôi thêm thư mục Breadcrumb) và nó phải khớp với tham số "class" trên tệp dịch vụ của bạn. Quá kiểm tra tất cả các tên của lớp, đôi khi không khớp trong một số tệp hoặc tham số.
rpayanm

1
Chúc mừng! Một câu hỏi: bạn đã "xóa bộ nhớ cache" sau khi sửa đổi chưa? Có lẽ nó có thể là như vậy.
rpayanm 11/03/2015

1
Có, bạn cần xóa bộ nhớ cache, điều đó là đủ để cập nhật các dịch vụ. Ngoài ra, một điều có thể đáng nói là ưu tiên. Trình xây dựng đầu tiên trả về TRUE từ áp dụng () sẽ giành chiến thắng, vì vậy bạn có thể cần tìm kiếm các dịch vụ khác với thẻ đó (đó là một tìm kiếm văn bản dễ dàng) và kiểm tra trọng lượng của chúng và áp dụng ().
Berdir 11/03/2015

1
@njp thì ngược lại, mức độ ưu tiên chỉ định theo thứ tự các nhà xây dựng khác nhau nên được gọi, cao nhất trước tiên. Trong trường hợp hai phương thức áp dụng () có thể trả về đúng, bất kỳ phương thức xây dựng nào có mức ưu tiên cao hơn sẽ được sử dụng và phương thức còn lại bị bỏ qua.
rpayanm

10

Chúng ta lại đi. Những câu trả lời này hầu hết là đúng. Một điều bạn không thể quên là "thẻ bộ nhớ cache" và "bối cảnh bộ đệm".

Tôi đã thiết lập một thuật ngữ phân loại trên một nút như một mẩu bánh mì.

Tôi đã làm cho nó hoạt động với lời khuyên từ bài đăng này, nhưng sau đó tôi đã nhấp xung quanh và nhận thấy cùng một mẩu bánh mì trên mỗi trang.

Câu chuyện dài, hãy đảm bảo đặt một số bối cảnh và thẻ bộ nhớ cache.

Đây là dịch vụ của tôi trong một ý chính: https://gist.github.com/jonpugh/ccaeb01e173abbc6c88f7a332d271e4a

Đây là phương thức build () của tôi:

/**
 * {@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;
}

Vấn đề bộ nhớ đệm này đã khiến tôi phát điên và rất nhiều thông tin trực tuyến trên blog, v.v ... dường như bỏ lỡ điểm này - cảm ơn bạn!
kbrinner

8

Cập nhật 2016 Drupal 8

Tài liệu nói rằng bạn phải trả về một thể hiện của lớp Breadcrumb. Nếu bạn gặp khó khăn để làm cho nó hoạt động. đây là giải pháp hiệu quả với tôi

<?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')
        ];
    }

}

Sau đó, tập tin yml

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

PS: nếu bạn đang sử dụng bootstrap, hãy truy cập /admin/appearance/settingstrang cài đặt của bạn và xem các cài đặt Breadcrumbs. Show 'Home' breadcrumb linknên được kiểm tra trên. Và Show current page title at endnên được kiểm tra.

Sau khi tất cả điều này được thực hiện xóa bộ nhớ cache của bạn. Mỗi khi bạn thay đổi tệp YML, ngay cả trong chế độ gỡ lỗi, bạn cần xóa bộ nhớ cache. bạn có thể đi đến /core/rebuild.phpnếu bạn gặp khó khăn và không thể xây dựng lại.


7

Đừng quên bộ nhớ đệm

Bộ đệm kết xuất được thay đổi khá muộn trong chu kỳ phát triển D8 và do đó, nó không được đề cập trong loạt bài d8ftw hoặc các câu trả lời khác cho câu hỏi này.

Các tài liệu bộ nhớ cache API đề cập cụ thể để làm cho các mảng, nhưng tất cả những hướng dẫn áp dụng chung cho Breadcrumbs. Breadcrumbs có một toRenderable()phương thức, Drupal sẽ cố gắng lưu trữ chúng trong bộ đệm kết xuất và điều đó có nghĩa là bạn phải chỉ định đủ thông tin để cho phép Drupal thực hiện đúng.

Các chi tiết có trong các tài liệu, nhưng phiên bản ngắn là Breadcrumbthực hiện RefinableCachableDependencyInterface. Trong lớp trình tạo của bạn, bạn sẽ muốn gọi addCachableDependency()với bất kỳ và tất cả các thực thể hoặc đối tượng cấu hình được sử dụng để xây dựng đường dẫn bánh mì. Tài liệu về 'Bộ nhớ đệm và bạn bè' đi sâu vào chi tiết hơn về cách thức và lý do.

Nếu có các bối cảnh khác mà đường dẫn bánh mì có thể thay đổi, bạn cũng cần sử dụng thủ công addCacheContexts()để đảm bảo khối thay đổi, addCacheTags()để đảm bảo mục nhập bộ đệm có thể bị vô hiệu hóa chính xác và mergeCacheMaxAge()nếu bộ đệm nhạy cảm với thời gian và cần hết hạn.

Nếu điều này không được thực hiện đúng cách, một trong những dịch vụ xây dựng Breadcrumb tùy chỉnh của bạn sẽ 'thắng' và mẩu bánh mì cho một trang cụ thể đó sẽ được phục vụ trên mọi trang, cho tất cả khách truy cập, mãi mãi.


4

Có một cách khác để đạt được điều này.

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

Và sau đó tạo một tệp khác trong thư mục mẫu của chủ đề của bạn có tên là "Breadcrumb.html.twig" và đặt mã bên dưới vào tệp này:

{% 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 %}

Đó là nó. Bây giờ hãy xóa bộ đệm và bạn sẽ nhận được mẩu bánh mì với tiêu đề trang hiện tại như Trang chủ / Tiêu đề trang hiện tại. Bạn có thể thay đổi dấu phân cách bằng cách thay thế "/" bằng một dấu mong muốn.


2

Bạn nên sử dụng một mô-đun đóng góp để thêm tiêu đề trang hiện tại vào mẩu bánh mì, chẳng hạn như trang hiện tại: https://www.drupal.org/project/cien_page_crumb

Nếu muốn mã hóa bằng tay, bạn có thể kéo mã từ thư mục src của mô-đun đó. Bạn có thể tìm thêm thông tin chi tiết về vụn bánh mì Drupal 8 tại đây: http://www.gregboggs.com/drupal8-breadcrumbs/


Thật là bực bội khi một cái gì đó đơn giản như thế này phải yêu cầu lấy các mô-đun đóng góp để thêm nó vào.
Kevin

Đó là cách Drupal. Mặc dù Drupal 8 bây giờ thực hiện TON trong cốt lõi mà Drupal 7 chưa bao giờ làm. Tôi sẽ sửa lõi Drupal 8 lõi trong lõi nếu có thể. Nhưng, drush en current_page_crumbkhông tệ lắm.
Greg Bogss

0

Tôi đã sử dụng Breadcrumbs tùy chỉnh bằng cách sử dụng mã thông báo trong Drupal 7 và khi mô-đun đó không có sẵn cho Drupal 8, tôi đã kết thúc việc tạo chế độ xem cho các loại nội dung riêng lẻ của mình bằng cách sử dụng các trường ban đầu là các trường mã thông báo. Sử dụng nó như một khối và vô hiệu hóa mẩu bánh mì thông thường. Đó là một công việc nhiều hơn một chút so với Custom Breadcrumbs nhưng nó hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.