Obter todos os nós do tipo especificado

21

Gostaria de obter todos os nós que são do my_custom_typetipo no Drupal 8 .

Eu sei que posso obter todos os nós (de qualquer tipo) \Drupal\node\Entity\Node::loadMultiple()e a lista de todos os tipos por \Drupal\node\Entity\NodeType::loadMultiple().

Mas como obter apenas os nós de um determinado tipo de nó?

Eu realmente não quero usar um módulo especializado para isso (se possível), apenas mantenha-o o mais simples possível. Vou usar a solução no meu módulo personalizado.

Carregar todos os nós \Drupal\node\Entity\Node::loadMultiple()e, em seguida, fazer o check-in, foreachafetaria muito o desempenho.

PolGraphic
fonte

Respostas:

39

Você pode usar Drupal::entityQuery()& Node::loadMultiple()para carregar todos os nós do seu tipo especificado:

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);
Shawn Conn
fonte
1
Alguma maneira de fazer isso genericamente para qualquer tipo de entidade? Você poderia pensar em \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); funcionaria, mas infelizmente não.
liquidcms 14/04
1
Esta resposta é específica para entidades do nó. Os detalhes serão alterados para outras entidades. Você deve fazer outra pergunta para um caso geral.
Shawn Conn
3
No código OOP, isso é agora $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Veja drupal.org/node/2849874 .
leymannx
17

Outra maneira de fazer isso seria usar esse trecho de código:

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

Geralmente você precisa de nós publicados, não todos.

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

É realmente muito fácil,

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

Se você deseja que todos os nós também não sejam publicados, use:

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

Algo que era, ao mesmo tempo, bastante simples de descobrir e encontrar documentação tornou-se um pouco mais confuso e difícil de encontrar. Este é um dos principais resultados de pesquisa deste tópico, por isso quero publicar uma solução que consegui montar usando os novos métodos.

Meu caso de uso está obtendo uma lista de nós publicados de um determinado tipo de conteúdo e publicando-os em uma página como XML para serem consumidos por terceiros.

Aqui estão as minhas declarações. Alguns deles podem ser supérfluos neste momento, mas ainda não terminei de atualizar o 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;

Aqui está o código para alimentar apenas o objeto no 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 você precisar massagear os dados, precisará preencher uma matriz e fazer edições nela. Obviamente, você ainda pode serializar uma matriz de biblioteca padrão.

/**
 * 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 isto ajude.

Loopy
fonte