かつて、ドキュメントを見つけて見つけるのはかなり簡単だったものが、かなり複雑で見つけにくいものになりました。これはこのトピックの上位の検索結果の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;
}
}
お役に立てれば。