Отримати всі вузли даного типу


21

Я хотів би отримати всі вузли, які є my_custom_typeтипом у Drupal 8 .

Я знаю, що я можу отримати всі вузли (будь-якого типу) \Drupal\node\Entity\Node::loadMultiple()і список усіх типів \Drupal\node\Entity\NodeType::loadMultiple().

Але як отримати лише вузли заданого типу вузла?

Я дійсно не хочу використовувати спеціалізований модуль для нього (якщо це можливо), просто тримайте його максимально просто. Я буду використовувати рішення у своєму спеціальному модулі.

І завантаження всіх вузлів, \Drupal\node\Entity\Node::loadMultiple()а потім перевірка їх типу, foreachзанадто сильно вплине на продуктивність.

Відповіді:


39

Ви можете використовувати Drupal::entityQuery()& Node::loadMultiple()для завантаження всіх вузлів даного типу:

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

1
Будь-який спосіб зробити це загально для будь-якого типу сутності? Ви можете подумати \ Drupal :: entitQuery ($ type) -> condition ('type', $ bundle)> Execute (); працювало б, але, на жаль, ні.
ліквід

1
Ця відповідь характерна для вузлів сутності. Деталі зміниться для інших організацій. Вам слід задати ще одне запитання для загальної справи.
Шон Конн

3
У коді OOP це зараз $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Див. Drupal.org/node/2849874 .
leymannx

17

Ще один спосіб зробити це за допомогою цього фрагмента коду:

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

7

Зазвичай потрібні опубліковані вузли, не всі.

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

7

Це насправді дуже просто,

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

Якщо ви хочете, щоб усі вузли також були неопублікованими, просто використовуйте:

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

0

Щось, що було, свого часу, досить просто розібратися та знайти документацію, стало зовсім трохи заплутаніше та важко знайти. Це один із найкращих результатів пошуку по цій темі, тому я хочу витратити час, щоб опублікувати рішення, яке мені вдалося скласти разом, використовуючи нові методи.

У моєму випадку використання - це перелік опублікованих вузлів певного типу вмісту та публікація їх на сторінці у вигляді XML, яку споживає третя сторона.

Ось мої декларації. Деякі з них можуть бути зайвими на даний момент, але я ще не закінчив оновлення коду.

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

Ось код для просто введення об'єкта в 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;
  }
}

Якщо вам потрібно зробити масаж даних, вам доведеться заповнити масив і внести зміни в нього. Звичайно, ви все ще можете серіалізувати стандартний масив бібліотеки.

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

Сподіваюсь, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.