From 9917b07bc1c15135593bfb68d9872f1ec7ceb22f Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Mon, 5 Jan 2015 10:50:28 +0000 Subject: [PATCH] Issue #1799820 by jhedstrom, Floydm: Breadcrumb doesn't get localized when displaying parent terms --- .../src/Tests/Menu/AssertBreadcrumbTrait.php | 103 +++++++++++++ .../Tests/Menu/AssertMenuActiveTrailTrait.php | 68 +++++++++ .../system/src/Tests/Menu/MenuTestBase.php | 137 +----------------- .../taxonomy/src/TermBreadcrumbBuilder.php | 29 +++- .../Tests/TaxonomyTranslationTestTrait.php | 111 ++++++++++++++ .../Tests/TermTranslationBreadcrumbTest.php | 124 ++++++++++++++++ .../Tests/TermTranslationFieldViewTest.php | 96 +----------- core/modules/taxonomy/taxonomy.services.yml | 1 + 8 files changed, 437 insertions(+), 232 deletions(-) create mode 100644 core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php create mode 100644 core/modules/system/src/Tests/Menu/AssertMenuActiveTrailTrait.php create mode 100644 core/modules/taxonomy/src/Tests/TaxonomyTranslationTestTrait.php create mode 100644 core/modules/taxonomy/src/Tests/TermTranslationBreadcrumbTest.php diff --git a/core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php b/core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php new file mode 100644 index 000000000000..737a362a25cf --- /dev/null +++ b/core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php @@ -0,0 +1,103 @@ +<?php + +/** + * @file + * Contains \Drupal\system\Tests\Menu\AssertBreadcrumbTrait. + */ + +namespace Drupal\system\Tests\Menu; + +use Drupal\Component\Utility\String; + +/** + * Provides test assertions for verifying breadcrumbs. + */ +trait AssertBreadcrumbTrait { + + use AssertMenuActiveTrailTrait; + + /** + * Assert that a given path shows certain breadcrumb links. + * + * @param string $goto + * (optional) A system path to pass to + * Drupal\simpletest\WebTestBase::drupalGet(). + * @param array $trail + * An associative array whose keys are expected breadcrumb link paths and + * whose values are expected breadcrumb link texts (not sanitized). + * @param string $page_title + * (optional) A page title to additionally assert via + * Drupal\simpletest\WebTestBase::assertTitle(). Without site name suffix. + * @param array $tree + * (optional) An associative array whose keys are link paths and whose + * values are link titles (not sanitized) of an expected active trail in a + * menu tree output on the page. + * @param $last_active + * (optional) Whether the last link in $tree is expected to be active (TRUE) + * or just to be in the active trail (FALSE). + */ + protected function assertBreadcrumb($goto, array $trail, $page_title = NULL, array $tree = array(), $last_active = TRUE) { + if (isset($goto)) { + $this->drupalGet($goto); + } + $this->assertBreadcrumbParts($trail); + + // Additionally assert page title, if given. + if (isset($page_title)) { + $this->assertTitle(strtr('@title | Drupal', array('@title' => $page_title))); + } + + // Additionally assert active trail in a menu tree output, if given. + if ($tree) { + $this->assertMenuActiveTrail($tree, $last_active); + } + } + + /** + * Assert that a trail exists in the internal browser. + * + * @param array $trail + * An associative array whose keys are expected breadcrumb link paths and + * whose values are expected breadcrumb link texts (not sanitized). + */ + protected function assertBreadcrumbParts($trail) { + // Compare paths with actual breadcrumb. + $parts = $this->getBreadcrumbParts(); + $pass = TRUE; + // There may be more than one breadcrumb on the page. If $trail is empty + // this test would go into an infinite loop, so we need to check that too. + while ($trail && !empty($parts)) { + foreach ($trail as $path => $title) { + $url = _url($path); + $part = array_shift($parts); + $pass = ($pass && $part['href'] === $url && $part['text'] === String::checkPlain($title)); + } + } + // No parts must be left, or an expected "Home" will always pass. + $pass = ($pass && empty($parts)); + + $this->assertTrue($pass, format_string('Breadcrumb %parts found on @path.', array( + '%parts' => implode(' » ', $trail), + '@path' => $this->getUrl(), + ))); + } + + /** + * Returns the breadcrumb contents of the current page in the internal browser. + */ + protected function getBreadcrumbParts() { + $parts = array(); + $elements = $this->xpath('//nav[@class="breadcrumb"]/ol/li/a'); + if (!empty($elements)) { + foreach ($elements as $element) { + $parts[] = array( + 'text' => (string) $element, + 'href' => (string) $element['href'], + 'title' => (string) $element['title'], + ); + } + } + return $parts; + } + +} diff --git a/core/modules/system/src/Tests/Menu/AssertMenuActiveTrailTrait.php b/core/modules/system/src/Tests/Menu/AssertMenuActiveTrailTrait.php new file mode 100644 index 000000000000..a3146ba2b4d8 --- /dev/null +++ b/core/modules/system/src/Tests/Menu/AssertMenuActiveTrailTrait.php @@ -0,0 +1,68 @@ +<?php + +/** + * @file + * Contains \Drupal\system\Tests\Menu\AssertMenuActiveTrailTrait. + */ + +namespace Drupal\system\Tests\Menu; + +/** + * Provides test assertions for verifying the active menu trail. + */ +trait AssertMenuActiveTrailTrait { + + /** + * Assert that active trail exists in a menu tree output. + * + * @param array $tree + * An associative array whose keys are link paths and whose + * values are link titles (not sanitized) of an expected active trail in a + * menu tree output on the page. + * @param bool $last_active + * Whether the last link in $tree is expected to be active (TRUE) + * or just to be in the active trail (FALSE). + */ + protected function assertMenuActiveTrail($tree, $last_active) { + end($tree); + $active_link_path = key($tree); + $active_link_title = array_pop($tree); + $xpath = ''; + if ($tree) { + $i = 0; + foreach ($tree as $link_path => $link_title) { + $part_xpath = (!$i ? '//' : '/following-sibling::ul/descendant::'); + $part_xpath .= 'li[contains(@class, :class)]/a[contains(@href, :href) and contains(text(), :title)]'; + $part_args = array( + ':class' => 'active-trail', + ':href' => _url($link_path), + ':title' => $link_title, + ); + $xpath .= $this->buildXPathQuery($part_xpath, $part_args); + $i++; + } + $elements = $this->xpath($xpath); + $this->assertTrue(!empty($elements), 'Active trail to current page was found in menu tree.'); + + // Append prefix for active link asserted below. + $xpath .= '/following-sibling::ul/descendant::'; + } + else { + $xpath .= '//'; + } + $xpath_last_active = ($last_active ? 'and contains(@class, :class-active)' : ''); + $xpath .= 'li[contains(@class, :class-trail)]/a[contains(@href, :href) ' . $xpath_last_active . 'and contains(text(), :title)]'; + $args = array( + ':class-trail' => 'active-trail', + ':class-active' => 'active', + ':href' => _url($active_link_path), + ':title' => $active_link_title, + ); + $elements = $this->xpath($xpath, $args); + $this->assertTrue(!empty($elements), format_string('Active link %title was found in menu tree, including active trail links %tree.', array( + '%title' => $active_link_title, + '%tree' => implode(' » ', $tree), + ))); + } + +} diff --git a/core/modules/system/src/Tests/Menu/MenuTestBase.php b/core/modules/system/src/Tests/Menu/MenuTestBase.php index 2478af3afb7c..833d72fd9693 100644 --- a/core/modules/system/src/Tests/Menu/MenuTestBase.php +++ b/core/modules/system/src/Tests/Menu/MenuTestBase.php @@ -7,145 +7,10 @@ namespace Drupal\system\Tests\Menu; -use Drupal\Component\Utility\String; use Drupal\simpletest\WebTestBase; abstract class MenuTestBase extends WebTestBase { - /** - * Assert that a given path shows certain breadcrumb links. - * - * @param string $goto - * (optional) A system path to pass to - * Drupal\simpletest\WebTestBase::drupalGet(). - * @param array $trail - * An associative array whose keys are expected breadcrumb link paths and - * whose values are expected breadcrumb link texts (not sanitized). - * @param string $page_title - * (optional) A page title to additionally assert via - * Drupal\simpletest\WebTestBase::assertTitle(). Without site name suffix. - * @param array $tree - * (optional) An associative array whose keys are link paths and whose - * values are link titles (not sanitized) of an expected active trail in a - * menu tree output on the page. - * @param $last_active - * (optional) Whether the last link in $tree is expected to be active (TRUE) - * or just to be in the active trail (FALSE). - */ - protected function assertBreadcrumb($goto, array $trail, $page_title = NULL, array $tree = array(), $last_active = TRUE) { - if (isset($goto)) { - $this->drupalGet($goto); - } - $this->assertBreadcrumbParts($trail); + use AssertBreadcrumbTrait; - // Additionally assert page title, if given. - if (isset($page_title)) { - $this->assertTitle(strtr('@title | Drupal', array('@title' => $page_title))); - } - - // Additionally assert active trail in a menu tree output, if given. - if ($tree) { - $this->assertMenuActiveTrail($tree, $last_active); - } - } - - /** - * Assert that a trail exists in the internal browser. - * - * @param array $trail - * An associative array whose keys are expected breadcrumb link paths and - * whose values are expected breadcrumb link texts (not sanitized). - */ - protected function assertBreadcrumbParts($trail) { - // Compare paths with actual breadcrumb. - $parts = $this->getBreadcrumbParts(); - $pass = TRUE; - // There may be more than one breadcrumb on the page. If $trail is empty - // this test would go into an infinite loop, so we need to check that too. - while ($trail && !empty($parts)) { - foreach ($trail as $path => $title) { - $url = _url($path); - $part = array_shift($parts); - $pass = ($pass && $part['href'] === $url && $part['text'] === String::checkPlain($title)); - } - } - // No parts must be left, or an expected "Home" will always pass. - $pass = ($pass && empty($parts)); - - $this->assertTrue($pass, format_string('Breadcrumb %parts found on @path.', array( - '%parts' => implode(' » ', $trail), - '@path' => $this->getUrl(), - ))); - } - - /** - * Assert that active trail exists in a menu tree output. - * - * @param array $tree - * An associative array whose keys are link paths and whose - * values are link titles (not sanitized) of an expected active trail in a - * menu tree output on the page. - * @param bool $last_active - * Whether the last link in $tree is expected to be active (TRUE) - * or just to be in the active trail (FALSE). - */ - protected function assertMenuActiveTrail($tree, $last_active) { - end($tree); - $active_link_path = key($tree); - $active_link_title = array_pop($tree); - $xpath = ''; - if ($tree) { - $i = 0; - foreach ($tree as $link_path => $link_title) { - $part_xpath = (!$i ? '//' : '/following-sibling::ul/descendant::'); - $part_xpath .= 'li[contains(@class, :class)]/a[contains(@href, :href) and contains(text(), :title)]'; - $part_args = array( - ':class' => 'active-trail', - ':href' => _url($link_path), - ':title' => $link_title, - ); - $xpath .= $this->buildXPathQuery($part_xpath, $part_args); - $i++; - } - $elements = $this->xpath($xpath); - $this->assertTrue(!empty($elements), 'Active trail to current page was found in menu tree.'); - - // Append prefix for active link asserted below. - $xpath .= '/following-sibling::ul/descendant::'; - } - else { - $xpath .= '//'; - } - $xpath_last_active = ($last_active ? 'and contains(@class, :class-active)' : ''); - $xpath .= 'li[contains(@class, :class-trail)]/a[contains(@href, :href) ' . $xpath_last_active . 'and contains(text(), :title)]'; - $args = array( - ':class-trail' => 'active-trail', - ':class-active' => 'active', - ':href' => _url($active_link_path), - ':title' => $active_link_title, - ); - $elements = $this->xpath($xpath, $args); - $this->assertTrue(!empty($elements), format_string('Active link %title was found in menu tree, including active trail links %tree.', array( - '%title' => $active_link_title, - '%tree' => implode(' » ', $tree), - ))); - } - - /** - * Returns the breadcrumb contents of the current page in the internal browser. - */ - protected function getBreadcrumbParts() { - $parts = array(); - $elements = $this->xpath('//nav[@class="breadcrumb"]/ol/li/a'); - if (!empty($elements)) { - foreach ($elements as $element) { - $parts[] = array( - 'text' => (string) $element, - 'href' => (string) $element['href'], - 'title' => (string) $element['title'], - ); - } - } - return $parts; - } } diff --git a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php index 307170a41656..7c4cc897dbff 100644 --- a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php +++ b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php @@ -8,6 +8,7 @@ namespace Drupal\taxonomy; use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface; +use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Link; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; @@ -18,6 +19,31 @@ class TermBreadcrumbBuilder implements BreadcrumbBuilderInterface { use StringTranslationTrait; + /** + * The entity manager. + * + * @var \Drupal\Core\Entity\EntityManagerInterface + */ + protected $entityManager; + + /** + * The taxonomy storage. + * + * @var \Drupal\Core\Entity\EntityStorageInterface + */ + protected $termStorage; + + /** + * Constructs the TermBreadcrumbBuilder. + * + * @param \Drupal\Core\Entity\EntityManagerInterface $entityManager + * The entity manager. + */ + public function __construct(EntityManagerInterface $entityManager) { + $this->entityManager = $entityManager; + $this->termStorage = $entityManager->getStorage('taxonomy_term'); + } + /** * {@inheritdoc} */ @@ -35,8 +61,9 @@ public function build(RouteMatchInterface $route_match) { // hard-coded presumption. Make this behavior configurable per // vocabulary or term. $breadcrumb = array(); - while ($parents = taxonomy_term_load_parents($term->id())) { + while ($parents = $this->termStorage->loadParents($term->id())) { $term = array_shift($parents); + $term = $this->entityManager->getTranslationFromContext($term); $breadcrumb[] = Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', array('taxonomy_term' => $term->id())); } $breadcrumb[] = Link::createFromRoute($this->t('Home'), '<front>'); diff --git a/core/modules/taxonomy/src/Tests/TaxonomyTranslationTestTrait.php b/core/modules/taxonomy/src/Tests/TaxonomyTranslationTestTrait.php new file mode 100644 index 000000000000..e813ced9ccc4 --- /dev/null +++ b/core/modules/taxonomy/src/Tests/TaxonomyTranslationTestTrait.php @@ -0,0 +1,111 @@ +<?php + +/** + * @file + * Contains \Drupal\taxonomy\Tests\TaxonomyTranslationTestTrait. + */ + +namespace Drupal\taxonomy\Tests; + +use Drupal\Core\Field\FieldStorageDefinitionInterface; +use Drupal\language\Entity\ConfigurableLanguage; + +/** + * Provides common testing base for translated taxonomy terms. + */ +trait TaxonomyTranslationTestTrait { + + /** + * The vocabulary. + * + * @var \Drupal\taxonomy\Entity\Vocabulary; + */ + protected $vocabulary; + + /** + * The field name for our taxonomy term field. + * + * @var string + */ + protected $termFieldName = 'field_tag'; + + /** + * The langcode of the source language. + * + * @var string + */ + protected $baseLangcode = 'en'; + + /** + * Target langcode for translation. + * + * @var string + */ + protected $translateToLangcode = 'hu'; + + /** + * The node to check the translated value on. + * + * @var \Drupal\node\Entity\Node + */ + protected $node; + + /** + * Adds additional languages. + */ + protected function setupLanguages() { + ConfigurableLanguage::createFromLangcode($this->translateToLangcode)->save(); + } + + /** + * Enables translations where it needed. + */ + protected function enableTranslation() { + // Enable translation for the current entity type and ensure the change is + // picked up. + \Drupal::service('content_translation.manager')->setEnabled('node', 'article', TRUE); + \Drupal::service('content_translation.manager')->setEnabled('taxonomy_term', $this->vocabulary->id(), TRUE); + drupal_static_reset(); + \Drupal::entityManager()->clearCachedDefinitions(); + \Drupal::service('router.builder')->rebuild(); + } + + /** + * Adds term reference field for the article content type. + */ + protected function setUpTermReferenceField() { + entity_create('field_storage_config', array( + 'field_name' => $this->termFieldName, + 'entity_type' => 'node', + 'type' => 'taxonomy_term_reference', + 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, + 'translatable' => FALSE, + 'settings' => array( + 'allowed_values' => array( + array( + 'vocabulary' => $this->vocabulary->id(), + 'parent' => 0, + ), + ), + ), + ))->save(); + + $field = entity_create('field_config', array( + 'field_name' => $this->termFieldName, + 'bundle' => 'article', + 'entity_type' => 'node', + )); + $field->save(); + entity_get_form_display('node', 'article', 'default') + ->setComponent($this->termFieldName, array( + 'type' => 'taxonomy_autocomplete', + )) + ->save(); + entity_get_display('node', 'article', 'default') + ->setComponent($this->termFieldName, array( + 'type' => 'taxonomy_term_reference_link', + )) + ->save(); + } + +} diff --git a/core/modules/taxonomy/src/Tests/TermTranslationBreadcrumbTest.php b/core/modules/taxonomy/src/Tests/TermTranslationBreadcrumbTest.php new file mode 100644 index 000000000000..903e651a674d --- /dev/null +++ b/core/modules/taxonomy/src/Tests/TermTranslationBreadcrumbTest.php @@ -0,0 +1,124 @@ +<?php + +/** + * @file + * Contains \Drupal\taxonomy\Tests\TermTranslationBreadcrumbTest. + */ + +namespace Drupal\taxonomy\Tests; + +use Drupal\system\Tests\Menu\AssertBreadcrumbTrait; + +/** + * Tests for proper breadcrumb translation. + * + * @group taxonomy + */ +class TermTranslationBreadcrumbTest extends TaxonomyTestBase { + + use AssertBreadcrumbTrait; + use TaxonomyTranslationTestTrait; + + /** + * Term to translated term mapping. + * + * @var array + */ + protected $termTranslationMap = array( + 'one' => 'translatedOne', + 'two' => 'translatedTwo', + 'three' => 'translatedThree', + ); + + /** + * Created terms. + * + * @var \Drupal\taxonomy\Entity\Term[] + */ + protected $terms = array(); + + /** + * {@inheritdoc} + */ + public static $modules = array('taxonomy', 'language', 'content_translation'); + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + $this->setupLanguages(); + $this->vocabulary = $this->createVocabulary(); + $this->enableTranslation(); + $this->setUpTerms(); + $this->setUpTermReferenceField(); + } + + /** + * Test translated breadcrumbs. + */ + public function testTranslatedBreadcrumbs() { + // Ensure non-translated breadcrumb is correct. + $breadcrumb = array('' => 'Home'); + foreach ($this->terms as $term) { + $breadcrumb[$term->getSystemPath()] = $term->label(); + } + // The last item will not be in the breadcrumb. + array_pop($breadcrumb); + + // Check the breadcrumb on the leaf term page. + $term = $this->getLeafTerm(); + $this->assertBreadcrumb($term->getSystemPath(), $breadcrumb, $term->label()); + + // Construct the expected translated breadcrumb. + $breadcrumb = array($this->translateToLangcode => 'Home'); + foreach ($this->terms as $term) { + $translated = $term->getTranslation($this->translateToLangcode); + $path = $this->translateToLangcode . '/' . $translated->getSystemPath(); + $breadcrumb[$path] = $translated->label(); + } + array_pop($breadcrumb); + + // Check for the translated breadcrumb on the translated leaf term page. + $term = $this->getLeafTerm(); + $translated = $term->getTranslation($this->translateToLangcode); + $path = $this->translateToLangcode . '/' . $translated->getSystemPath(); + $this->assertBreadcrumb($path, $breadcrumb, $translated->label()); + } + + /** + * Setup translated terms in a hierarchy. + */ + protected function setUpTerms() { + $parent_vid = 0; + foreach ($this->termTranslationMap as $name => $translation) { + + $term = $this->createTerm($this->vocabulary, array( + 'name' => $name, + 'langcode' => $this->baseLangcode, + 'parent' => $parent_vid, + )); + + $term->addTranslation($this->translateToLangcode, array( + 'name' => $translation, + )); + $term->save(); + + // Each term is nested under the last. + $parent_vid = $term->id(); + + $this->terms[] = $term; + } + } + + /** + * Get the final (leaf) term in the hierarchy. + * + * @return \Drupal\taxonomy\Entity\Term + * The final term in the hierarchy. + */ + protected function getLeafTerm() { + return $this->terms[count($this->termTranslationMap) - 1]; + } + +} diff --git a/core/modules/taxonomy/src/Tests/TermTranslationFieldViewTest.php b/core/modules/taxonomy/src/Tests/TermTranslationFieldViewTest.php index fc3267cae00c..9474d11c5e18 100644 --- a/core/modules/taxonomy/src/Tests/TermTranslationFieldViewTest.php +++ b/core/modules/taxonomy/src/Tests/TermTranslationFieldViewTest.php @@ -7,9 +7,6 @@ namespace Drupal\taxonomy\Tests; -use Drupal\language\Entity\ConfigurableLanguage; -use Drupal\Core\Field\FieldStorageDefinitionInterface; - /** * Tests the translation of taxonomy terms field on nodes. * @@ -17,12 +14,7 @@ */ class TermTranslationFieldViewTest extends TaxonomyTestBase { - /** - * The vocabulary. - * - * @var \Drupal\taxonomy\Entity\Vocabulary; - */ - protected $vocabulary; + use TaxonomyTranslationTestTrait; /** * The term that should be translated. @@ -31,27 +23,6 @@ class TermTranslationFieldViewTest extends TaxonomyTestBase { */ protected $term; - /** - * The field name for our taxonomy term field. - * - * @var string - */ - protected $termFieldName = 'field_tag'; - - /** - * The langcode of the source language. - * - * @var string - */ - protected $baseLangcode = 'en'; - - /** - * Target langcode for translation. - * - * @var string - */ - protected $translateToLangcode = 'hu'; - /** * The tag in the source language. * @@ -66,13 +37,6 @@ class TermTranslationFieldViewTest extends TaxonomyTestBase { */ protected $translatedTagName = 'TranslatedTagName'; - /** - * The node to check the translated value on. - * - * @var \Drupal\node\Entity\Node - */ - protected $node; - /** * Modules to enable. * @@ -105,13 +69,6 @@ public function testTranslatedTaxonomyTermReferenceDisplay() { $this->assertNoText($this->baseTagName); } - /** - * Adds additional languages. - */ - protected function setupLanguages() { - ConfigurableLanguage::createFromLangcode($this->translateToLangcode)->save(); - } - /** * Creates a test subject node, with translation. */ @@ -133,19 +90,6 @@ protected function setUpNode() { $this->node = $node; } - /** - * Enables translations where it needed. - */ - protected function enableTranslation() { - // Enable translation for the current entity type and ensure the change is - // picked up. - \Drupal::service('content_translation.manager')->setEnabled('node', 'article', TRUE); - \Drupal::service('content_translation.manager')->setEnabled('taxonomy_vocabulary', $this->vocabulary->id(), TRUE); - drupal_static_reset(); - \Drupal::entityManager()->clearCachedDefinitions(); - \Drupal::service('router.builder')->rebuild(); - } - /** * Creates a test subject term, with translation. */ @@ -161,42 +105,4 @@ protected function setUpTerm() { $this->term->save(); } - /** - * Adds term reference field for the article content type. - */ - protected function setUpTermReferenceField() { - entity_create('field_storage_config', array( - 'field_name' => $this->termFieldName, - 'entity_type' => 'node', - 'type' => 'taxonomy_term_reference', - 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, - 'translatable' => FALSE, - 'settings' => array( - 'allowed_values' => array( - array( - 'vocabulary' => $this->vocabulary->id(), - 'parent' => 0, - ), - ), - ), - ))->save(); - - $field = entity_create('field_config', array( - 'field_name' => $this->termFieldName, - 'bundle' => 'article', - 'entity_type' => 'node', - )); - $field->save(); - entity_get_form_display('node', 'article', 'default') - ->setComponent($this->termFieldName, array( - 'type' => 'taxonomy_autocomplete', - )) - ->save(); - entity_get_display('node', 'article', 'default') - ->setComponent($this->termFieldName, array( - 'type' => 'taxonomy_term_reference_link', - )) - ->save(); - } - } diff --git a/core/modules/taxonomy/taxonomy.services.yml b/core/modules/taxonomy/taxonomy.services.yml index 686f6ea47fed..a8153ed11773 100644 --- a/core/modules/taxonomy/taxonomy.services.yml +++ b/core/modules/taxonomy/taxonomy.services.yml @@ -1,5 +1,6 @@ services: taxonomy_term.breadcrumb: class: Drupal\taxonomy\TermBreadcrumbBuilder + arguments: ['@entity.manager'] tags: - { name: breadcrumb_builder, priority: 1002 } -- GitLab