Qualcosa che era, un tempo, abbastanza semplice da capire e trovare la documentazione per cui è diventato un po 'più confuso e difficile da trovare. Questo è uno dei migliori risultati di ricerca per questo argomento, quindi voglio dedicare del tempo a pubblicare una soluzione che sono stato in grado di mettere insieme usando i nuovi metodi.
Il mio caso d'uso è ottenere un elenco di nodi pubblicati di un determinato tipo di contenuto e pubblicarli su una pagina come XML da utilizzare da parte di terzi.
Ecco le mie dichiarazioni. Alcuni di questi potrebbero essere superflui a questo punto, ma non ho ancora finito di aggiornare il codice.
<?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;
Ecco il codice per inserire semplicemente l'oggetto nell'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;
}
}
Se devi massaggiare i dati, dovrai riempire un array e apportare modifiche lì. Naturalmente, è ancora possibile serializzare un array di librerie standard.
/**
* 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;
}
}
Spero che sia di aiuto.