รับเงื่อนไขอนุกรมวิธาน


16

ฉันต้องการดึงคำศัพท์อนุกรมวิธานจากคำศัพท์บางคำใน Drupal 8

เห็นได้ชัดว่าฉันยังสามารถใช้งานได้taxonomy_get_treeแต่มันเลิกใช้แล้ว

ตอนนี้ฉันต้องใช้TermStorageInterface :: loadTree

ฉันพยายามเข้าถึงฟังก์ชั่นนี้จากBlockแต่ฉันไม่เข้าใจวิธีการยกตัวอย่างTermStorageInterfaceชั้นเรียน

ฉันพยายามเข้าถึงฟังก์ชั่นโดยตรง แต่มันไม่ใช่ฟังก์ชั่นคงที่:

TermStorageInterface::loadTree('categories')

ฉันพยายามยกระดับชั้นเรียน แต่มันก็บอกฉัน Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

ฉันไม่เข้าใจว่าคลาสนี้ทำงานอย่างไรและฉันจะเข้าถึงลิงก์อนุกรมวิธานได้อย่างไร ฉันคิดว่าฉันขาดความเข้าใจส่วนใหญ่ไปแล้วว่า Drupal ทำงานอย่างไร

คำตอบ:


38

การแทนที่ฟังก์ชั่นที่เลิกใช้นั้นส่วนใหญ่จะเป็นเรื่องเล็กน้อย แค่มองมัน ที่นั่นคุณสามารถเห็นสิ่งนี้:

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

หากคุณกำลังมองหาฟังก์ชั่นที่ถูกลบไปแล้วค้นหาใน บันทึกการเปลี่ยนแปลงสำหรับหน้าหลักของ Drupal ค่อนข้างมากทุกฟังก์ชั่นที่ถูกลบควรมีคำแนะนำโดยละเอียดมากกว่าหรือน้อยกว่า (โดยปกติมากกว่า) เกี่ยวกับวิธีการทำใน Drupal 8 แทน

คลาสหน่วยเก็บข้อมูลเป็นตัวจัดการหน่วยเก็บข้อมูลเอนทิตีที่คุณได้รับผ่านตัวจัดการเอนทิตี โดยทั่วไปแล้ว 99% ของคลาสใน D8 ไม่ได้ถูกสร้างขึ้นมาเพื่อตัวคุณเอง แต่เป็นบริการหรือตัวจัดการเอนทิตี้ของปลั๊กอิน

ตัวอย่างเช่น:

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

เยี่ยมมากขอบคุณ แม้ว่าฉันจะไม่เข้าใจที่คุณพบบรรทัดของรหัสนั้น
Romain Braun

อย่างที่ฉันบอกไปนั่นคือการคัดลอก straigt จาก taxonomy_get_tree () ฟังก์ชั่นที่เลิกใช้หมายความว่ามีวิธีใหม่ในการทำบางสิ่งบางอย่าง แต่ฟังก์ชั่นเก่ายังคงต้องทำงาน
Berdir

โอวตกลง. น่ากลัว ฉันเห็นมันตอนนี้ ขอบคุณมากสำหรับความช่วยเหลือของคุณ!
Romain Braun

ตอนนี้มันไม่ทำงานฉันได้เปลี่ยนฟังก์ชั่นที่เลิกใช้แล้วเป็น entityTypeManager แต่หลังจาก getStorage ฉันไม่ได้รับ loadTree
Bhanu Prakash Ryaga

2
@ usethe23 ใช้งานอะไร นี่เป็นเพียงการเปลี่ยนการเรียกใช้ฟังก์ชันที่เลิกใช้แล้วด้วยวิธีการใหม่ มันไม่ได้ทำอะไรที่ไม่เคยทำมาก่อน คุณอาจต้องสร้างคำถามใหม่และอธิบายสิ่งที่คุณต้องการทำ
Berdir

9

นี่คือสิ่งที่ฉันใช้เพื่อสร้างรายการแท็ก:

  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;

ฉันค้นหาสิ่งนี้ครึ่งชั่วโมง ... มันซับซ้อนและไม่มีเหตุผล ... และถ้าฉันต้องการเพียงนามแฝง URL ของคำศัพท์อนุกรมวิธานฉันจะทำอย่างไร
Raf A.

1
สวัสดี Raf ฉันตัดสินใจที่จะโพสต์สิ่งนี้เพราะฉันมีเวลายากที่จะได้รับงานง่าย ๆ เช่นนี้ ในการรับนามแฝง: $ url = Url :: fromRoute ('entity.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()]);
Stef Van Looveren

5

ข้อผิดพลาดที่คุณได้รับคือเนื่องจากคุณพยายามสร้างอินสแตนซ์ของอินเทอร์เฟซซึ่งไม่ใช่สิ่งที่ PHP อนุญาต PHP interfaces อธิบายถึงวิธีการเรียนควรจะใช้สำหรับกรณีเฉพาะ แต่พวกเขาไม่สามารถใช้ในการสร้างวัตถุเช่นด้วยnew InterfaceName()แต่พวกเขาไม่สามารถใช้ในการสร้างวัตถุเช่นกับ

ตอนนี้taxonomy_get_tree()ถูกลบแล้วและบริการตัวจัดการเอนทิตีได้ถูกคัดค้านแล้วคุณต้องใช้รหัสต่อไปนี้

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

ไม่จำเป็นต้องใช้\Drupal::getContainer()เนื่องจาก\Drupalexposes เมธอดตัวช่วยเหลือเพื่อรับเซอร์วิสตัวจัดการชนิดเอนทิตี


3

โหลดโดยใช้ชื่อเครื่องของคำศัพท์ (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 () เลิกใช้แล้วจึงใช้ได้กับฉัน

$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 เลิกใช้แล้วเนื่องจากแบ่งออกเป็น 11 คลาส - drupal.org/node/2337191 - ดังนั้นให้ใช้ \ Drupal :: entityTypeManager แทนและคุณควรจะดี
ognockocaten

เมื่อใดก็ตามที่คุณต้องโหลดหลาย ๆ ตัวและวนซ้ำจนกว่าคุณจะได้รหัสที่คุณต้องการฉันเรียกว่า shitty code fwiw
AlxVallejo

2

ฉันเพิ่งเขียนฟังก์ชันอย่าลังเลที่จะแก้ไขและใช้ :) ฉันต้องการ ID ของคำศัพท์ แต่คุณสามารถคืนสิ่งที่คุณต้องการได้

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

ฉันอาจจะผิด แต่สิ่งนี้ดูเหมือนจะไม่ถูกต้องทั้งหมด $query->conditionหลังจาก$query->execute()นั้นไม่มีผลกระทบ นอกจากนี้หากคำแรกไม่ใช่คำที่ถูกต้อง foreach จะส่งคืนค่าว่างแทนที่จะตรวจสอบคำถัดไป (สำหรับกรณีการใช้งานของคุณคุณอาจจะสามารถใช้taxonomy_term_load_multiple_by_nameแทนได้?)
Neograph734

Ops ใช่ฉันขอโทษที่คัดลอกรหัสเก่าขออภัยฉันแก้ไข
CzeglédiDávid

อย่างอื่นและใช่วิธีอื่นที่ถูกต้องตามที่คุณพูดเพื่อที่จะใช้มันได้ดีกว่า
CzeglédiDávid

1

นี่คือตัวอย่าง D8 วิธีเข้าถึงคำศัพท์อนุกรมวิธานตามชื่อเครื่องคำศัพท์:

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

ในการโหลดเอนทิตีทั้งหมดให้ใช้: loadTree('categories', 0, NULL, TRUE).


1

หากคุณต้องการเอนทิตีคำคุณสามารถใช้ 'loadByProperties ()'

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

นี่คือคำตอบที่ถูกต้อง ขอบคุณ
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);

-2

คุณสามารถดูคำอธิบายแบบเต็มได้ที่นี่ https://drupaltreasure.blogspot.com/2017/04/drupal-8-get-list-of-all-voacbs.html


1
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
mpdonadio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.