Issue #2765297 by mohit_aghera, joseph.olstad, sylus, alexpott, ducktape, anmolgoyal74, heikki, kishor_kolekar, kriboogh, googletorp, dnotes, mpp, catch, Lendude, Berdir, borisson_, xjm: Return translated term name on views "Content: Has taxonomy term ID (with depth)"
(cherry picked from commit 1bcc7f34e6
)
merge-requests/7078/head
parent
8ac6759551
commit
46564ee733
|
@ -3,6 +3,7 @@
|
||||||
namespace Drupal\taxonomy\Plugin\views\argument;
|
namespace Drupal\taxonomy\Plugin\views\argument;
|
||||||
|
|
||||||
use Drupal\Core\Entity\EntityStorageInterface;
|
use Drupal\Core\Entity\EntityStorageInterface;
|
||||||
|
use Drupal\Core\Entity\EntityRepositoryInterface;
|
||||||
use Drupal\Core\Form\FormStateInterface;
|
use Drupal\Core\Form\FormStateInterface;
|
||||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||||
use Drupal\taxonomy\TaxonomyIndexDepthQueryTrait;
|
use Drupal\taxonomy\TaxonomyIndexDepthQueryTrait;
|
||||||
|
@ -26,16 +27,26 @@ class IndexTidDepth extends ArgumentPluginBase implements ContainerFactoryPlugin
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Drupal\Core\Entity\EntityStorageInterface
|
* @var \Drupal\Core\Entity\EntityStorageInterface
|
||||||
|
*
|
||||||
|
* @deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. There is no
|
||||||
|
* replacement.
|
||||||
|
*
|
||||||
|
* @see https://www.drupal.org/node/3427843
|
||||||
*/
|
*/
|
||||||
protected $termStorage;
|
protected $termStorage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityStorageInterface $termStorage) {
|
public function __construct(array $configuration, $plugin_id, $plugin_definition, protected EntityStorageInterface|EntityRepositoryInterface $entityRepository) {
|
||||||
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
||||||
|
|
||||||
$this->termStorage = $termStorage;
|
if ($entityRepository instanceof EntityStorageInterface) {
|
||||||
|
// @phpstan-ignore-next-line
|
||||||
|
$this->termStorage = $entityRepository;
|
||||||
|
@trigger_error('Calling ' . __CLASS__ . '::__construct() with the $termStorage argument as \Drupal\Core\Entity\EntityStorageInterface is deprecated in drupal:10.3.0 and it will require Drupal\Core\Entity\EntityRepositoryInterface in drupal:11.0.0. See https://www.drupal.org/node/3427843', E_USER_DEPRECATED);
|
||||||
|
$this->entityRepository = \Drupal::service('entity.repository');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,7 +57,7 @@ class IndexTidDepth extends ArgumentPluginBase implements ContainerFactoryPlugin
|
||||||
$configuration,
|
$configuration,
|
||||||
$plugin_id,
|
$plugin_id,
|
||||||
$plugin_definition,
|
$plugin_definition,
|
||||||
$container->get('entity_type.manager')->getStorage('taxonomy_term')
|
$container->get('entity.repository')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,9 +125,9 @@ class IndexTidDepth extends ArgumentPluginBase implements ContainerFactoryPlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
public function title() {
|
public function title() {
|
||||||
$term = $this->termStorage->load($this->argument);
|
$term = $this->entityRepository->getCanonical('taxonomy_term', $this->argument);
|
||||||
if (!empty($term)) {
|
if (!empty($term)) {
|
||||||
return $term->getName();
|
return $term->label();
|
||||||
}
|
}
|
||||||
// TODO review text
|
// TODO review text
|
||||||
return $this->t('No name');
|
return $this->t('No name');
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace Drupal\taxonomy\Plugin\views\argument;
|
namespace Drupal\taxonomy\Plugin\views\argument;
|
||||||
|
|
||||||
|
use Drupal\Core\Entity\EntityRepositoryInterface;
|
||||||
use Drupal\Core\Entity\EntityStorageInterface;
|
use Drupal\Core\Entity\EntityStorageInterface;
|
||||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||||
use Drupal\views\Attribute\ViewsArgument;
|
use Drupal\views\Attribute\ViewsArgument;
|
||||||
|
@ -20,16 +21,25 @@ class Taxonomy extends NumericArgument implements ContainerFactoryPluginInterfac
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Drupal\Core\Entity\EntityStorageInterface
|
* @var \Drupal\Core\Entity\EntityStorageInterface
|
||||||
|
*
|
||||||
|
* @deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. There is no
|
||||||
|
* replacement.
|
||||||
|
*
|
||||||
|
* @see https://www.drupal.org/node/3427843
|
||||||
*/
|
*/
|
||||||
protected $termStorage;
|
protected $termStorage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityStorageInterface $term_storage) {
|
public function __construct(array $configuration, $plugin_id, $plugin_definition, protected EntityStorageInterface|EntityRepositoryInterface $entityRepository) {
|
||||||
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
||||||
|
if ($entityRepository instanceof EntityStorageInterface) {
|
||||||
$this->termStorage = $term_storage;
|
// @phpstan-ignore-next-line
|
||||||
|
$this->termStorage = $this->entityRepository;
|
||||||
|
@trigger_error('Calling ' . __CLASS__ . '::__construct() with the $termStorage argument as \Drupal\Core\Entity\EntityStorageInterface is deprecated in drupal:10.3.0 and it will require Drupal\Core\Entity\EntityRepositoryInterface in drupal:11.0.0. See https://www.drupal.org/node/3427843', E_USER_DEPRECATED);
|
||||||
|
$this->entityRepository = \Drupal::service('entity.repository');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,7 +50,7 @@ class Taxonomy extends NumericArgument implements ContainerFactoryPluginInterfac
|
||||||
$configuration,
|
$configuration,
|
||||||
$plugin_id,
|
$plugin_id,
|
||||||
$plugin_definition,
|
$plugin_definition,
|
||||||
$container->get('entity_type.manager')->getStorage('taxonomy_term')
|
$container->get('entity.repository')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,9 +60,9 @@ class Taxonomy extends NumericArgument implements ContainerFactoryPluginInterfac
|
||||||
public function title() {
|
public function title() {
|
||||||
// There might be no valid argument.
|
// There might be no valid argument.
|
||||||
if ($this->argument) {
|
if ($this->argument) {
|
||||||
$term = $this->termStorage->load($this->argument);
|
$term = $this->entityRepository->getCanonical('taxonomy_term', $this->argument);
|
||||||
if (!empty($term)) {
|
if (!empty($term)) {
|
||||||
return $term->getName();
|
return $term->label();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO review text
|
// TODO review text
|
||||||
|
|
|
@ -112,6 +112,7 @@ function taxonomy_tokens($type, $tokens, array $data, array $options, Bubbleable
|
||||||
$replacements = [];
|
$replacements = [];
|
||||||
if ($type == 'term' && !empty($data['term'])) {
|
if ($type == 'term' && !empty($data['term'])) {
|
||||||
$term = $data['term'];
|
$term = $data['term'];
|
||||||
|
$term = \Drupal::service('entity.repository')->getTranslationFromContext($term, isset($options['langcode']) ? $options['langcode'] : NULL);
|
||||||
|
|
||||||
foreach ($tokens as $name => $original) {
|
foreach ($tokens as $name => $original) {
|
||||||
switch ($name) {
|
switch ($name) {
|
||||||
|
@ -120,7 +121,7 @@ function taxonomy_tokens($type, $tokens, array $data, array $options, Bubbleable
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'name':
|
case 'name':
|
||||||
$replacements[$original] = $term->getName();
|
$replacements[$original] = $term->label();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'description':
|
case 'description':
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Drupal\taxonomy_test\Plugin\views\argument;
|
||||||
|
|
||||||
|
use Drupal\Core\Entity\EntityStorageInterface;
|
||||||
|
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
|
||||||
|
use Drupal\taxonomy\Plugin\views\argument\Taxonomy;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test argument handler for testing deprecation in IndexTidDepth plugin.
|
||||||
|
*
|
||||||
|
* @ingroup views_argument_handlers
|
||||||
|
*
|
||||||
|
* @ViewsArgument("taxonomy_views_argument_test")
|
||||||
|
*/
|
||||||
|
class TaxonomyViewsArgumentTest extends Taxonomy {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs new IndexTidDepthTestPlugin object.
|
||||||
|
*/
|
||||||
|
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityStorageInterface $term_storage, protected EntityTypeBundleInfoInterface $entityTypeBundleInfo) {
|
||||||
|
parent::__construct($configuration, $plugin_id, $plugin_definition, $term_storage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
|
||||||
|
return new static(
|
||||||
|
$configuration,
|
||||||
|
$plugin_id,
|
||||||
|
$plugin_definition,
|
||||||
|
$container->get('entity_type.manager')->getStorage('taxonomy_term'),
|
||||||
|
$container->get('entity_type.bundle.info'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,337 @@
|
||||||
|
langcode: en
|
||||||
|
status: true
|
||||||
|
dependencies:
|
||||||
|
config:
|
||||||
|
- core.entity_view_mode.node.teaser
|
||||||
|
module:
|
||||||
|
- node
|
||||||
|
- taxonomy
|
||||||
|
- user
|
||||||
|
id: taxonomy_translated_term_name_test
|
||||||
|
label: 'Taxonomy Translated Term Name Test'
|
||||||
|
module: taxonomy
|
||||||
|
description: 'Content belonging to a certain taxonomy term.'
|
||||||
|
tag: default
|
||||||
|
base_table: node_field_data
|
||||||
|
base_field: nid
|
||||||
|
display:
|
||||||
|
default:
|
||||||
|
id: default
|
||||||
|
display_title: Default
|
||||||
|
display_plugin: default
|
||||||
|
position: 0
|
||||||
|
display_options:
|
||||||
|
query:
|
||||||
|
type: views_query
|
||||||
|
options:
|
||||||
|
query_comment: ''
|
||||||
|
disable_sql_rewrite: false
|
||||||
|
distinct: false
|
||||||
|
replica: false
|
||||||
|
query_tags: { }
|
||||||
|
access:
|
||||||
|
type: perm
|
||||||
|
options:
|
||||||
|
perm: 'access content'
|
||||||
|
cache:
|
||||||
|
type: tag
|
||||||
|
options: { }
|
||||||
|
exposed_form:
|
||||||
|
type: basic
|
||||||
|
options:
|
||||||
|
submit_button: Apply
|
||||||
|
reset_button: false
|
||||||
|
reset_button_label: Reset
|
||||||
|
exposed_sorts_label: 'Sort by'
|
||||||
|
expose_sort_order: true
|
||||||
|
sort_asc_label: Asc
|
||||||
|
sort_desc_label: Desc
|
||||||
|
pager:
|
||||||
|
type: mini
|
||||||
|
options:
|
||||||
|
items_per_page: 10
|
||||||
|
offset: 0
|
||||||
|
id: 0
|
||||||
|
total_pages: 0
|
||||||
|
expose:
|
||||||
|
items_per_page: false
|
||||||
|
items_per_page_label: 'Items per page'
|
||||||
|
items_per_page_options: '5, 10, 25, 50'
|
||||||
|
items_per_page_options_all: false
|
||||||
|
items_per_page_options_all_label: '- All -'
|
||||||
|
offset: false
|
||||||
|
offset_label: Offset
|
||||||
|
tags:
|
||||||
|
previous: ‹‹
|
||||||
|
next: ››
|
||||||
|
sorts:
|
||||||
|
sticky:
|
||||||
|
id: sticky
|
||||||
|
table: taxonomy_index
|
||||||
|
field: sticky
|
||||||
|
order: DESC
|
||||||
|
plugin_id: standard
|
||||||
|
relationship: none
|
||||||
|
group_type: group
|
||||||
|
admin_label: ''
|
||||||
|
exposed: false
|
||||||
|
expose:
|
||||||
|
label: ''
|
||||||
|
created:
|
||||||
|
id: created
|
||||||
|
table: taxonomy_index
|
||||||
|
field: created
|
||||||
|
order: DESC
|
||||||
|
plugin_id: date
|
||||||
|
relationship: none
|
||||||
|
group_type: group
|
||||||
|
admin_label: ''
|
||||||
|
exposed: false
|
||||||
|
expose:
|
||||||
|
label: ''
|
||||||
|
granularity: second
|
||||||
|
arguments:
|
||||||
|
term_node_tid_depth:
|
||||||
|
id: term_node_tid_depth
|
||||||
|
table: node_field_data
|
||||||
|
field: term_node_tid_depth
|
||||||
|
relationship: none
|
||||||
|
group_type: group
|
||||||
|
admin_label: ''
|
||||||
|
default_action: ignore
|
||||||
|
exception:
|
||||||
|
value: all
|
||||||
|
title_enable: false
|
||||||
|
title: All
|
||||||
|
title_enable: true
|
||||||
|
title: '{{ arguments.term_node_tid_depth }}'
|
||||||
|
default_argument_type: fixed
|
||||||
|
default_argument_options:
|
||||||
|
argument: ''
|
||||||
|
summary_options:
|
||||||
|
base_path: ''
|
||||||
|
count: true
|
||||||
|
items_per_page: 25
|
||||||
|
override: false
|
||||||
|
summary:
|
||||||
|
sort_order: asc
|
||||||
|
number_of_records: 0
|
||||||
|
format: default_summary
|
||||||
|
specify_validation: true
|
||||||
|
validate:
|
||||||
|
type: 'entity:taxonomy_term'
|
||||||
|
fail: 'not found'
|
||||||
|
validate_options:
|
||||||
|
access: true
|
||||||
|
operation: view
|
||||||
|
multiple: 0
|
||||||
|
bundles: { }
|
||||||
|
depth: 2
|
||||||
|
break_phrase: false
|
||||||
|
use_taxonomy_term_path: false
|
||||||
|
entity_type: node
|
||||||
|
plugin_id: taxonomy_index_tid_depth
|
||||||
|
filters:
|
||||||
|
langcode:
|
||||||
|
id: langcode
|
||||||
|
table: node_field_data
|
||||||
|
field: langcode
|
||||||
|
relationship: none
|
||||||
|
group_type: group
|
||||||
|
admin_label: ''
|
||||||
|
operator: in
|
||||||
|
value:
|
||||||
|
'***LANGUAGE_language_content***': '***LANGUAGE_language_content***'
|
||||||
|
group: 1
|
||||||
|
exposed: false
|
||||||
|
expose:
|
||||||
|
operator_id: ''
|
||||||
|
label: ''
|
||||||
|
description: ''
|
||||||
|
use_operator: false
|
||||||
|
operator: ''
|
||||||
|
identifier: ''
|
||||||
|
required: false
|
||||||
|
remember: false
|
||||||
|
multiple: false
|
||||||
|
remember_roles:
|
||||||
|
authenticated: authenticated
|
||||||
|
reduce: false
|
||||||
|
operator_limit_selection: false
|
||||||
|
operator_list: { }
|
||||||
|
is_grouped: false
|
||||||
|
group_info:
|
||||||
|
label: ''
|
||||||
|
description: ''
|
||||||
|
identifier: ''
|
||||||
|
optional: true
|
||||||
|
widget: select
|
||||||
|
multiple: false
|
||||||
|
remember: false
|
||||||
|
default_group: All
|
||||||
|
default_group_multiple: { }
|
||||||
|
group_items: { }
|
||||||
|
plugin_id: language
|
||||||
|
entity_type: node
|
||||||
|
entity_field: langcode
|
||||||
|
status:
|
||||||
|
id: status
|
||||||
|
table: taxonomy_index
|
||||||
|
field: status
|
||||||
|
relationship: none
|
||||||
|
group_type: group
|
||||||
|
admin_label: ''
|
||||||
|
operator: '='
|
||||||
|
value: '1'
|
||||||
|
group: 1
|
||||||
|
exposed: false
|
||||||
|
expose:
|
||||||
|
operator_id: ''
|
||||||
|
label: ''
|
||||||
|
description: ''
|
||||||
|
use_operator: false
|
||||||
|
operator: ''
|
||||||
|
identifier: ''
|
||||||
|
required: false
|
||||||
|
remember: false
|
||||||
|
multiple: false
|
||||||
|
remember_roles:
|
||||||
|
authenticated: authenticated
|
||||||
|
operator_limit_selection: false
|
||||||
|
operator_list: { }
|
||||||
|
is_grouped: false
|
||||||
|
group_info:
|
||||||
|
label: ''
|
||||||
|
description: ''
|
||||||
|
identifier: ''
|
||||||
|
optional: true
|
||||||
|
widget: select
|
||||||
|
multiple: false
|
||||||
|
remember: false
|
||||||
|
default_group: All
|
||||||
|
default_group_multiple: { }
|
||||||
|
group_items: { }
|
||||||
|
plugin_id: boolean
|
||||||
|
style:
|
||||||
|
type: default
|
||||||
|
options:
|
||||||
|
grouping: { }
|
||||||
|
row_class: ''
|
||||||
|
default_row_class: true
|
||||||
|
uses_fields: false
|
||||||
|
row:
|
||||||
|
type: 'entity:node'
|
||||||
|
options:
|
||||||
|
view_mode: teaser
|
||||||
|
header:
|
||||||
|
entity_taxonomy_term:
|
||||||
|
id: entity_taxonomy_term
|
||||||
|
table: views
|
||||||
|
field: entity_taxonomy_term
|
||||||
|
relationship: none
|
||||||
|
group_type: group
|
||||||
|
admin_label: ''
|
||||||
|
empty: true
|
||||||
|
tokenize: true
|
||||||
|
target: '{{ raw_arguments.tid }}'
|
||||||
|
view_mode: full
|
||||||
|
bypass_access: false
|
||||||
|
plugin_id: entity
|
||||||
|
footer: { }
|
||||||
|
empty: { }
|
||||||
|
relationships: { }
|
||||||
|
fields: { }
|
||||||
|
display_extenders: { }
|
||||||
|
link_url: ''
|
||||||
|
link_display: page_1
|
||||||
|
cache_metadata:
|
||||||
|
contexts:
|
||||||
|
- 'languages:language_interface'
|
||||||
|
- url
|
||||||
|
- url.query_args
|
||||||
|
- 'user.node_grants:view'
|
||||||
|
- user.permissions
|
||||||
|
max-age: -1
|
||||||
|
tags: { }
|
||||||
|
page_1:
|
||||||
|
id: page_1
|
||||||
|
display_title: Page
|
||||||
|
display_plugin: page
|
||||||
|
position: 1
|
||||||
|
display_options:
|
||||||
|
query:
|
||||||
|
type: views_query
|
||||||
|
options: { }
|
||||||
|
display_extenders: { }
|
||||||
|
path: taxonomy/test/%
|
||||||
|
cache_metadata:
|
||||||
|
max-age: -1
|
||||||
|
contexts: { }
|
||||||
|
tags: { }
|
||||||
|
page_2:
|
||||||
|
id: page_2
|
||||||
|
display_title: Page
|
||||||
|
display_plugin: page
|
||||||
|
position: 1
|
||||||
|
display_options:
|
||||||
|
arguments:
|
||||||
|
tid:
|
||||||
|
id: tid
|
||||||
|
table: taxonomy_term_field_data
|
||||||
|
field: tid
|
||||||
|
relationship: term_node_tid
|
||||||
|
group_type: group
|
||||||
|
admin_label: ''
|
||||||
|
entity_type: taxonomy_term
|
||||||
|
entity_field: tid
|
||||||
|
plugin_id: taxonomy
|
||||||
|
default_action: ignore
|
||||||
|
exception:
|
||||||
|
value: all
|
||||||
|
title_enable: false
|
||||||
|
title: All
|
||||||
|
title_enable: false
|
||||||
|
title: ''
|
||||||
|
default_argument_type: fixed
|
||||||
|
default_argument_options:
|
||||||
|
argument: ''
|
||||||
|
summary_options:
|
||||||
|
base_path: ''
|
||||||
|
count: true
|
||||||
|
override: false
|
||||||
|
items_per_page: 25
|
||||||
|
summary:
|
||||||
|
sort_order: asc
|
||||||
|
number_of_records: 0
|
||||||
|
format: default_summary
|
||||||
|
specify_validation: false
|
||||||
|
validate:
|
||||||
|
type: none
|
||||||
|
fail: 'not found'
|
||||||
|
validate_options: { }
|
||||||
|
break_phrase: false
|
||||||
|
not: false
|
||||||
|
query:
|
||||||
|
type: views_query
|
||||||
|
options: { }
|
||||||
|
defaults:
|
||||||
|
relationships: false
|
||||||
|
arguments: false
|
||||||
|
relationships:
|
||||||
|
term_node_tid:
|
||||||
|
id: term_node_tid
|
||||||
|
table: node_field_data
|
||||||
|
field: term_node_tid
|
||||||
|
relationship: none
|
||||||
|
group_type: group
|
||||||
|
admin_label: term
|
||||||
|
entity_type: node
|
||||||
|
plugin_id: node_term_data
|
||||||
|
required: false
|
||||||
|
vids: { }
|
||||||
|
display_extenders: { }
|
||||||
|
path: taxonomy/test2/%
|
||||||
|
cache_metadata:
|
||||||
|
max-age: -1
|
||||||
|
contexts: { }
|
||||||
|
tags: { }
|
|
@ -0,0 +1,132 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Drupal\Tests\taxonomy\Functional\Views;
|
||||||
|
|
||||||
|
use Drupal\Core\Url;
|
||||||
|
use Drupal\Tests\taxonomy\Functional\TaxonomyTranslationTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for views translation.
|
||||||
|
*
|
||||||
|
* @group taxonomy
|
||||||
|
*/
|
||||||
|
class TermTranslationViewsTest extends TaxonomyTestBase {
|
||||||
|
|
||||||
|
use TaxonomyTranslationTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Term to translated term mapping.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $termTranslationMap = [
|
||||||
|
'one' => 'translatedOne',
|
||||||
|
'two' => 'translatedTwo',
|
||||||
|
'three' => 'translatedThree',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created terms.
|
||||||
|
*
|
||||||
|
* @var \Drupal\taxonomy\Entity\Term[]
|
||||||
|
*/
|
||||||
|
protected $terms = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $modules = ['taxonomy', 'language', 'content_translation', 'views'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Views used by this test.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public static $testViews = ['taxonomy_translated_term_name_test'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected $defaultTheme = 'stark';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Language object.
|
||||||
|
*
|
||||||
|
* @var \Drupal\Core\Language\LanguageInterface|null
|
||||||
|
*/
|
||||||
|
protected $translationLanguage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function setUp($import_test_views = TRUE, $modules = []): void {
|
||||||
|
parent::setUp($import_test_views, $modules);
|
||||||
|
$this->setupLanguages();
|
||||||
|
$this->enableTranslation();
|
||||||
|
$this->setUpTerms();
|
||||||
|
$this->translationLanguage = \Drupal::languageManager()->getLanguage($this->translateToLangcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure that proper translation is returned when contextual filter.
|
||||||
|
*
|
||||||
|
* Taxonomy term: Term ID & Content: Has taxonomy term ID (with depth)
|
||||||
|
* contextual filters are enabled for two separate view modes.
|
||||||
|
*/
|
||||||
|
public function testTermsTranslationWithContextualFilter() {
|
||||||
|
$this->drupalLogin($this->rootUser);
|
||||||
|
|
||||||
|
foreach ($this->terms as $term) {
|
||||||
|
// Test with "Content: Has taxonomy term ID (with depth)" contextual filter.
|
||||||
|
// Generate base language url and send request.
|
||||||
|
$url = Url::fromRoute('view.taxonomy_translated_term_name_test.page_1', ['arg_0' => $term->id()])->toString();
|
||||||
|
$this->drupalGet($url);
|
||||||
|
$this->assertSession()->pageTextContains($term->label());
|
||||||
|
|
||||||
|
// Generate translation URL and send request.
|
||||||
|
$url = Url::fromRoute('view.taxonomy_translated_term_name_test.page_1', ['arg_0' => $term->id()], ['language' => $this->translationLanguage])->toString();
|
||||||
|
$this->drupalGet($url);
|
||||||
|
$this->assertSession()->pageTextContains($this->termTranslationMap[$term->label()]);
|
||||||
|
|
||||||
|
// Test with "Taxonomy term: Term ID" contextual filter.
|
||||||
|
// Generate base language url and send request.
|
||||||
|
$url = Url::fromRoute('view.taxonomy_translated_term_name_test.page_2', ['arg_0' => $term->id()])->toString();
|
||||||
|
$this->drupalGet($url);
|
||||||
|
$this->assertSession()->pageTextContains($term->label());
|
||||||
|
|
||||||
|
// Generate translation URL and send request.
|
||||||
|
$url = Url::fromRoute('view.taxonomy_translated_term_name_test.page_2', ['arg_0' => $term->id()], ['language' => $this->translationLanguage])->toString();
|
||||||
|
$this->drupalGet($url);
|
||||||
|
$this->assertSession()->pageTextContains($this->termTranslationMap[$term->label()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup translated terms in a hierarchy.
|
||||||
|
*/
|
||||||
|
protected function setUpTerms() {
|
||||||
|
$parent_vid = 0;
|
||||||
|
foreach ($this->termTranslationMap as $name => $translation) {
|
||||||
|
|
||||||
|
$term = $this->createTerm([
|
||||||
|
'name' => $name,
|
||||||
|
'langcode' => $this->baseLangcode,
|
||||||
|
'parent' => $parent_vid,
|
||||||
|
'vid' => $this->vocabulary->id(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$term->addTranslation($this->translateToLangcode, [
|
||||||
|
'name' => $translation,
|
||||||
|
]);
|
||||||
|
$term->save();
|
||||||
|
|
||||||
|
// Each term is nested under the last.
|
||||||
|
$parent_vid = $term->id();
|
||||||
|
|
||||||
|
$this->terms[] = $term;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Drupal\Tests\taxonomy\Kernel\Views;
|
||||||
|
|
||||||
|
use Drupal\KernelTests\KernelTestBase;
|
||||||
|
use Drupal\taxonomy_test\Plugin\views\argument\TaxonomyViewsArgumentTest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests deprecation messages in views argument plugins.
|
||||||
|
*
|
||||||
|
* @group taxonomy
|
||||||
|
*/
|
||||||
|
class ViewsArgumentDeprecationTest extends KernelTestBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected static $modules = [
|
||||||
|
'system',
|
||||||
|
'taxonomy',
|
||||||
|
'taxonomy_test',
|
||||||
|
'views',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the deprecation message in ViewsArgument plugin.
|
||||||
|
*
|
||||||
|
* @group legacy
|
||||||
|
*/
|
||||||
|
public function testDeprecation(): void {
|
||||||
|
$this->expectDeprecation('Calling Drupal\taxonomy\Plugin\views\argument\Taxonomy::__construct() with the $termStorage argument as \Drupal\Core\Entity\EntityStorageInterface is deprecated in drupal:10.3.0 and it will require Drupal\Core\Entity\EntityRepositoryInterface in drupal:11.0.0. See https://www.drupal.org/node/3427843');
|
||||||
|
$plugin = \Drupal::service('plugin.manager.views.argument')->createInstance('taxonomy_views_argument_test', []);
|
||||||
|
$this->assertInstanceOf(TaxonomyViewsArgumentTest::class, $plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue