_my_custom_type
_タイプin Drupal 8であるすべてのノードを取得したいと思います。
\Drupal\node\Entity\Node::loadMultiple()
を使用してすべてのタイプのリストと\Drupal\node\Entity\NodeType::loadMultiple()
ですべてのタイプのリストを取得できることを知っています。
しかし、指定されたノードタイプのノードのみを取得する方法
(可能な場合は)専用のモジュールを使用したくないので、できるだけシンプルにしてください。カスタムモジュールでソリューションを使用します。
そして、すべてのノードを\Drupal\node\Entity\Node::loadMultiple()
でロードしてから、そのタイプをforeach
でチェックすると、パフォーマンスに大きな影響を与えます。
Drupal::entityQuery()
&Node::loadMultiple()
を使用して、指定したタイプのすべてのノードをロードできます。
$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
これを行う別の方法は、次のコードスニペットを使用することです。
// Set properties to filter.
$values = [
'type' => 'page',
];
// Get the nodes.
$nodes = \Drupal::entityTypeManager()
->getStorage('node')
->loadByProperties($values);
実際にはとても簡単です
\Drupal::entityTypeManager()->getStorage('node')
->loadByProperties(['type' => 'content_type', 'status' => 1])
すべてのノードも非公開にする場合は、次のように使用します。
\Drupal::entityTypeManager()->getStorage('node')
->loadByProperties(['type' => 'content_type'])
通常、すべてではなく、公開されたノードが必要です。
$nids = \Drupal::entityQuery('node')
->condition('status', 1)
->condition('type', 'YOUR-NODE-TYPE')
->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
かつては、ドキュメントを見つけて見つけるのがかなり簡単だったものは、かなりわかりにくくなり、見つけにくくなりました。これはこのトピックの上位の検索結果の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;
}
}
お役に立てれば。