Was früher ziemlich einfach zu finden und zu dokumentieren war, ist jetzt etwas verwirrender und schwieriger zu finden. Dies ist eines der Top-Suchergebnisse für dieses Thema. Daher möchte ich mir die Zeit nehmen, eine Lösung zu veröffentlichen, die ich mithilfe der neuen Methoden zusammenstellen konnte.
Mein Anwendungsfall besteht darin, eine Liste der veröffentlichten Knoten eines bestimmten Inhaltstyps abzurufen und diese als XML auf einer Seite zu veröffentlichen, damit sie von Dritten verwendet werden können.
Hier sind meine Erklärungen. Einige von ihnen könnten an dieser Stelle überflüssig sein, aber ich bin noch nicht fertig damit, den Code zu aktualisieren.
<?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;
Hier ist der Code, mit dem Sie das Objekt einfach in das XML-Format einfügen können
/**
* 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;
}
}
Wenn Sie die Daten massieren müssen, müssen Sie ein Array ausfüllen und dort Änderungen vornehmen. Natürlich können Sie ein Standardbibliotheksarray auch weiterhin serialisieren.
/**
* 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;
}
}
Hoffe das hilft.