Holen Sie sich alle Knoten des angegebenen Typs

21

Ich möchte alle Knoten, die vom my_custom_typeTyp sind, in Drupal 8 erhalten .

Ich weiß, dass ich alle Knoten (von jedem Typ) mit \Drupal\node\Entity\Node::loadMultiple()und die Liste aller Typen mit bekommen kann \Drupal\node\Entity\NodeType::loadMultiple().

Aber wie bekommt man nur die Knoten eines bestimmten Knotentyps?

Ich möchte wirklich kein spezielles Modul dafür verwenden (wenn es möglich ist), sondern es einfach so einfach wie möglich halten. Ich werde die Lösung in meinem benutzerdefinierten Modul verwenden.

Das Laden aller Knoten mit \Drupal\node\Entity\Node::loadMultiple()und das anschließende Einchecken des Knotentyps foreachwürde die Leistung zu sehr beeinträchtigen.

PolGraphic
quelle

Antworten:

39

Mit Drupal::entityQuery()& Node::loadMultiple()können Sie alle Knoten Ihres Typs laden:

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);
Shawn Conn
quelle
1
Gibt es eine Möglichkeit, dies generisch für einen Entitätstyp zu tun? Sie würden denken, \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); würde funktionieren, aber leider nicht.
Liquidcms
1
Diese Antwort ist spezifisch für Knotenentitäten. Details ändern sich für andere Entitäten. Sie sollten eine andere Frage für einen allgemeinen Fall stellen.
Shawn Conn
3
In OOP-Code ist dies jetzt $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Siehe drupal.org/node/2849874 .
Leymannx
17

Eine andere Möglichkeit, dies zu tun, wäre die Verwendung dieses Codeausschnitts:

$values = [
  'type' => 'page'
];
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties($values);
MrD
quelle
7

Normalerweise benötigen Sie veröffentlichte Knoten, nicht alle.

$nids = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'YOUR-NODE-TYPE')
  ->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
Oriol Roselló
quelle
7

Es ist eigentlich sehr einfach,

\Drupal::entityTypeManager()->getStorage('node')
  ->loadByProperties(['type' => 'content_type', 'status' => 1])

Wenn Sie möchten, dass alle Knoten auch unveröffentlicht sind, verwenden Sie einfach:

\Drupal::entityTypeManager()->getStorage('node')
  ->loadByProperties(['type' => 'content_type'])
Remco Hoeneveld
quelle
0

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.

Durchgeknallt
quelle