diff --git a/modules/thunder_article/src/Breadcrumb/ThunderArticleBreadcrumbBuilder.php b/modules/thunder_article/src/Breadcrumb/ThunderArticleBreadcrumbBuilder.php index 0aa578d63..130d32b01 100644 --- a/modules/thunder_article/src/Breadcrumb/ThunderArticleBreadcrumbBuilder.php +++ b/modules/thunder_article/src/Breadcrumb/ThunderArticleBreadcrumbBuilder.php @@ -3,101 +3,13 @@ namespace Drupal\thunder_article\Breadcrumb; use Drupal\Core\Breadcrumb\Breadcrumb; -use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface; -use Drupal\Core\Config\ConfigFactoryInterface; -use Drupal\Core\Entity\EntityRepositoryInterface; -use Drupal\Core\Entity\EntityTypeManagerInterface; -use Drupal\Core\Link; use Drupal\Core\Routing\RouteMatchInterface; -use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\taxonomy\TermInterface; /** * Class to define the menu_link breadcrumb builder. */ -class ThunderArticleBreadcrumbBuilder implements BreadcrumbBuilderInterface { - use StringTranslationTrait; - - /** - * The router request context. - * - * @var \Drupal\Core\Routing\RequestContext - */ - protected $context; - - /** - * The menu link access service. - * - * @var \Drupal\Core\Access\AccessManagerInterface - */ - protected $accessManager; - - /** - * The dynamic router service. - * - * @var \Symfony\Component\Routing\Matcher\RequestMatcherInterface - */ - protected $router; - - /** - * The dynamic router service. - * - * @var \Drupal\Core\PathProcessor\InboundPathProcessorInterface - */ - protected $pathProcessor; - - /** - * Site configFactory object. - * - * @var \Drupal\Core\Config\ConfigFactoryInterface - */ - protected $configFactory; - - /** - * The title resolver. - * - * @var \Drupal\Core\Controller\TitleResolverInterface - */ - protected $titleResolver; - - /** - * The current user object. - * - * @var \Drupal\Core\Session\AccountInterface - */ - protected $currentUser; - - /** - * The entity repository service. - * - * @var \Drupal\Core\Entity\EntityRepositoryInterface - */ - protected $entityRepository; - - /** - * The taxonomy storage. - * - * @var \Drupal\taxonomy\TermStorageInterface - */ - protected $termStorage; - - /** - * Constructs the ThunderArticleBreadcrumbBuilder. - * - * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager - * The entity type manager service. - * @param \Drupal\Core\Entity\EntityRepositoryInterface $entityRepository - * The entity repository service. - * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory - * The config factory. - * - * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException - * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException - */ - public function __construct(EntityTypeManagerInterface $entityTypeManager, EntityRepositoryInterface $entityRepository, ConfigFactoryInterface $configFactory) { - $this->entityRepository = $entityRepository; - $this->termStorage = $entityTypeManager->getStorage('taxonomy_term'); - $this->configFactory = $configFactory; - } +class ThunderArticleBreadcrumbBuilder extends ThunderTaxonomyTermBreadcrumbBuilderBase { /** * {@inheritdoc} @@ -105,45 +17,20 @@ public function __construct(EntityTypeManagerInterface $entityTypeManager, Entit public function applies(RouteMatchInterface $route_match): bool { // This breadcrumb apply only for all articles. $parameters = $route_match->getParameters()->all(); - if (($route_match->getRouteName() === 'entity.node.canonical') && is_object($parameters['node'])) { - return $parameters['node']->getType() == 'article'; - } - return FALSE; + return ($route_match->getRouteName() === 'entity.node.canonical') && is_object($parameters['node']) && $parameters['node']->getType() === 'article' && !empty($parameters['node']->field_channel->entity); } /** * {@inheritdoc} */ - public function build(RouteMatchInterface $route_match): Breadcrumb { - $breadcrumb = new Breadcrumb(); - $breadcrumb->addCacheContexts(['route']); - - // Add all parent forums to breadcrumbs. + protected function getCurrentTerm(RouteMatchInterface $route_match, Breadcrumb $breadcrumb): TermInterface { /** @var \Drupal\node\Entity\Node $node */ $node = $route_match->getParameter('node'); $breadcrumb->addCacheableDependency($node); - // Add all parent forums to breadcrumbs. - /** @var \Drupal\taxonomy\TermInterface|NULL $term */ - $term = !empty($node->field_channel) ? $node->field_channel->entity : NULL; - - $links = []; - if ($term) { - $breadcrumb->addCacheableDependency($term); - - $channels = $this->termStorage->loadAllParents($term->id()); - foreach (array_reverse($channels) as $term) { - /** @var \Drupal\taxonomy\TermInterface $term */ - $term = $this->entityRepository->getTranslationFromContext($term); - $breadcrumb->addCacheableDependency($term); - $links[] = Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()]); - } - } - if (!$links || '/' . $links[0]->getUrl()->getInternalPath() != $this->configFactory->get('system.site')->get('page.front')) { - array_unshift($links, Link::createFromRoute($this->t('Home'), '')); - } - - return $breadcrumb->setLinks($links); + /** @var \Drupal\taxonomy\Entity\Term $term */ + $term = $node->field_channel->entity; + return $term; } } diff --git a/modules/thunder_article/src/Breadcrumb/ThunderTaxonomyTermBreadcrumbBuilderBase.php b/modules/thunder_article/src/Breadcrumb/ThunderTaxonomyTermBreadcrumbBuilderBase.php new file mode 100644 index 000000000..f20ff3fd7 --- /dev/null +++ b/modules/thunder_article/src/Breadcrumb/ThunderTaxonomyTermBreadcrumbBuilderBase.php @@ -0,0 +1,100 @@ +entityRepository = $entityRepository; + $this->termStorage = $entityTypeManager->getStorage('taxonomy_term'); + $this->configFactory = $configFactory; + } + + /** + * Get the term to produce the breadcrumb for. + * + * @param \Drupal\Core\Routing\RouteMatchInterface $route_match + * The route match. + * @param \Drupal\Core\Breadcrumb\Breadcrumb $breadcrumb + * The breadcrumb. + * + * @return \Drupal\taxonomy\TermInterface + * The current term. + */ + abstract protected function getCurrentTerm(RouteMatchInterface $route_match, Breadcrumb $breadcrumb): TermInterface; + + /** + * {@inheritdoc} + */ + public function build(RouteMatchInterface $route_match): Breadcrumb { + $breadcrumb = new Breadcrumb(); + $breadcrumb->addCacheContexts(['route']); + + $term = $this->getCurrentTerm($route_match, $breadcrumb); + $breadcrumb->addCacheableDependency($term); + + $links = []; + $parents = $this->termStorage->loadAllParents($term->id()); + foreach (array_reverse($parents) as $term) { + /** @var \Drupal\taxonomy\TermInterface $term */ + $term = $this->entityRepository->getTranslationFromContext($term); + $breadcrumb->addCacheableDependency($term); + $links[] = Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()]); + } + + if (!$links || '/' . $links[0]->getUrl()->getInternalPath() !== $this->configFactory->get('system.site')->get('page.front')) { + array_unshift($links, Link::createFromRoute($this->t('Home'), '')); + } + + return $breadcrumb->setLinks($links); + } + +} diff --git a/modules/thunder_gqls/tests/src/Traits/ThunderGqlsTestTrait.php b/modules/thunder_gqls/tests/src/Traits/ThunderGqlsTestTrait.php index fc4025da5..0a3001ed3 100644 --- a/modules/thunder_gqls/tests/src/Traits/ThunderGqlsTestTrait.php +++ b/modules/thunder_gqls/tests/src/Traits/ThunderGqlsTestTrait.php @@ -31,7 +31,11 @@ protected function runAndTestQuery(string $schema): void { $expectedData = $this->jsonDecode($this->getExpectedResponseFromFile($schema))['data']; - $this->assertEqualsCanonicalizing($expectedData, $responseData); + $this->assertEqualsCanonicalizing( + $expectedData, + $responseData, + 'The expected schema for "' . $schema . '" did not match the result.' + ); } /** diff --git a/modules/thunder_news_article/src/Breadcrumb/ThunderNewsArticleBreadcrumbBuilder.php b/modules/thunder_news_article/src/Breadcrumb/ThunderNewsArticleBreadcrumbBuilder.php new file mode 100644 index 000000000..3bc4e4500 --- /dev/null +++ b/modules/thunder_news_article/src/Breadcrumb/ThunderNewsArticleBreadcrumbBuilder.php @@ -0,0 +1,37 @@ +getParameters()->all(); + return ($route_match->getRouteName() === 'entity.node.canonical') && is_object($parameters['node']) && $parameters['node']->getType() === 'news_article' && !empty($parameters['node']->field_channel->entity); + } + + /** + * {@inheritdoc} + */ + protected function getCurrentTerm(RouteMatchInterface $route_match, Breadcrumb $breadcrumb): TermInterface { + /** @var \Drupal\node\Entity\Node $node */ + $node = $route_match->getParameter('node'); + $breadcrumb->addCacheableDependency($node); + + /** @var \Drupal\taxonomy\Entity\Term $term */ + $term = $node->field_channel->entity; + return $term; + } + +} diff --git a/modules/thunder_news_article/thunder_news_article.info.yml b/modules/thunder_news_article/thunder_news_article.info.yml index 036e452e0..303389952 100644 --- a/modules/thunder_news_article/thunder_news_article.info.yml +++ b/modules/thunder_news_article/thunder_news_article.info.yml @@ -5,3 +5,4 @@ core_version_requirement: ^10 package: Thunder dependencies: - drupal:node + - thunder:thunder_article diff --git a/modules/thunder_news_article/thunder_news_article.services.yml b/modules/thunder_news_article/thunder_news_article.services.yml new file mode 100644 index 000000000..1e3b66f5f --- /dev/null +++ b/modules/thunder_news_article/thunder_news_article.services.yml @@ -0,0 +1,6 @@ +services: + thunder_news_article.breadcrumb.default: + class: Drupal\thunder_news_article\Breadcrumb\ThunderNewsArticleBreadcrumbBuilder + arguments: ['@entity_type.manager', '@entity.repository', '@config.factory'] + tags: + - { name: breadcrumb_builder, priority: 100 }