분류법 용어 얻기


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 코어 페이지의 레코드 변경 에서 검색 하십시오. 제거 된 거의 모든 기능에는 드루팔 8에서 그 기능을 수행하는 방법에 대한 자세한 지침이 있어야합니다.

스토리지 클래스는 엔티티 관리자를 통해 얻는 엔티티 스토리지 핸들러입니다. 일반적으로 D8 클래스의 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
 );
}

감사합니다 그 코드 줄을 어디서 찾았는지 모르겠지만?
Romain Braun

내가 말했듯이, 그것은 taxonomy_get_tree ()에서 straigt를 복사합니다. 더 이상 사용되지 않는 함수는 새로운 방법으로 무언가를 수행하지만 이전 함수는 여전히 작동해야 함을 의미합니다.
Berdir

오 그래. 대박. 나는 지금 본다. 당신의 도움을 주셔서 대단히 감사합니다!
Romain Braun

이제는 작동하지 않으므로 더 이상 사용되지 않는 함수를 entityTypeManager로 변경했지만 getStorage 후에 loadTree를 얻지 못합니다.
Bhanu Prakash Ryaga

2
무엇을 구현 하시겠습니까? 이것은 더 이상 사용되지 않는 함수 호출을 새로운 접근법으로 대체하는 것입니다. 이전에는 없었던 것은하지 않습니다. 새로운 질문을 작성하고 원하는 것을 설명해야 할 수도 있습니다.
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;

나는 이것에 대해 30 분 정도를 검색했습니다 ... 매우 복잡하고 이해가되지 않습니다 ... 그리고 분류 용어의 URL 별칭 만 원한다면 어떻게해야합니까?
Raf A.

1
안녕 라프. 나는 이것과 같은 간단한 작업을하기가 어려웠 기 때문에 이것을 게시하기로 결정했습니다. 별명을 얻으려면 $ url = Url :: fromRoute ( 'entity.taxonomy_term.canonical', [ 'taxonomy_term'=> $ term-> id ()]);
Stef Van Looveren

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 :: 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는 drupal.org/node/2337191-11 개의 클래스로 나뉘어져 더 이상 사용되지 않으므로 \ Drupal :: entityTypeManager를 대신 사용하면 좋습니다.
ognockocaten

당신이 원하는 특정 코드를 얻을 때까지 multimulti를로드하고 루프해야 할 때마다, 나는 그 뻔뻔스런 코드 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는 다음 용어를 확인하지 않고 null을 반환합니다. (사용 사례의 경우 taxonomy_term_load_multiple_by_name을 대신 사용할 수 있습니까?)
Neograph734

옵스는, 그래 미안 미안 내가 편집을 예전의 코드를 복사 그것은
Czeglédi 데이비드

글쎄요, 당신이 말한 것처럼 다른 방법이 옳습니다.
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]);

이것이 정답입니다. 감사.
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);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.