Uzyskaj listę wszystkich typów treści

10

Jak uzyskać listę wszystkich typów treści zdefiniowanych w witrynie Drupal 8?

W Drupal 7 było node_type_get_types(), ale było przestarzałe.

Próbowałem, Entity::loadMultiple()ale wydaje się, że to nie działa. Myślałem o utworzeniu niestandardowego zapytania, ale nie wiem, jak jest ono przechowywane w bazie danych.

pbonnefoi
źródło

Odpowiedzi:

21

loadMultiple() powinno być w tym dobrze:

$types = \Drupal::entityTypeManager()
  ->getStorage('node_type')
  ->loadMultiple();
Clive
źródło
16

Możesz załadować wszystkie encje NodeType (encje konfiguracyjne) za pomocą klasy NodeType:

$node_types = \Drupal\node\Entity\NodeType::loadMultiple();
// If you need to display them in a drop down:
$options = [];
foreach ($node_types as $node_type) {
  $options[$node_type->id()] = $node_type->label();
}
googletorp
źródło
2
Sztuczka z statyczne loadMultiple(), load()oraz create()metody jest, aby połączyć je na klasy typu podmiot, który chcesz użyć, to dane, rodzaj i zastosowania robi powyżej dynamicznie. Jest to nieco krótsze i łatwiejsze w użyciu, ale zaleca się korzystanie z wstrzykiwanych usług, gdy jest to możliwe, więc w usłudze / kontrolerze / wtyczce wstrzykujesz menedżera typów jednostek, a następnie używasz tego. Pozwala na łatwiejsze (jednostkowe) testowanie, ale wynik jest mniej więcej taki sam.
Berdir
1

Istnieje inna funkcja pomocnicza Drupala, która nie jest przestarzała od 8.7. node_type_get_names()zwroty:

string [] Tablica etykiet typów węzłów, kluczowana nazwą typu węzła.

Dokumenty API

BWagner
źródło
Jest to najłatwiejsze rozwiązanie, jeśli musisz wypełnić opcje wyboru formularza (lub pól wyboru).
TytooF,
0

Pod warunkiem, że w node_type_get_names()przyszłości zostanie uznany za przestarzały (również dobry przykład array_mapużycia):

function node_type_get_names() {
  return array_map(function ($bundle_info) {
    return $bundle_info['label'];
  }, \Drupal::service('entity_type.bundle.info')
    ->getBundleInfo('node'));
}
Mike Godin
źródło