사이트 이동 경로를 어떻게 구현합니까?


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

Drupal 8 breadcrumbs 에서 찾을 수 있는 유일한 쓰기 작업을 시작 했지만 더 이상 적용되지 않는 이전 버전의 PSR-4 자동로드를 사용하고있는 것으로 보입니다 (8.0.0의 레코드). -dev-beta3), 그래서 다른 모든 모듈이 코드베이스에서 작동하는 방식으로갔습니다.

이제는 모듈을로드하기 위해 이것이 정확하다고 확신합니다. 그러나 나는 확실하지 않다

class BreadcrumbBuild extends BreadcrumbBuilderBase

맞다. 문제는에서 확장 된 언급에 연결된 이전 튜토리얼 BreadcrumbBuilderBase이지만 더 최신 문서는 언급하지 않는 것이므로 최신이 아닌지 궁금합니다. 어떻게해야합니까?

마찬가지로, 나는 services.yml이 점에서 파일이 무엇을하고 있는지 이해하지 못합니다 .이 문서에 대한 문서는 없습니다.

답변:


8

예, 이동 경로가 변경되었으며 문서를 업데이트해야합니다.

마찬가지로, services.yml 파일이 이와 관련하여 수행하는 작업을 실제로 이해하지 못합니다.이 문서에 대한 문서는 없습니다.

대한 | 크래시 코스 : 드루팔 (8) DrupalCon Amsterdam 2014 , 멋진 프레젠테이션, 약 47:02 :

Drupal 8의 2 단계 :

  1. 도구 만들기
  2. 연결해

배선은 다를 수 있으며 접근 방식은 동일합니다.

우리가 빵 부스러기를 "전신시키는 방법":

대한 http://www.palantir.net/blog/d8ftw-breadcrumbs-work :

이제 수업에 대해 시스템에 알려야합니다. 그렇게하기 위해, 우리는 새로운 클래스를 참조하는 새로운 서비스 (그것을 기억 하는가?)를 정의합니다. 정확히이 목적으로 존재하는 * .services.yml 파일에서이를 수행합니다.

이전 Drupal 버전의 "정보 후크"와 유사하게 mymodule.breadcrumb라는 서비스를 정의하고 있습니다. 그것은 빵 부스러기 수업의 예가 될 것입니다. 필요한 경우 클래스의 생성자에도 인수를 전달할 수 있습니다. 그러나 중요하게도 서비스에 태그를 지정합니다. 태그가 지정된 서비스는 특히 Symfony DependencyInjection 구성 요소의 기능이며 시스템에 빌더를 이동 경로 관리자에 자동으로 연결하도록 지시합니다. 우선 순위는 다양한 빌더가 어떤 순서로 호출되어야하는지 지정합니다. 두 개의 apply () 메소드가 모두 true를 리턴 할 경우 우선 순위가 높은 빌더가 사용되며 다른 빌더는 무시됩니다.

이 코드를 원하는대로 사용할 수 있습니다.

구조 (별로 중요하지 않음) :

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

마지막에 캐시를 지우십시오.


지금까지 기쁨이 없습니다. 실제로 구현이 가능하기 때문에 가능한 한 밀접하게 핵심 분류 체계를 복사했습니다 (apply () 메소드에서 dpm ( 'Test')를 호출하면 출력됩니다. 나타납니다-서비스 라우팅이 올바르지 않다고 생각하지만 내 yaml은 유효합니다 ... sigh :(
njp

1
@njp는 Breadcrumb 클래스의 경로를 검토하고 (Breadcrumb 폴더를 추가합니다) 서비스 파일의 "class"매개 변수와 일치해야합니다. 클래스의 모든 이름을 너무 확인하십시오. 때로는 일부 파일이나 매개 변수에서 일치하지 않습니다.
rpayanm

1
축하합니다! 한 가지 질문 : 수정 후 "캐시를 지우셨습니까"? 아마도 그럴 수 있습니다.
rpayanm

1
예, 서비스를 업데이트하기에 충분한 캐시를 비워야합니다. 또한 언급 할 가치가있는 것이 우선 순위입니다. apply ()에서 TRUE를 반환하는 첫 번째 빌더가 승리하므로 해당 태그를 사용하여 다른 서비스 (쉽게 텍스트 검색)를 검색하고 가중치 및 apply () 구현을 확인해야 할 수 있습니다.
Berdir

1
반대로 @njp는 우선 순위가 다양한 빌더를 어떤 순서로 호출해야하는지 지정합니다. 두 개의 apply () 메소드가 모두 true를 리턴 할 경우 우선 순위가 높은 빌더가 사용되며 다른 빌더는 무시됩니다.
rpayanm

10

다시갑니다 이 답변은 대부분 옳습니다. 잊을 수없는 것은 "캐시 태그"와 "캐시 컨텍스트"입니다.

노드에서 분류 체계 용어를 이동 경로로 설정하고있었습니다.

이 게시물의 조언을 받아 보았지만 클릭하여 모든 페이지에서 동일한 빵 부스러기를 발견했습니다.

간단히 말해서 캐시 컨텍스트와 태그를 설정하십시오.

요점에 내 서비스가 있습니다 : https://gist.github.com/jonpugh/ccaeb01e173abbc6c88f7a332d271e4a

내 build () 메소드는 다음과 같습니다.

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

PS : 당신이 사용하는 경우 부트 스트랩 당신의 이동을 /admin/appearance/settings이동 경로 설정에서 설정 페이지와보세요. Show 'Home' breadcrumb link확인해야합니다. 그리고 Show current page title at end확인해야합니다.

이 작업이 끝나면 캐시를 비 웁니다. 디버그 모드에서도 YML 파일을 변경할 때마다 캐시를 ​​지워야합니다. 당신은 갈 수 /core/rebuild.php문제가 발생할 경우 다시 수 없습니다.


7

캐싱을 잊지 마십시오

렌더 캐시는 D8 개발주기에서 상당히 늦게 변경되었으므로 d8ftw 시리즈 또는이 질문에 대한 다른 답변에서는 언급되지 않았습니다.

캐시 API 문서는 배열을 렌더링하기 위해 특별히 의미하지만, 그 모든 지시는 빵 부스러기에 동일하게 적용된다. 이동 경로에는 toRenderable()메소드가 있으며 Drupal은이를 렌더 캐시에 캐시하려고 시도하므로 Drupal이 올바르게 수행 할 수 있도록 충분한 정보를 지정 해야합니다 .

세부 사항은 문서에 있지만 짧은 버전 즉 Breadcrumb구현 RefinableCachableDependencyInterface. 빌더 클래스에서는 addCachableDependency()사이트 이동 경로를 빌드하는 데 사용되는 모든 엔티티 또는 구성 오브젝트 를 호출 해야합니다. 'CacheableDependencyInterface & friends'에 대한 문서 는 방법과 이유에 대해 자세히 설명합니다.

이동 경로가 변경 될 수있는 다른 컨텍스트가있는 addCacheContexts()경우 블록 addCacheTags()을 변경하고 캐시 항목이 올바르게 무효화 될 수 있는지 확인 mergeCacheMaxAge()하고 캐시가 시간에 민감하고 만료 되어야하는 경우 수동으로 사용해야 합니다 .

이것이 올바르게 수행되지 않으면 사용자 정의 Breadcrumb 빌더 서비스 중 하나가 '승리'되고 해당 특정 페이지에 대한 breadcrumb가 모든 페이지에서 모든 방문자에게 영원히 제공됩니다.


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

그런 다음 테마의 템플릿 폴더에 "breadcrumb.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 %}

그게 다야. 이제 캐시를 비우면 Home / Current Page Title과 같은 현재 페이지 제목으로 이동 경로가 나타납니다. "/"를 원하는 것으로 바꾸면 구분 기호를 변경할 수 있습니다.


2

Contrib 모듈을 사용하여 Current Page Crumb와 같은 현재 페이지 제목을 사이트 이동 경로에 추가해야합니다. https://www.drupal.org/project/current_page_crumb

직접 코딩하려는 경우 해당 모듈의 src 폴더에서 코드를 가져올 수 있습니다. Drupal 8 breadcrumbs에 대한 자세한 내용은 여기를 참조 하십시오 : http://www.gregboggs.com/drupal8-breadcrumbs/


그것이 너무 간단해서 추가하기 위해 contrib 모듈을 잡아야 할만큼 간단합니다.
Kevin

Drupal 방식이 그와 같습니다. Drupal 8은 이제 Drupal 7이 한 적이없는 코어에서 TON을 수행합니다. 가능한 경우 코어 Drupal 8 breadcrumbs를 코어에 수정했습니다. 그러나 drush en current_page_crumb그렇게 나쁘지 않습니다.
Greg Boggs

0

Drupal 7에서 토큰을 사용하여 Custom Breadcrumbs를 사용했으며 Drupal 8에 해당 모듈을 사용할 수 없을 때 원래 토큰 필드 인 필드를 사용하여 개별 컨텐츠 유형에 대한보기를 작성했습니다. 이를 블록으로 사용하고 일반 이동 경로를 비활성화합니다. Custom Breadcrumbs보다 약간 더 많은 작업 이었지만 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.