주어진 유형의 모든 노드를 가져옵니다


21

Drupal 8my_custom_type 유형의 모든 노드를 가져오고 싶습니다 .

\Drupal\node\Entity\Node::loadMultiple()의해 모든 유형 의 노드와 모든 유형의 목록을 얻을 수 있음을 알고 있습니다 \Drupal\node\Entity\NodeType::loadMultiple().

그러나 주어진 노드 유형의 노드 만 얻는 방법은 무엇입니까?

나는 그것을 위해 특수 모듈을 사용하고 싶지 않습니다 (가능한 경우), 가능한 한 간단하게 유지하십시오. 내 맞춤형 모듈에서 솔루션을 사용할 것입니다.

그리고 모든 노드를로드 \Drupal\node\Entity\Node::loadMultiple()한 다음 유형을 확인 foreach하면 성능이 너무 높아집니다.

답변:


39

Drupal::entityQuery()& Node::loadMultiple()를 사용 하여 주어진 유형의 모든 노드를로드 할 수 있습니다 .

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);

1
모든 엔티티 유형에 대해 일반적으로이를 수행하는 방법이 있습니까? \ Drupal :: entityQuery ($ type)-> condition ( 'type', $ bundle)> execute (); 작동하지만 슬프게도 아닙니다.
liquidcms

1
이 답변은 노드 엔터티에만 해당됩니다. 다른 엔터티에 대한 세부 정보가 변경됩니다. 일반적인 경우에 대해 다른 질문을해야합니다.
Shawn Conn

3
OOP 코드에서 이것은 현재입니다 $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. drupal.org/node/2849874를 참조하십시오 .
leymannx

17

이 작업을 수행하는 또 다른 방법은 다음 코드 스 니펫을 사용하는 것입니다.

$values = [
  'type' => 'page'
];
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties($values);

7

일반적으로 모두가 아닌 게시 ​​된 노드가 필요합니다.

$nids = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'YOUR-NODE-TYPE')
  ->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);

7

실제로는 매우 쉽습니다.

\Drupal::entityTypeManager()->getStorage('node')
  ->loadByProperties(['type' => 'content_type', 'status' => 1])

모든 노드를 게시 취소하려면 다음을 사용하십시오.

\Drupal::entityTypeManager()->getStorage('node')
  ->loadByProperties(['type' => 'content_type'])

0

한 번에, 문서를 파악하고 찾을 수있는 상당히 간단한 것이 상당히 혼란스럽고 찾기 어려워졌습니다. 이것은이 주제에 대한 상위 검색 결과 중 하나이므로 새로운 방법을 사용하여 통합 할 수있는 솔루션을 게시하는 데 시간을 투자하고 싶습니다.

내 유스 케이스는 특정 컨텐츠 유형의 공개 노드 목록을 가져 와서 타사가 소비 할 XML로 페이지에 공개하는 것입니다.

여기 내 선언이 있습니다. 이 시점에서 일부는 불필요 할 수 있지만 아직 코드를 업그레이드하지 않았습니다.

<?php
namespace Drupal\my_events_feed\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Component\Serialization;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\Response;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Entity\EntityTypeManager;

객체를 XML에 공급하는 코드는 다음과 같습니다.

/**
 * Class BuildXmlController.
 */
class BuildXmlController extends ControllerBase {
  /**
   * Builds the xml from an object
   */
  public function build() {
    $my_events = \Drupal::entityTypeManager()
    ->getStorage('node')
    ->loadByProperties([
      'status' => '1',
      'type' => 'submit_an_event',
    ]);

    $thisSerializer = \Drupal::service('serializer');
    $serializedData = $thisSerializer->serialize($my_events, 'xml', ['plugin_id' => 'entity']);

    $response = new Response();
    $response->headers->set('Content-Type', 'text/xml');
    $response->setContent($serializedData);
    return $response;
  }
}

데이터를 마사지해야하는 경우 배열을 채우고 편집해야합니다. 물론 표준 라이브러리 배열을 직렬화 할 수 있습니다.

/**
 * Class BuildXmlController.
 */
class BuildXmlController extends ControllerBase {
  /**
   * Builds the xml from an array
   */
  public function build() {

    $my_events = \Drupal::entityTypeManager()
    ->getStorage('node')
    ->loadByProperties([
      'status' => '1',
      'type' => 'submit_an_event',
    ]);

    $nodedata = [];
    if ($my_events) {
      /*
      Get the details of each node and
      put it in an array.
      We have to do this because we need to manipulate the array so that it will spit out exactly the XML we want
       */
      foreach ($my_events as $node) {
        $nodedata[] = $node->toArray();
      }
    }

    foreach ($nodedata as &$nodedata_row) {
      /* LOGIC TO MESS WITH THE ARRAY GOES HERE */
    }

    $thisSerializer = \Drupal::service('serializer');
    $serializedData = $thisSerializer->serialize($nodedata, 'xml', ['plugin_id' => 'entity']);

    $response = new Response();
    $response->headers->set('Content-Type', 'text/xml');
    $response->setContent($serializedData);
    return $response;
  }
}

이것이 도움이되기를 바랍니다.

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