รับโหนดทั้งหมดของประเภทที่กำหนด


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 :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); จะทำงานได้ แต่ไม่น่าเศร้า
liquidcms

1
คำตอบนี้เฉพาะเจาะจงกับโหนดเอนทิตี รายละเอียดจะเปลี่ยนไปสำหรับเอนทิตีอื่น ๆ คุณควรถามคำถามอื่นสำหรับกรณีทั่วไป
Shawn Conn

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

หวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.