Récupère tous les nœuds de type donné

21

Je voudrais obtenir tous les nœuds de my_custom_typetype dans Drupal 8 .

Je sais que je peux obtenir tous les nœuds (de tout type) avec \Drupal\node\Entity\Node::loadMultiple()et la liste de tous les types par \Drupal\node\Entity\NodeType::loadMultiple().

Mais comment obtenir uniquement les nœuds d'un type de nœud donné?

Je ne veux vraiment pas utiliser de module spécialisé pour cela (si c'est possible), restez aussi simple que possible. J'utiliserai la solution dans mon module personnalisé.

Et charger tous les nœuds avec \Drupal\node\Entity\Node::loadMultiple()puis vérifier leur type foreachréduirait trop les performances.

PolGraphic
la source

Réponses:

39

Vous pouvez utiliser Drupal::entityQuery()& Node::loadMultiple()pour charger tous les nœuds de votre type donné:

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);
Shawn Conn
la source
1
Est-il possible de le faire de manière générique pour tout type d'entité? Vous pensez que \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); fonctionnerait, mais malheureusement non.
liquidcms
1
Cette réponse est spécifique aux entités de noeud. Les détails changeront pour les autres entités. Vous devriez poser une autre question pour un cas général.
Shawn Conn
3
Dans le code POO, c'est maintenant $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Voir drupal.org/node/2849874 .
leymannx
17

Une autre façon de procéder serait d'utiliser cet extrait de code:

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

Habituellement, vous avez besoin de nœuds publiés, pas tous.

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

C'est en fait très facile,

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

Si vous souhaitez que tous les nœuds soient également non publiés, utilisez simplement:

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

Quelque chose qui était, à une époque, assez simple à comprendre et à trouver de la documentation est devenu un peu plus confus et difficile à trouver. Ceci est l'un des meilleurs résultats de recherche pour ce sujet, donc je veux prendre le temps de publier une solution que j'ai pu mettre au point en utilisant les nouvelles méthodes.

Mon cas d'utilisation consiste à obtenir une liste de nœuds publiés d'un certain type de contenu et à les publier sur une page au format XML pour être consommés par un tiers.

Voici mes déclarations. Certains d'entre eux peuvent être superflus à ce stade, mais je n'ai pas encore mis à niveau le code.

<?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;

Voici le code pour alimenter simplement l'objet dans le 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;
  }
}

Si vous devez masser les données, vous devrez remplir un tableau et y apporter des modifications. Bien sûr, vous pouvez toujours sérialiser un tableau de bibliothèque 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;
  }
}

J'espère que cela t'aides.

Loopy
la source