Dapatkan semua node dari tipe yang diberikan

21

Saya ingin mendapatkan semua node yang my_custom_typebertipe dalam Drupal 8 .

Saya tahu saya bisa mendapatkan semua node (dari jenis apa pun) dengan \Drupal\node\Entity\Node::loadMultiple()dan daftar semua jenis oleh \Drupal\node\Entity\NodeType::loadMultiple().

Tetapi bagaimana cara mendapatkan hanya node dari tipe node yang diberikan?

Saya benar-benar tidak ingin menggunakan modul khusus untuk itu (jika mungkin), tetap sesederhana mungkin. Saya akan menggunakan solusi dalam modul khusus saya.

Dan memuat semua node dengan \Drupal\node\Entity\Node::loadMultiple()dan kemudian memeriksa tipenya foreachakan memukul kinerja terlalu banyak.

PolGraphic
sumber

Jawaban:

39

Anda dapat menggunakan Drupal::entityQuery()& Node::loadMultiple()untuk memuat semua node dari tipe yang Anda berikan:

$nids = \Drupal::entityQuery('node')->condition('type','my_custom_type')->execute();
$nodes =  \Drupal\node\Entity\Node::loadMultiple($nids);
Shawn Conn
sumber
1
Adakah cara untuk melakukan ini secara umum untuk semua jenis entitas? Anda akan berpikir \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); akan bekerja, tetapi sayangnya tidak.
liquidcms
1
Jawaban ini khusus untuk entitas simpul. Detail akan berubah untuk entitas lain. Anda harus mengajukan pertanyaan lain untuk kasus umum.
Shawn Conn
3
Dalam kode OOP sekarang ini $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Lihat drupal.org/node/2849874 .
leymannx
17

Cara lain untuk melakukan ini adalah menggunakan potongan kode ini:

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

Biasanya Anda perlu node yang diterbitkan, tidak semua.

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

Ini sebenarnya sangat mudah,

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

Jika Anda ingin semua node juga tidak dipublikasikan, cukup gunakan:

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

Sesuatu yang, pada suatu waktu, cukup mudah untuk dipecahkan dan ditemukan dokumentasi untuk menjadi sedikit lebih membingungkan dan sulit ditemukan. Ini adalah salah satu hasil pencarian teratas untuk topik ini, jadi saya ingin meluangkan waktu untuk memposting solusi yang saya bisa kumpulkan menggunakan Metode baru.

Kasus penggunaan saya adalah mendapatkan daftar node yang diterbitkan dari jenis konten tertentu dan menerbitkannya ke halaman sebagai XML untuk dikonsumsi oleh pihak ketiga.

Ini deklarasi saya. Beberapa dari mereka mungkin berlebihan pada saat ini, tapi saya belum selesai memperbarui kode.

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

Berikut kode untuk hanya memberi makan objek ke 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;
  }
}

Jika Anda perlu memijat data, maka Anda harus mengisi array dan mengeditnya. Tentu saja, Anda masih bisa membuat serial array perpustakaan standar.

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

Semoga ini membantu.

Gila
sumber