Sesuatu yang, pada suatu waktu, cukup mudah untuk dipecahkan dan ditemukan dokumentasi untuk menjadi sedikit lebih membingungkan dan sulit ditemukan. Ini adalah salah satu hasil pencarian teratas untuk topik ini, jadi saya ingin meluangkan waktu untuk memposting solusi yang saya bisa kumpulkan menggunakan Metode baru.
Kasus penggunaan saya adalah mendapatkan daftar node yang diterbitkan dari jenis konten tertentu dan menerbitkannya ke halaman sebagai XML untuk dikonsumsi oleh pihak ketiga.
Ini deklarasi saya. Beberapa dari mereka mungkin berlebihan pada saat ini, tapi saya belum selesai memperbarui kode.
<?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;
Berikut kode untuk hanya memberi makan objek ke 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;
}
}
Jika Anda perlu memijat data, maka Anda harus mengisi array dan mengeditnya. Tentu saja, Anda masih bisa membuat serial array perpustakaan standar.
/**
* 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;
}
}
Semoga ini membantu.