私のDrupal Webサイトには2つの言語があり、作成したブログビューは記事(コンテンツタイプ)をリストします。デフォルトの言語は英語です。
問題は、一部の記事がドイツ語のみであり、英語で見るとドイツ語の記事が表示されることです。
コンテンツ:翻訳言語に設定したフィルターを追加しようとしましたページ用に選択されたインターフェイステキスト言語しかし、ドイツ語のページでは、ドイツ語で作成された記事と、英語で作成されましたが、ドイツ語の翻訳がありません。
クエリ:
SELECT node_field_data.created AS node_field_data_created,
node_field_data.nid AS nid
FROM
{node_field_data} node_field_data
LEFT JOIN {node__field_content_type} node__field_content_type ON
node_field_data.nid = node__field_content_type.entity_id AND
(node__field_content_type.deleted = '0' AND
node__field_content_type.langcode = node_field_data.langcode)
WHERE (( (node_field_data.status = '1') AND (node_field_data.type IN
('article')) AND (node__field_content_type.field_content_type_value = '1')
))
ORDER BY node_field_data_created DESC
LIMIT 5 OFFSET 0
翻訳言語フィルターを使用したクエリ:
SELECT node_field_data.created AS node_field_data_created,
node_field_data.nid AS nid
FROM
{node_field_data} node_field_data
LEFT JOIN {node__field_content_type} node__field_content_type ON
node_field_data.nid = node__field_content_type.entity_id AND
(node__field_content_type.deleted = '0' AND
node__field_content_type.langcode = node_field_data.langcode)
LEFT JOIN {node__field_tags} node__field_tags ON node_field_data.nid =
node__field_tags.entity_id AND node__field_tags.field_tags_target_id = '4'
WHERE (( (node__field_tags.field_tags_target_id IS NULL) )AND((
(node_field_data.status = '1') AND (node_field_data.type IN ('article'))
AND (node__field_content_type.field_content_type_value = '1') AND
(node_field_data.langcode IN ('en')) )))
ORDER BY node_field_data_created DESC
LIMIT 5 OFFSET 0
クエリから、LEFT JOINがnode__field_content_type.langcode = node_field_data.langcodeを追加していることがわかります。言語フィルターを追加すると問題が発生すると思いますか?
問題は、翻訳できないフィールドのあるビューで条件を実行していて、ユーザーのおかげでビューがlangcode
に結合を追加しているということでした 4k4 この問題にリンクされており、 ここ 。
未翻訳のフィールドをビューから削除し、hook_views_query_alter
にフックして自分で関係を追加することで、これを修正しました。
<?php
use Drupal\views\ViewExecutable;
use Drupal\views\Plugin\views\query\QueryPluginBase;
function hook_views_query_alter(ViewExecutable $view,
QueryPluginBase $query)
{
if ($view->id() == 'blog') {
$definition = [
'table' => 'node__field_content_type',
'field' => 'entity_id',
'left_table' => 'node_field_data',
'left_field' => 'nid',
];
$join = Drupal::service('plugin.manager.views.join')->createInstance('standard', $definition);
$query->addRelationship('node__field_content_type', $join, 'node__field_content_type');
$query->addWhere('1', 'node__field_content_type.field_content_type_value', 1, '=');
}
}
また、このフックはMODULE.views_execution.inc
ファイルにある必要があります
「フィルター基準」で、「コンテンツ:翻訳言語」を選択し、「ページ用に選択されたインターフェーステキスト言語」を選択します。
パスに「/ es /」という言語コードが含まれている場合、スペイン語のコンテンツはフィルタリングされます。また、langcodeが指定されていない場合は、サイトのデフォルトの言語になります。