Nhận tất cả các nút của loại đã cho


21

Tôi muốn nhận được tất cả các nút thuộc my_custom_typeloại trong Drupal 8 .

Tôi biết tôi có thể nhận được tất cả các nút (thuộc bất kỳ loại nào) \Drupal\node\Entity\Node::loadMultiple()và danh sách tất cả các loại theo \Drupal\node\Entity\NodeType::loadMultiple().

Nhưng làm thế nào để chỉ lấy các nút của loại nút đã cho?

Tôi thực sự không muốn sử dụng mô-đun chuyên dụng cho nó (nếu có thể), chỉ cần giữ nó đơn giản nhất có thể. Tôi sẽ sử dụng giải pháp trong mô-đun tùy chỉnh của tôi.

Và tải tất cả các nút với \Drupal\node\Entity\Node::loadMultiple()và sau đó kiểm tra loại của chúng foreachsẽ ảnh hưởng đến hiệu suất quá nhiều.

Câu trả lời:


39

Bạn có thể sử dụng Drupal::entityQuery()& Node::loadMultiple()để tải tất cả các nút thuộc loại đã cho:

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

1
Bất kỳ cách nào để làm điều này một cách khái quát cho bất kỳ loại thực thể? Bạn sẽ nghĩ \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> exec (); sẽ làm việc, nhưng đáng buồn là không.
Liquidcms

1
Câu trả lời này là cụ thể cho các thực thể nút. Chi tiết sẽ thay đổi cho các thực thể khác. Bạn nên hỏi một câu hỏi khác cho một trường hợp chung.
Shawn Conn

3
Trong mã OOP bây giờ là $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Xem drupal.org/node/2849874 .
leymannx

17

Một cách khác để làm điều này sẽ là sử dụng đoạn mã này:

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

7

Thông thường bạn cần các nút được công bố, không phải tất cả.

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

7

Nó thực sự rất dễ dàng,

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

Nếu bạn muốn tất cả các nút cũng chưa được công bố, chỉ cần sử dụng:

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

0

Một cái gì đó, tại một thời điểm, khá đơn giản để tìm ra và tìm tài liệu cho đã trở nên khá khó hiểu và khó tìm hơn. Đây là một trong những kết quả tìm kiếm hàng đầu cho chủ đề này, vì vậy tôi muốn dành thời gian để đăng một giải pháp tôi có thể kết hợp bằng các Phương thức mới.

Trường hợp sử dụng của tôi là lấy danh sách các nút được xuất bản của một loại nội dung nhất định và xuất bản chúng lên một trang dưới dạng XML để được bên thứ ba sử dụng.

Đây là những tuyên bố của tôi. Một số trong số chúng có thể là thừa vào thời điểm này, nhưng tôi vẫn chưa hoàn thành việc nâng cấp mã.

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

Đây là mã để chỉ cung cấp đối tượng vào 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;
  }
}

Nếu bạn cần xoa bóp dữ liệu, thì bạn sẽ phải điền một mảng và chỉnh sửa ở đó. Tất nhiên, bạn vẫn có thể tuần tự hóa một mảng thư viện tiêu chuẩn.

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

Hi vọng điêu nay co ich.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.