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.

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
 );
}

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;

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.


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);
  }

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;
  }
}

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);}
    }
}

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).


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]);

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);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.