Nhận các điều khoản phân loại


16

Tôi muốn lấy các thuật ngữ phân loại từ một từ vựng nhất định trong Drupal 8.

Rõ ràng tôi vẫn có thể làm điều đó bằng cách sử dụng taxonomy_get_treenhưng nó không được chấp nhận.

Bây giờ tôi phải sử dụng TermStorageInterface :: loadTree

Tôi đang cố gắng truy cập chức năng này từ một Blocknhưng tôi không hiểu làm thế nào để khởi tạo TermStorageInterfacelớp.

Tôi đã thử truy cập trực tiếp vào chức năng nhưng nó không phải là chức năng tĩnh:

TermStorageInterface::loadTree('categories')

Tôi đã cố gắng bắt đầu lớp học nhưng nó nói với tôi Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

Tôi không hiểu làm thế nào lớp này hoạt động và làm thế nào tôi có thể truy cập các liên kết phân loại. Tôi nghĩ rằng tôi đang thiếu một phần lớn để hiểu cách thức hoạt động của Drupal.

Câu trả lời:


38

Thay thế một chức năng không dùng trong hầu hết các trường hợp là tầm thường. Chỉ cần nhìn vào nó. Ở đó bạn có thể thấy điều này:

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

Nếu bạn đang tìm kiếm một chức năng đã bị xóa, hãy tìm kiếm nó trên Thay đổi bản ghi cho trang lõi Drupal . Khá nhiều chức năng đã bị xóa nên có ít nhiều (thường là nhiều hơn) các hướng dẫn chi tiết về cách thực hiện trong Drupal 8 thay thế.

Lớp lưu trữ là một trình xử lý lưu trữ thực thể mà bạn có được thông qua trình quản lý thực thể. Nói chung, 99% các lớp trong D8 không có nghĩa là tự tạo, mà là một dịch vụ, hoặc trình xử lý thực thể, plugin.

Ví dụ:

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

Tuyệt vời cảm ơn bạn. Mặc dù tôi không hiểu bạn đã tìm thấy dòng mã đó ở đâu?
Romain Braun

Như tôi đã nói, đó là sao chép straigt từ taxonomy_get_tree (). Hàm không dùng nữa có nghĩa là có một cách mới để làm một cái gì đó, nhưng hàm cũ vẫn phải hoạt động.
Berdir

Ồ được thôi. Tuyệt vời. Tôi thấy nó bây giờ. Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn!
Romain Braun

Bây giờ nó không hoạt động, tôi đã thay đổi hàm không dùng thành entityTypeManager, nhưng sau getStorage tôi không nhận được loadTree.
Bhanu Prakash Ryaga

2
@ usethe23 Thực hiện những gì? Đây chỉ là về việc thay thế một cuộc gọi chức năng không dùng nữa bằng cách tiếp cận mới. Nó không làm bất cứ điều gì mà trước đây nó chưa làm. Bạn có thể cần phải tạo một câu hỏi mới và mô tả những gì bạn muốn làm.
Berdir

8

Đây là những gì tôi sử dụng để tạo danh sách các thẻ:

  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;

Tôi đã tìm kiếm trong nửa giờ cho việc này ... nó quá phức tạp và không có ý nghĩa gì ... và nếu tôi chỉ muốn bí danh URL của thuật ngữ phân loại, làm thế nào để tôi có được điều đó?
Raf A.

1
Xin chào. Tôi quyết định đăng bài này, bởi vì tôi cũng đã có một thời gian khó khăn để có được một nhiệm vụ đơn giản như thế này. Để chỉ lấy bí danh: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren

5

Lỗi bạn gặp phải là do bạn đang cố gắng tạo một phiên bản của giao diện, đây không phải là thứ mà PHP cho phép. Các giao diện PHP mô tả các lớp phương thức nên triển khai cho các trường hợp cụ thể, nhưng chúng không thể được sử dụng để tạo một đối tượng, ví dụ như với new InterfaceName().

Bây giờ taxonomy_get_tree()đã bị xóa và dịch vụ quản lý thực thể đã không được chấp nhận, bạn cần sử dụng mã sau đây.

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

Không cần sử dụng \Drupal::getContainer()\Drupalhiển thị phương thức trợ giúp để có được dịch vụ quản lý loại thực thể.


3

Tải bằng tên máy của từ vựng (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 () hiện không dùng nữa vì vậy điều này hiệu quả với tôi

$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 không được chấp nhận vì được chia thành 11 lớp - drupal.org/node/2337191 - vì vậy hãy sử dụng \ Drupal :: entityTypeManager và bạn sẽ tốt.
ognockocaten

Bất cứ khi nào bạn phải tảiMultipl và lặp cho đến khi bạn có được cái cụ thể mà bạn muốn, tôi gọi đó là mã shitty fwiw
AlxVallejo

2

Tôi vừa mới viết một chức năng, thoải mái chỉnh sửa và sử dụng :) Tôi cần id của thuật ngữ, nhưng bạn có thể trả lại bất cứ điều gì bạn muốn.

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

Tôi có thể sai, nhưng điều này dường như không hoàn toàn đúng. $query->conditionsau $query->execute()không có tác dụng. Ngoài ra nếu thuật ngữ đầu tiên không phải là thuật ngữ đúng, foreach sẽ trả về null thay vì kiểm tra thuật ngữ tiếp theo. (Đối với trường hợp sử dụng của bạn, bạn có thể sử dụng taxonomy_term_load_mult
Môn_by_name

Ops, vâng xin lỗi tôi đã sao chép mã cũ xin lỗi, tôi chỉnh sửa nó
Czeglédi Dávid

Vâng và vâng, cách khác là đúng, như bạn đã nói, để sử dụng nó tốt hơn.
Czeglédi Dávid

1

Dưới đây là ví dụ D8 về cách truy cập các thuật ngữ phân loại dựa trên tên máy từ vựng:

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

Để tải toàn bộ thực thể, sử dụng : loadTree('categories', 0, NULL, TRUE).


1

Nếu bạn cần thực thể có thời hạn, bạn có thể sử dụng 'loadByProperIES ()'.

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

Đây là câu trả lời chính xác. Cảm ơn.
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);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.