Ottieni tutti i nodi di un determinato tipo


21

Vorrei ottenere tutti i nodi di my_custom_typetipo Drupal 8 .

So di poter ottenere tutti i nodi (di qualsiasi tipo) \Drupal\node\Entity\Node::loadMultiple()e l'elenco di tutti i tipi di \Drupal\node\Entity\NodeType::loadMultiple().

Ma come ottenere solo i nodi di un determinato tipo di nodo?

Non voglio davvero usare un modulo specializzato per questo (se è possibile), semplicemente mantenerlo il più semplice possibile. Userò la soluzione nel mio modulo personalizzato.

E caricando tutti i nodi con \Drupal\node\Entity\Node::loadMultiple()e quindi controllando il loro tipo foreach, le prestazioni risulterebbero eccessive.

Risposte:


39

Puoi usare Drupal::entityQuery()e Node::loadMultiple()per caricare tutti i nodi del tuo dato tipo:

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);

1
Un modo per farlo genericamente per qualsiasi tipo di entità? Penseresti \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); avrebbe funzionato, ma purtroppo no.
liquidcms

1
Questa risposta è specifica per le entità nodo. I dettagli cambieranno per altre entità. Dovresti porre un'altra domanda per un caso generale.
Shawn Conn,

3
Nel codice OOP questo è ora $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Vedi drupal.org/node/2849874 .
leymannx,

17

Un altro modo per farlo sarebbe usare questo frammento di codice:

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

7

Di solito hai bisogno di nodi pubblicati, non tutti.

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

7

In realtà è molto semplice,

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

Se desideri che anche tutti i nodi non siano pubblicati, utilizza:

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

0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.