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