Zbierz wszystkie węzły danego typu

21

Chciałbym uzyskać wszystkie węzły tego my_custom_typetypu w Drupal 8 .

Wiem, że mogę pobrać wszystkie węzły (dowolnego typu) \Drupal\node\Entity\Node::loadMultiple()i listę wszystkich typów według \Drupal\node\Entity\NodeType::loadMultiple().

Ale jak uzyskać tylko węzły danego typu węzła?

Naprawdę nie chcę używać do tego specjalnego modułu (jeśli to możliwe), po prostu staraj się, aby był tak prosty, jak to możliwe. Użyję rozwiązania w moim niestandardowym module.

A załadowanie wszystkich węzłów, \Drupal\node\Entity\Node::loadMultiple()a następnie sprawdzenie ich typu foreachzbyt mocno wpłynęłoby na wydajność.

PolGraphic
źródło

Odpowiedzi:

39

Możesz użyć Drupal::entityQuery()&, Node::loadMultiple()aby załadować wszystkie węzły danego typu:

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);
Shawn Conn
źródło
1
Jakiś sposób to zrobić ogólnie dla dowolnego typu jednostki? Można by pomyśleć \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); działałoby, ale niestety nie.
liquidcms
1
Ta odpowiedź jest specyficzna dla encji węzłów. Szczegóły zmienią się dla innych podmiotów. Powinieneś zadać kolejne pytanie dotyczące ogólnej sprawy.
Shawn Conn
3
W kodzie OOP jest to teraz $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Zobacz drupal.org/node/2849874 .
leymannx,
17

Innym sposobem na to byłoby użycie tego fragmentu kodu:

$values = [
  'type' => 'page'
];
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties($values);
MrD
źródło
7

Zwykle potrzebujesz opublikowanych węzłów, nie wszystkich.

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

To jest naprawdę bardzo łatwe,

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

Jeśli chcesz, aby wszystkie węzły również nie zostały opublikowane, użyj:

\Drupal::entityTypeManager()->getStorage('node')
  ->loadByProperties(['type' => 'content_type'])
Remco Hoeneveld
źródło
0

Coś, co kiedyś było dość proste do znalezienia i znalezienia dokumentacji, stało się nieco bardziej mylące i trudne do znalezienia. Jest to jeden z najlepszych wyników wyszukiwania w tym temacie, dlatego chcę poświęcić czas na opublikowanie rozwiązania, które udało mi się opracować przy użyciu nowych metod.

Mój przypadek użycia polega na uzyskaniu listy opublikowanych węzłów określonego typu treści i opublikowaniu ich na stronie jako XML do wykorzystania przez stronę trzecią.

Oto moje deklaracje. Niektóre z nich mogą być w tym momencie zbędne, ale jak dotąd nie skończyłem aktualizować kodu.

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

Oto kod, aby po prostu wprowadzić obiekt do pliku 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;
  }
}

Jeśli potrzebujesz masować dane, musisz wypełnić tablicę i dokonać edycji. Oczywiście nadal można serializować standardowy zestaw bibliotek.

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

Mam nadzieję że to pomoże.

Loopy
źródło