From 78e257a1abf7870e9feac4cec6075f12c44bb35d Mon Sep 17 00:00:00 2001
From: Vladimir Roudakov <44088-VladimirAus@users.noreply.drupalcode.org>
Date: Sun, 5 Jan 2025 13:39:59 +0000
Subject: [PATCH] Issue #3346925 by vladimiraus, mkalkbrenner: Term translation
 errors and performance issues

---
 term_reference_tree.module | 61 +++++++++++++++++---------------------
 1 file changed, 27 insertions(+), 34 deletions(-)

diff --git a/term_reference_tree.module b/term_reference_tree.module
index 2677b21..ff9fbe2 100644
--- a/term_reference_tree.module
+++ b/term_reference_tree.module
@@ -321,10 +321,12 @@ function _term_reference_tree_get_children($tid, $vid) {
   $table = 'taxonomy_term_field_data';
   $alias = 't';
 
+  $default_langcode = \Drupal::languageManager()->getDefaultLanguage()->getId();
+
   $query = \Drupal::database()
     ->select($table, $alias);
   $query->join('taxonomy_term__parent', 'p', 't.tid = p.entity_id');
-  $query->fields('t', ['tid', 'name', 'status']);
+  $query->fields('t', ['tid', 'name', 'langcode', 'status']);
   $query->addField('t', 'vid', 'vocabulary_machine_name');
   $query
     ->condition('t.vid', $vid)
@@ -334,11 +336,21 @@ function _term_reference_tree_get_children($tid, $vid) {
     ->addTag('term_reference_tree_get_children')
     ->orderBy('t.weight')
     ->orderBy('t.name');
+
+  if (\Drupal::moduleHandler()->moduleExists('locale')) {
+    $query->condition('t.langcode', [
+      \Drupal::languageManager()->getCurrentLanguage()->getId(),
+      $default_langcode,
+    ], 'IN');
+  }
+  
   $result = $query->execute();
 
   $terms = [];
   while ($term = $result->fetchObject()) {
-    $terms[$term->tid] = $term;
+    if (!isset($terms[$term->tid]) || $terms[$term->tid]->langcode === $default_langcode) {
+      $terms[$term->tid] = $term;
+    }
   }
 
   return $terms;
@@ -442,25 +454,11 @@ function _term_reference_tree_build_level($element, $term, $form_state, $value,
 function _term_reference_tree_build_item($element, $term, $form_state, $value, $max_choices, $parent_tids, $parent, $depth) {
   $leaves_only = FALSE;
 
-  $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
-  $t = NULL;
-  if (\Drupal::moduleHandler()->moduleExists('locale') && !empty($term->tid)) {
-    $t = \Drupal::entityTypeManager()
-      ->getStorage('taxonomy_term')
-      ->load($term->tid);
-    if ($t && $t->hasTranslation($langcode)) {
-      $term_name = $t->getTranslation($langcode)->label();
-    }
-  }
-  if (empty($term_name)) {
-    $term_name = $term->name;
-  }
-
   $container = [
     '#type' => 'checkbox_tree_item',
     '#max_choices' => $max_choices,
     '#leaves_only' => $leaves_only,
-    '#term_name' => $term_name,
+    '#term_name' => $term->name,
     '#level_start_minimized' => FALSE,
     '#select_parents' => $element['#select_parents'],
     '#depth' => $depth,
@@ -469,7 +467,7 @@ function _term_reference_tree_build_item($element, $term, $form_state, $value, $
   if (!$element['#leaves_only'] || count($term->children) == 0) {
     $e = [
       '#type' => ($max_choices == 1) ? 'radio' : 'checkbox',
-      '#title' => $term_name,
+      '#title' => $term->name,
       '#on_value' => $term->tid,
       '#off_value' => 0,
       '#return_value' => $term->tid,
@@ -490,7 +488,7 @@ function _term_reference_tree_build_item($element, $term, $form_state, $value, $
   else {
     $e = [
       '#type' => 'checkbox_tree_label',
-      '#value' => $term_name,
+      '#value' =>  $term->name,
     ];
   }
 
@@ -582,6 +580,8 @@ function _term_reference_tree_get_parent($tid) {
 
 /**
  * Helper function to output a single level of the term reference tree display.
+ * 
+ * @throws \Drupal\Core\Entity\EntityMalformedException
  */
 function _term_reference_tree_output_list_level(&$element, &$tree) {
   $tree_element = [];
@@ -600,26 +600,19 @@ function _term_reference_tree_output_list_level(&$element, &$tree) {
         if (!$term instanceof TermInterface) {
           continue;
         }
-        $url = $term->toUrl();
-        $uri['options']['html'] = TRUE;
-        $class = $item['selected'] ? 'selected' : 'unselected';
 
-        $t = NULL;
-        $term_name = '';
-        if (\Drupal::moduleHandler()
-          ->moduleExists('locale') && !empty($term->tid)) {
-          $t = $term;
-          if ($t && $t->hasTranslation($langcode)) {
-            $term_name = $t->getTranslation($langcode)->label();
+        if (\Drupal::moduleHandler()->moduleExists('locale') && !empty($term->tid)) {
+          if ($term->hasTranslation($langcode)) {
+            $term = $term->getTranslation($langcode);
           }
         }
-        if (empty($term_name)) {
-          $term_name = $term->label();
-        }
+
+        $class = $item['selected'] ? 'selected' : 'unselected';
+        
         $tree_element['#items'][] = [
           '#type' => 'link',
-          '#title' => $term_name,
-          '#url' => $url,
+          '#title' => $term->label(),
+          '#url' => $term->toUrl(),
           '#attributes' => ['class' => [$class]],
         ];
         if (isset($item['children'])) {
-- 
GitLab