Obtenga todos los nodos del tipo dado

21

Me gustaría obtener todos los nodos que son de my_custom_typetipo en Drupal 8 .

Sé que puedo obtener todos los nodos (de cualquier tipo) con \Drupal\node\Entity\Node::loadMultiple()y la lista de todos los tipos por \Drupal\node\Entity\NodeType::loadMultiple().

Pero, ¿cómo obtener solo los nodos del tipo de nodo dado?

Realmente no quiero usar un módulo especializado para él (si es posible), solo manténgalo lo más simple posible. Usaré la solución en mi módulo personalizado.

Y cargar todos los nodos \Drupal\node\Entity\Node::loadMultiple()y luego registrar su tipo foreachafectaría demasiado el rendimiento.

PolGraphic
fuente

Respuestas:

39

Puede usar Drupal::entityQuery()& Node::loadMultiple()para cargar todos los nodos de su tipo dado:

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);
Shawn Conn
fuente
1
¿Alguna forma de hacer esto genéricamente para cualquier tipo de entidad? Pensarías \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); funcionaría, pero lamentablemente no.
liquidcms
1
Esta respuesta es específica de las entidades de nodo. Los detalles cambiarán para otras entidades. Debe hacer otra pregunta para un caso general.
Shawn Conn
3
En el código OOP esto es ahora $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Ver drupal.org/node/2849874 .
leymannx
17

Otra forma de hacer esto sería usar este fragmento de código:

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

Por lo general, necesita nodos publicados, no todos.

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

En realidad es muy fácil,

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

Si desea que todos los nodos también no estén publicados, simplemente use:

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

Algo que fue, en un momento, bastante simple de resolver y encontrar documentación, se ha vuelto un poco más confuso y difícil de encontrar. Este es uno de los principales resultados de búsqueda para este tema, por lo que quiero tomarme el tiempo para publicar una solución que pude reunir usando los nuevos métodos.

Mi caso de uso es obtener una lista de nodos publicados de cierto tipo de contenido y publicarlos en una página como XML para ser consumidos por un tercero.

Aquí están mis declaraciones. Algunos de ellos pueden ser superfluos en este momento, pero todavía no he terminado de actualizar el código.

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

Aquí está el código para alimentar el objeto al 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 necesita masajear los datos, entonces tendrá que llenar una matriz y hacer ediciones allí. Por supuesto, aún puede serializar una matriz de biblioteca estándar.

/**
 * 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;
  }
}

Espero que esto ayude.

Chiflado
fuente