Verilen türün tüm düğümlerini al


21

Ben tüm düğümleri istiyorum my_custom_typetip Drupal 8'de .

Tüm düğümleri (her türden) \Drupal\node\Entity\Node::loadMultiple()ve tüm türlerin listesini alabileceğimi biliyorum \Drupal\node\Entity\NodeType::loadMultiple().

Ancak sadece verilen düğüm tipinin düğümlerini nasıl alabilirim?

Gerçekten bunun için özel bir modül kullanmak istemiyorum (mümkünse), sadece mümkün olduğunca basit tutun. Çözümü özel modülümde kullanacağım.

Ve tüm düğümleri yüklemek \Drupal\node\Entity\Node::loadMultiple()ve sonra türlerini kontrol etmek foreach, performansı çok fazla etkilerdi.

Yanıtlar:


39

Belirttiğiniz türdeki tüm düğümleri yüklemek için Drupal::entityQuery()& tuşunu kullanabilirsiniz Node::loadMultiple():

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

1
Bunu herhangi bir varlık türü için genel olarak yapmanın bir yolu var mı? \ Drupal :: entityQuery ($ type) -> condition ('type', $ bundle)> execute (); işe yarar, ama ne yazık ki hayır.
liquidcms

1
Bu yanıt düğüm varlıklarına özgüdür. Diğer varlıklar için ayrıntılar değişecektir. Genel bir dava için başka bir soru sormalısınız.
Shawn Conn

3
OOP kodunda bu şimdi $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();. Bkz. Drupal.org/node/2849874 .
leymannx

17

Bunu yapmanın başka bir yolu da bu kod snippet'ini kullanmak olabilir:

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

7

Genellikle yayınlanmış düğümlere ihtiyacınız vardır, hepsi değil.

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

7

Aslında çok kolay,

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

Tüm düğümlerin de yayınlanmamış olmasını istiyorsanız sadece şunu kullanın:

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

0

Bir zamanlar, dokümanları bulmak ve bulmak oldukça basit olan bir şey biraz daha kafa karıştırıcı ve bulmak zor hale geldi. Bu, bu konunun en iyi arama sonuçlarından biridir, bu yüzden yeni Yöntemleri kullanarak bir araya getirebildiğim bir çözüm göndermek için zaman ayırmak istiyorum.

Kullanım durumum, belirli bir içerik türünde yayınlanan düğümlerin bir listesini almak ve bunları üçüncü bir tarafın tüketeceği XML olarak bir sayfada yayınlamaktır.

İşte beyanlarım. Bazıları bu noktada gereksiz olabilir, ama henüz kod yükseltme henüz tamamlanmadı.

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

İşte nesneyi XML'e beslemek için kod

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

Verilere masaj yapmanız gerekiyorsa, bir dizi doldurmanız ve orada düzenlemeler yapmanız gerekir. Tabii ki, yine de standart bir kütüphane dizisini serileştirebilirsiniz.

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

Bu yardımcı olur umarım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.