Uzyskaj warunki taksonomii

17

Chciałem odzyskać terminy taksonomiczne z pewnego słownictwa w Drupal 8.

Najwyraźniej wciąż mogę to zrobić za pomocą taxonomy_get_tree ale jest przestarzałe.

Teraz muszę użyć TermStorageInterface :: loadTree

Próbuję uzyskać dostęp do tej funkcji z, Blockale nie rozumiem, jak utworzyćTermStorageInterface klasy.

Próbowałem uzyskać dostęp do funkcji bezpośrednio, ale nie jest to funkcja statyczna:

TermStorageInterface::loadTree('categories')

Próbowałem utworzyć wystąpienie, ale to mi powiedziało Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

Nie rozumiem, jak działa ta klasa i jak mogę uzyskać dostęp do linków do taksonomii. Myślę, że brakuje mi dużej części zrozumienia, jak działa Drupal.

Romain Braun
źródło

Odpowiedzi:

38

Zastąpienie przestarzałej funkcji jest w większości przypadków trywialne. Spójrz na to. Tam możesz to zobaczyć:

\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $parent, $max_depth, $load_entities);

Jeśli szukasz funkcji, która została już usunięta, wyszukaj ją na stronie Zmień rekordy dla strony głównej Drupal . Prawie każda usunięta funkcja powinna zawierać mniej więcej (zwykle bardziej) szczegółowe instrukcje, jak to zrobić w Drupal 8.

Klasa pamięci to moduł obsługi pamięci encji, który można uzyskać za pośrednictwem menedżera encji. Zasadniczo 99% klas w D8 nie powinno być stworzonych samodzielnie, ale jako usługa lub moduł obsługi encji, wtyczka.

Na przykład:

$vid = 'vocabulary_name';
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
foreach ($terms as $term) {
 $term_data[] = array(
  'id' => $term->tid,
  'name' => $term->name
 );
}
Berdir
źródło
Wielkie dzięki. Chociaż nie rozumiem, gdzie znalazłeś ten wiersz kodu?
Romain Braun,
Jak już powiedziałem, jest to kopiowane prosto z taxonomy_get_tree (). Przestarzała funkcja oznacza, że ​​istnieje nowy sposób na zrobienie czegoś, ale stara funkcja wciąż musi działać.
Berdir
Oh ok Niesamowite. Teraz to widzę. Bardzo ci dziękuje za pomoc!
Romain Braun,
Teraz nie działa, zmieniłem przestarzałą funkcję na entityTypeManager, ale po getStorage nie otrzymuję loadTree.
Bhanu Prakash Ryaga
2
@ usethe23 Co wdrożyć? Chodzi o zastąpienie przestarzałego wywołania funkcji nowym podejściem. Nie robi nic, czego wcześniej nie zrobił. Prawdopodobnie musisz utworzyć nowe pytanie i opisać, co chcesz zrobić.
Berdir,
9

Oto, czego używam do stworzenia listy tagów:

  use Drupal\taxonomy\Entity\Term;      
  use Drupal\Core\Link;
  use Drupal\Core\Url;

  $vocabulary_name = 'YOUR_VOCABULARY_NAME'; //name of your vocabulary
  $query = \Drupal::entityQuery('taxonomy_term');
  $query->condition('vid', $vocabulary_name);
  $query->sort('weight');
  $tids = $query->execute();
  $terms = Term::loadMultiple($tids);
  $output = '<ul>';
  foreach($terms as $term) {
      $name = $term->getName();;
      $url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()]);
      $link = Link::fromTextAndUrl($name, $url);
      $link = $link->toRenderable();
      $output .='<li>'.render($link).'</li>';
  }
  $output .= '</ul>';
  print $output;
Stef Van Looveren
źródło
Szukałem tego przez pół godziny ... jest to tak skomplikowane i nie ma sensu ... a co jeśli chcę tylko alias adresu URL terminu taksonomii, jak to zrobić?
Raf A.
1
Cześć Raf. Postanowiłem to opublikować, ponieważ miałem również trudności z podjęciem tak prostego zadania, jak to. Aby uzyskać tylko alias: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren,
5

Występujący błąd polega na tym, że próbujesz utworzyć instancję interfejsu, co nie jest dozwolone przez PHP. Interfejsy PHP opisują metody, które klasy powinny implementować w określonych przypadkach, ale nie można ich używać do tworzenia obiektu, na przykład za pomocą new InterfaceName().

Teraz taxonomy_get_tree()został usunięty, a usługa menedżera encji została wycofana, musisz użyć następującego kodu.

$terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $parent, $max_depth, $load_entities);

Nie trzeba go używać, \Drupal::getContainer()ponieważ \Drupaludostępnia metodę pomocnika, aby uzyskać usługę menedżera typów jednostek.

kiamlaluno
źródło
3

Załaduj używając nazwy maszyny słownika (vid):

  $vid = 'name_of_your_vocabulary';
  $terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
  foreach ($terms as $term) {
   $term_data[] = array(
    "id" => $term->tid,
    "name" => $term->name
   );
   dpm($term_data);
  }
Achraf JEDAY
źródło
2

\ Drupal :: entityManager () jest teraz przestarzałe, więc to zadziałało dla mnie

$vids = Vocabulary::loadMultiple();
foreach ($vids as $vid) {
  if ($vid->label() == 'YourVocab') {
    $container = \Drupal::getContainer();
    $terms = $container->get('entity.manager')->getStorage('taxonomy_term')->loadTree($vid->id());
    if (!empty($terms)) {
      foreach($terms as $term) {
        dsm($term->name);
      }
    }
    break;
  }
}
badzilla
źródło
1
entityManager jest przestarzały, ponieważ został podzielony na 11 klas - drupal.org/node/2337191 - więc zamiast tego użyj \ Drupal :: entityTypeManager i powinieneś być dobry.
ognockocaten
Za każdym razem, gdy musisz załadować Wielokrotność i zapętlić, aż uzyskasz konkretny, którego chcesz, nazywam ten gówniany kod fwiw
AlxVallejo
2

Właśnie napisałem funkcję, możesz ją edytować i używać :) Potrzebowałem identyfikatora terminu, ale możesz zwrócić wszystko, co chcesz.

function checkTaxonomyTerm($vocab_name, $term_name){
    $query = \Drupal::entityQuery('taxonomy_term');
    $query->condition('vid', $vocab_name);
    $tids = $query->execute();
    $terms = Term::loadMultiple($tids);
    foreach($terms as $term) {
        $name = $term->getName();
        if($name == $term_name) {
            print_r($term->id());
            if (is_null($term->id())) {
                return null;
            }
            else{
                return array(true, $term->id());
            }
        }
        else {return addTaxonomyTerm($term->getVocabularyId(), $name);}
    }
}
Czeglédi Dávid
źródło
Mogę się mylić, ale wydaje się to nie do końca słuszne. $query->conditionpo $query->execute()nie ma wpływu. Również jeśli pierwszy termin nie jest właściwy, foreach zwróci wartość null zamiast sprawdzania następnego. (W twoim przypadku możesz być w stanie zamiast tego użyć taksonomii_term_load_multiple_by_name ?)
Neograph734
Ops, tak przepraszam, skopiowałem stary kod przepraszam,
edytuję
No i tak, jak powiedziałeś, inna droga jest słuszna, aby lepiej z tego skorzystać.
Czeglédi Dávid
1

Oto przykład D8, jak uzyskać dostęp do terminów taksonomii opartych na nazwie maszyny do słownictwa:

$terms = \Drupal::entityManager()->getStorage('taxonomy_term')->loadTree('categories');
foreach ($terms as $term) {
  //$value = $term->get('field_example')->getValue();
  var_dump($term);
}

Aby załadować całych jednostek, należy: loadTree('categories', 0, NULL, TRUE).

kenorb
źródło
1

Jeśli potrzebujesz encji terminowej, możesz użyć „loadByProperties ()”.

$vid = 'vocabulary_name';
/** @var \Drupal\taxonomy\Entity\Term[] $terms */
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties(['vid' => $vid]);
Denis Viunyk
źródło
To jest poprawna odpowiedź. Dzięki.
Stef Van Looveren,
0
$vid = 'MACHINE_NAME_OF_VACABULARY';
$parent_tid = 0;//parent id
$depth = 2; //depth upto which level you want 
$load_entities = FALSE;
$tree = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $parent_tid, $depth, $load_entities);

foreach ($tree as $term) {
     $treeNames[] = array(
      'name' => $term->name
     );
}
dump($treeNames);
Wasim Khan
źródło