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.