web-dev-qa-db-ja.com

指定されたタイプのすべてのノードを取得します

_my_custom_type_タイプin Drupal 8であるすべてのノードを取得したいと思います。

\Drupal\node\Entity\Node::loadMultiple() を使用してすべてのタイプのリストと\Drupal\node\Entity\NodeType::loadMultiple()ですべてのタイプのリストを取得できることを知っています。

しかし、指定されたノードタイプのノードのみを取得する方法

(可能な場合は)専用のモジュールを使用したくないので、できるだけシンプルにしてください。カスタムモジュールでソリューションを使用します。

そして、すべてのノードを\Drupal\node\Entity\Node::loadMultiple()でロードしてから、そのタイプをforeachでチェックすると、パフォーマンスに大きな影響を与えます。

22
PolGraphic

Drupal::entityQuery()Node::loadMultiple()を使用して、指定したタイプのすべてのノードをロードできます。

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

これを行う別の方法は、次のコードスニペットを使用することです。

// Set properties to filter.
$values = [
  'type' => 'page',
];

// Get the nodes.
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties($values);
20
MrD

実際にはとても簡単です

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

すべてのノードも非公開にする場合は、次のように使用します。

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

通常、すべてではなく、公開されたノードが必要です。

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

かつては、ドキュメントを見つけて見つけるのがかなり簡単だったものは、かなりわかりにくくなり、見つけにくくなりました。これはこのトピックの上位の検索結果の1つなので、新しいメソッドを使用してまとめることができたソリューションを投稿するために時間をかけたいと思います。

私の使用例は、特定のコンテンツタイプの公開されたノードのリストを取得し、それらを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;
  }
}

お役に立てれば。

0
Loopy