Sınıflandırma terimlerini alın


17

Drupal 8'de belirli bir kelime dağarcığından terimler almak istedim.

Görünüşe göre hala kullanarak yapabilirim taxonomy_get_treeama kullanımdan kaldırıldı.

Şimdi TermStorageInterface :: loadTree kullanmak zorundayım

Bu fonksiyona birinden erişmeye çalışıyorum Blockama TermStorageInterfacesınıfı nasıl somutlaştıracağımı anlamıyorum .

Doğrudan işleve erişmeyi denedim ama statik bir işlev değil:

TermStorageInterface::loadTree('categories')

Sınıfı örneklemeyi denedim ama bana söyledi Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

Bu sınıfın nasıl çalıştığını ve sınıflandırma bağlantılarına nasıl erişebileceğimi anlamıyorum. Bence Drupal'ın nasıl çalıştığını anlamanın büyük bir bölümünü kaçırıyorum.

Yanıtlar:


38

Kullanımdan kaldırılmış bir işlevin değiştirilmesi çoğu durumda önemsizdir. Sadece bak. Orada bunu görebilirsiniz:

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

Zaten kaldırılmış bir işlevi arıyorsanız, Drupal çekirdek sayfasındaki Kayıtları değiştir sayfasında arayın . Kaldırılan hemen hemen her fonksiyonun, bunun yerine Drupal 8'de nasıl yapılacağı hakkında daha fazla veya daha az (genellikle daha fazla) ayrıntılı talimatı olmalıdır.

Depolama sınıfı, varlık yöneticisi aracılığıyla aldığınız bir varlık depolama işleyicisidir. Genel olarak, D8'deki sınıfların% 99'u kendiniz değil, bir hizmet veya varlık işleyicisi eklentisi olarak yaratılmalıdır.

Örneğin:

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

Harika teşekkür ederim. Bu kod satırını nerede bulduğunuzu anlamama rağmen?
Romain Braun

Dediğim gibi, bu taksonomi_get_tree () 'den kopyalanır. Kullanımdan kaldırılmış bir işlev, bir şey yapmanın yeni bir yolu olduğu anlamına gelir, ancak eski işlevin yine de çalışması gerekir.
Berdir

Ah tamam. Muhteşem. Şimdi görüyorum. Yardımın için çok teşekkürler!
Romain Braun

Şimdi çalışmıyor, entityTypeManager için kullanımdan kaldırıldı işlevi değiştirdim, ancak getStorage sonra loadTree almıyorum.
Bhanu Prakash Ryaga

2
@ usethe23 Ne uygula? Bu, kullanımdan kaldırılmış bir işlev çağrısını yeni yaklaşımla değiştirmekle ilgilidir. Daha önce yapmadığı hiçbir şey yapmıyor. Muhtemelen yeni bir soru oluşturmanız ve ne yapmak istediğinizi açıklamanız gerekir.
Berdir

9

Bir etiket listesi oluşturmak için kullandığım şey budur:

  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;

Bunun için yarım saat aradım ... çok karmaşık ve mantıklı değil ... ve sadece sınıflandırma teriminin URL takma adını istiyorsam, bunu nasıl alabilirim?
Raf A.

1
Merhaba Raf. Bunu göndermeye karar verdim, çünkü bunun gibi basit bir işe girmek için de zorlandım. Sadece takma adı almak için: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren

5

Aldığınız hata, PHP'nin izin verdiği bir şey olmayan bir arayüz örneği oluşturmaya çalışmanızdır. PHP arayüzleri, sınıfların belirli durumlar için uygulanması gereken yöntemleri açıklar, ancak örneğin bir nesne oluşturmak için kullanılamazlar new InterfaceName().

Artık taxonomy_get_tree()kaldırıldı ve varlık yöneticisi hizmeti kullanımdan kaldırıldı, aşağıdaki kodu kullanmanız gerekiyor.

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

Kullanmak Orada gerek olmadığı \Drupal::getContainer()çünkü \Drupalvarlık türü yöneticisi hizmeti almak için ortaya çıkarır, bir yardımcı yöntemi.


3

Kelime haznesinin makine adını kullanarak yükleyin (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 () artık kullanımdan kaldırıldı, bu yüzden bu benim için çalıştı

$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 kullanımdan kaldırılmıştır, çünkü 11 sınıfa ayrılmıştır - drupal.org/node/2337191 - bunun yerine \ Drupal :: entityTypeManager kullanın ve iyi olmalısınız.
ognockocaten

İstediğiniz belirli olana kadar birden fazla ve döngü oluşturduğunuzda, bu boktan kodu fwiw olarak adlandırıyorum
AlxVallejo

2

Sadece bir fonksiyon yazdım, düzenlemek ve kullanmaktan çekinmeyin :) Terimin kimliğine ihtiyacım vardı, ama ne istersen dönebilirsin.

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

Yanılıyor olabilirim, ama bu tamamen doğru görünmüyor. $query->conditionafter $query->execute()hiçbir etkisi yoktur. Ayrıca, ilk terim doğru değilse, foreach bir sonraki terimi kontrol etmek yerine null değerini döndürür. (Kullanım durumunuz için bunun yerine taxonomy_term_load_multiple_by_name'i kullanabilirsiniz ?)
Neograph734

Ops, evet üzgünüm eski kodu kopyaladım üzgünüm, bunu düzenliyorum
Czeglédi Dávid

Evet ve evet, dediğin gibi, bunu kullanmak daha iyi.
Czeglédi Dávid

1

Kelime makinesi adına dayalı sınıflandırma terimlerine nasıl erişileceği D8 örneği:

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

Bütün varlıkları yüklemek için kullanın: loadTree('categories', 0, NULL, TRUE).


1

Terim varlığına ihtiyacınız varsa, 'loadByProperties ()' kullanabilirsiniz.

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

Bu doğru cevap. Teşekkürler.
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);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.