वर्गीकरण की शर्तें प्राप्त करें


17

मैं ड्रुपल 8 में एक निश्चित शब्दावली से कर की शर्तों को पुनः प्राप्त करना चाहता था।

जाहिरा तौर पर मैं अभी भी इसका उपयोग कर सकता हूं taxonomy_get_treeलेकिन यह पदावनत है।

मुझे अब TermStorageInterface :: loadTree का उपयोग करना होगा

मैं इस फ़ंक्शन को एक्सेस करने की कोशिश कर रहा हूं, Blockलेकिन मुझे समझ नहीं आ रहा है कि TermStorageInterfaceक्लास को कैसे इंस्टेंट किया जाए ।

मैंने सीधे फ़ंक्शन तक पहुँचने की कोशिश की, लेकिन यह एक स्थिर फ़ंक्शन नहीं है:

TermStorageInterface::loadTree('categories')

मैंने कक्षा को तत्काल करने की कोशिश की लेकिन इसने मुझे बताया Cannot instantiate interface Drupal\taxonomy\TermStorageInterface

$test = new TermStorageInterface();

मुझे समझ में नहीं आता है कि यह वर्ग कैसे काम करता है और मैं टैक्सोनॉमी लिंक कैसे एक्सेस कर सकता हूं। मुझे लगता है कि ड्रुपल कैसे काम करता है, यह समझने का एक बड़ा हिस्सा मुझे याद आ रहा है।

जवाबों:


38

एक पदावनत समारोह की जगह ज्यादातर मामलों में तुच्छ है। जरा गौर से देखिए। वहां आप इसे देख सकते हैं:

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

यदि आप एक फ़ंक्शन की तलाश कर रहे हैं जो पहले ही हटा दिया गया था, तो उस पर खोजें लिए ड्रुपल कोर पेज के लिए रिकॉर्ड्स बदलें । बहुत अधिक हर फ़ंक्शन को हटा दिया गया था जिसके बजाय कम से कम (आमतौर पर अधिक) विस्तृत निर्देश होना चाहिए कि इसे Drupal 8 में कैसे किया जाए।

स्टोरेज क्लास एक यूनिट स्टोरेज हैंडलर है, जो आपको यूनिट मैनेजर के माध्यम से मिलता है। सामान्य तौर पर, डी 8 में 99% कक्षाएं स्वयं बनाने के लिए नहीं होती हैं, लेकिन एक सेवा, या इकाई हैंडलर, प्लगइन के रूप में।

उदाहरण के लिए:

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

बहुत बहुत धन्यवाद। हालाँकि मुझे समझ नहीं आ रहा है कि आपको कोड की वह रेखा कहाँ से मिली?
रोमेन ब्रौन

जैसा कि मैंने कहा, यह टैक्नोलाॅजी_गेट_ट्री () से कॉपी की गई स्ट्रैटिग है। एक पदावनत समारोह का अर्थ है कि कुछ करने का एक नया तरीका है, लेकिन पुराने कार्य को अभी भी काम करना है।
बेर्दिर

ओह ठीक। बहुत बढ़िया। मुझे अब दिख रहा है। मदद के लिए आपका बहुत बहुत धन्यवाद!
रोमेन ब्रौन

अब इसका काम नहीं कर रहा है, मैंने पदावनत समारोह को एंटिटी टाइप मैनजेर में बदल दिया है, लेकिन गेटस्टोरेज के बाद मुझे लोडश्री नहीं मिल रही है।
भानु प्रकाश रायगा

2
@ usethe23 क्या लागू किया गया? यह नए दृष्टिकोण के साथ एक पदावनत समारोह कॉल की जगह के बारे में है। यह ऐसा कुछ भी नहीं करता है जो यह पहले से नहीं करता था। आपको शायद एक नया प्रश्न बनाने और वर्णन करने की आवश्यकता है कि आप क्या करना चाहते हैं।
बर्दिर

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 उपनाम चाहिए, तो मुझे यह कैसे मिलेगा?
रफ ए।

1
हाय रफ। मैंने इसे पोस्ट करने का फैसला किया, क्योंकि मेरे पास इस तरह के एक सरल कार्य को प्राप्त करने के लिए एक कठिन समय भी था। केवल उर्फ ​​पाने के लिए: $ url = Url :: fromRoute ('unit.taxonomy_term.canonical', ['taxonomy_term' => $ term-> id ()));
स्टेफ वान लूवरेन

5

आपको जो त्रुटि मिल रही है, वह इसलिए है क्योंकि आप एक ऐसे इंटरफ़ेस का एक उदाहरण बनाने की कोशिश कर रहे हैं, जो कुछ PHP अनुमति नहीं देता है। PHP इंटरफेस विशिष्ट मामलों के लिए लागू करने वाली विधियों का वर्णन करता है, लेकिन उनका उपयोग ऑब्जेक्ट बनाने के लिए नहीं किया जा सकता है, उदाहरण के लिएnew InterfaceName()

अब taxonomy_get_tree()इसे हटा दिया गया है, और इकाई प्रबंधक सेवा को हटा दिया गया है, आपको निम्नलिखित कोड का उपयोग करने की आवश्यकता है।

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

इकाई प्रकार प्रबंधक सेवा प्राप्त करने के लिए एक सहायक विधि को उजागर करने के \Drupal::getContainer()बाद से उपयोग करने की आवश्यकता नहीं है \Drupal


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 :: unitManager () अब पदावनत हो गया है इसलिए यह मेरे लिए काम कर रहा है

$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
UnitManager को पदावनत किया जाता है क्योंकि 11 वर्गों में विभाजित हो जाता है - drupal.org/node/2337191 - इसलिए इसके बजाय \ Drupal :: unitTypeManager का उपयोग करें और आपको अच्छा होना चाहिए।
ognockocaten

कभी भी आपको लोड करना होगा जब तक कि आप किसी विशिष्ट व्यक्ति को नहीं पा लेते हैं, तब तक आप चाहते हैं कि मैं उस
श्वेत

2

मैंने सिर्फ एक फ़ंक्शन लिखा है, संपादित करने और उपयोग करने के लिए स्वतंत्र महसूस करें :) मुझे कार्यकाल की आईडी की आवश्यकता थी, लेकिन आप जो चाहें वापस कर सकते हैं।

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()कोई प्रभाव नहीं है। इसके अलावा अगर पहला कार्यकाल सही नहीं है, तो अगले कार्यकाल की जाँच करने के बजाय, फ़ॉरच्यून वापस आ जाएगी। (अपने उपयोग के मामले के लिए, आप इसके बजाय taxonomy_term_load_multiple_by_name का उपयोग करने में सक्षम हो सकते हैं ?)
Neograph734

ऑप्स, हाँ, मुझे खेद है कि मैंने पुराने कोड को कॉपी किया है, मैं इसे संपादित करता हूं
Czeglédi Dávid

अच्छी तरह से और हाँ, अन्य तरीका सही है, जैसा कि आपने कहा, इसके लिए बेहतर है कि इसका उपयोग करें।
Czeglédi Dá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]);

यह सही जवाब है। धन्यवाद।
स्टेफ वान लॉवरेन

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.