Je souhaite obtenir tous les termes de taxonomie dans la langue $lang
, L'extrait suivant fonctionne correctement et renvoie tous les termes du code $lang
.
$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', "news_category");
$query->condition('langcode', $lang);
$tids = $query->execute();
//$terms = \Drupal\taxonomy\Entity\Term::loadMultiple($tids);
return new JsonResponse($tids);
Ensuite, je veux obtenir des résultats afin que dans la liste de taxonomie qu'ils soient, essayez de les trier avec $query->sort('weight','ASC');
mais avec l'extrait de code suivant, les résultats sont les mêmes avant d'ajouter le tri.
$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', "news_category");
$query->condition('langcode', $lang);
$query->sort('weight','ASC');
$tids = $query->execute();
//$terms = \Drupal\taxonomy\Entity\Term::loadMultiple($tids);
return new JsonResponse($tids);
Quelqu'un sait-il où est le problème? Comment puis-je obtenir des termes afin qu'ils soient dans la liste de taxonomie?
La liste de présentation de la taxonomie utilise quelque chose comme:
->sort('weight', 'ASC')
->sort('name', 'ASC')
Si cela ne fonctionne pas pour vous, jetez un œil à \Drupal\taxonomy\TermStorage::loadTree
Comme cela a été suggéré précédemment, jetez un œil à \Drupal\taxonomy\TermStorage::loadTree
est utile. La requête d'entité ne donne accès qu'aux propriétés de l'entité et à ses valeurs d'API de champ. Le poids du terme étant disponible dans le taxonomy_term_field_data
table, il sera également disponible pour entityQuery. Cependant, toute imbrication de termes, également appelée hiérarchie, nécessitera l'accès à taxonomy_term_hierarchy
table. Cela nécessiterait une requête de base de données.
Vous pouvez y accéder via une requête de base de données, comme vu dans loadTree
, ligne 204:
$query = \Drupal::database()->select('taxonomy_term_field_data', 't');
$query->join('taxonomy_term_hierarchy', 'h', 'h.tid = t.tid');
$result = $query
->addTag('taxonomy_term_access')
->fields('t')
->fields('h', array('parent'))
->condition('t.vid', $vid)
->condition('t.default_langcode', 1)
->orderBy('t.weight')
->orderBy('t.name')
->execute();
J'ai mis à jour la requête pour utiliser le conteneur de Drupal, plutôt que l'injection de dépendance afin qu'elle puisse être utilisée plus facilement. Vous devriez pouvoir le modifier pour l'adapter à vos besoins si Entity Query ne fonctionne pas comme vous le souhaitez.
C’est un exemple.
$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', "VOCABULARY_ID");
$query->sort('weight');
$tids = $query->execute();