web-dev-qa-db-ja.com

翻訳がない場合、多言語ビューは非表示になります

私の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を追加していることがわかります。言語フィルターを追加すると問題が発生すると思いますか?

2
Marko Kunic

問題は、翻訳できないフィールドのあるビューで条件を実行していて、ユーザーのおかげでビューが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ファイルにある必要があります

2
Marko Kunic

「フィルター基準」で、「コンテンツ:翻訳言語」を選択し、「ページ用に選択されたインターフェーステキスト言語」を選択します。

パスに「/ es /」という言語コードが含まれている場合、スペイン語のコンテンツはフィルタリングされます。また、langcodeが指定されていない場合は、サイトのデフォルトの言語になります。

0
Erik