Dapatkan ketentuan taksonomi


16

Saya ingin mengambil istilah taksonomi dari kosakata tertentu di Drupal 8.

Tampaknya saya masih bisa melakukannya menggunakan taxonomy_get_treetetapi sudah usang.

Saya sekarang harus menggunakan TermStorageInterface :: loadTree

Saya mencoba mengakses fungsi ini dari Blocktetapi saya tidak mengerti bagaimana membuat instance TermStorageInterfacekelas.

Saya mencoba mengakses fungsi secara langsung tetapi itu bukan fungsi statis:

TermStorageInterface::loadTree('categories')

Saya mencoba membuat instance kelas tetapi itu memberi tahu saya Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

Saya tidak mengerti bagaimana kelas ini bekerja dan bagaimana saya dapat mengakses tautan taksonomi. Saya pikir saya kehilangan sebagian besar pemahaman bagaimana Drupal bekerja.

Jawaban:


38

Mengganti fungsi yang sudah usang dalam banyak kasus sepele. Lihat saja itu. Di sana Anda dapat melihat ini:

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

Jika Anda mencari fungsi yang sudah dihapus, cari di Ubah catatan untuk halaman inti Drupal . Cukup banyak setiap fungsi yang dihapus harus memiliki lebih atau kurang (biasanya lebih) instruksi terperinci tentang cara melakukannya di Drupal 8 sebagai gantinya.

Kelas penyimpanan adalah penangan penyimpanan entitas, yang Anda dapatkan melalui manajer entitas. Secara umum, 99% dari kelas di D8 tidak dimaksudkan untuk dibuat sendiri, tetapi sebagai layanan, atau entitas pengendali, plugin.

Sebagai contoh:

$vid = 'vocabulary_name';
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
foreach ($terms as $term) {
 $term_data[] = array(
  'id' => $term->tid,
  'name' => $term->name
 );
}

Terima kasih banyak. Meskipun saya tidak mengerti di mana Anda menemukan baris kode itu?
Romain Braun

Seperti yang saya katakan, itu disalin straigt dari taxonomy_get_tree (). Fungsi yang sudah usang berarti ada cara baru untuk melakukan sesuatu, tetapi fungsi yang lama masih harus berfungsi.
Berdir

Oh oke. Luar biasa. Saya melihatnya sekarang. Terima kasih banyak atas bantuan Anda!
Romain Braun

Sekarang tidak berfungsi, saya telah mengubah fungsi yang sudah tidak digunakan lagi menjadi entityTypeManager, tetapi setelah getStorage saya tidak mendapatkan loadTree.
Bhanu Prakash Ryaga

2
@ usethe23 Terapkan apa? Ini hanya tentang mengganti panggilan fungsi yang sudah usang dengan pendekatan baru. Itu tidak melakukan apa pun yang belum pernah terjadi sebelumnya. Anda mungkin perlu membuat pertanyaan baru dan menjelaskan apa yang ingin Anda lakukan.
Berdir

8

Ini yang saya gunakan untuk membuat daftar tag:

  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;

Saya mencari sekitar setengah jam untuk ini ... begitu rumit dan tidak masuk akal ... dan bagaimana jika saya hanya menginginkan URL alias istilah taksonomi, bagaimana saya mendapatkannya?
Raf A.

1
Hai Raf. Saya memutuskan untuk memposting ini, karena saya juga mengalami kesulitan untuk mendapatkan tugas semudah ini. Untuk mendapatkan alias: $ url = Url :: fromRoute ('entitas.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren

5

Kesalahan yang Anda dapatkan adalah karena Anda mencoba membuat instance antarmuka, yang bukan sesuatu yang diizinkan oleh PHP. Antarmuka PHP menjelaskan metode yang harus diterapkan oleh kelas untuk kasus-kasus tertentu, tetapi mereka tidak dapat digunakan untuk membuat objek, misalnya dengan new InterfaceName().

Sekarang yang taxonomy_get_tree()telah dihapus, dan layanan manajer entitas telah ditinggalkan, Anda perlu menggunakan kode berikut.

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

Tidak perlu menggunakan \Drupal::getContainer()karena \Drupalmemperlihatkan metode pembantu untuk mendapatkan layanan tipe manajer entitas.


3

Memuat menggunakan nama mesin dari kosakata (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 () sudah tidak digunakan lagi sehingga ini bekerja untuk saya

$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
entitasManager tidak digunakan lagi karena dibagi menjadi 11 kelas - drupal.org/node/2337191 - jadi gunakan \ Drupal :: entityTypeManager sebagai gantinya dan Anda harus menjadi baik.
ognockocaten

Setiap kali Anda harus memuat Multi dan loop sampai Anda mendapatkan yang spesifik yang Anda inginkan, saya menyebutnya kode menyebalkan
AlxVallejo

2

Saya baru saja menulis sebuah fungsi, merasa bebas untuk mengedit dan menggunakan :) Saya membutuhkan id dari istilah tersebut, tetapi Anda dapat mengembalikan apa pun yang Anda inginkan.

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

Saya mungkin salah, tetapi ini tampaknya tidak sepenuhnya benar. $query->conditionsetelah $query->execute()tidak berpengaruh. Juga jika istilah pertama bukan yang benar, foreach akan mengembalikan nol daripada memeriksa istilah berikutnya. (Untuk kasus penggunaan Anda, Anda mungkin dapat menggunakan taxonomy_term_load_multiple_by_name ?)
Neograph734

Ops, ya maaf saya menyalin kode lama maaf, saya mengeditnya
Czeglédi Dávid

Baik dan ya, cara lain benar, seperti yang Anda katakan, untuk itu lebih baik menggunakannya.
Czeglédi Dávid

1

Berikut adalah contoh D8 cara mengakses istilah taksonomi berdasarkan nama mesin kosa kata:

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

Untuk memuat seluruh entitas, gunakan: loadTree('categories', 0, NULL, TRUE).


1

Jika Anda membutuhkan entitas berjangka, Anda dapat menggunakan 'loadByProperties ()'.

$vid = 'vocabulary_name';
/** @var \Drupal\taxonomy\Entity\Term[] $terms */
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties(['vid' => $vid]);

Ini jawaban yang benar. Terima kasih.
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);

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.