Türüne göre düğümlerin listesini almak için bir Drupal API işlevi var mı?


35

node_load()Belirli bir türe göre bir düğüm listesi döndürecek böyle bir Drupal API işlevi var mı ?

Denedim $nodes = node_load(array("type" => 'student_vote')), ancak yalnızca bir düğümü döndürdü.

Bunun gibi bir şeyi kodlayabileceğimi biliyorum node_load(), ama zaten böyle bir şey olup olmadığını görmek istedim.

Yanıtlar:


45

Drupal'ın sürümüne bağlı olarak:

drupal 6:

$nodes = db_query('SELECT nid FROM {node} WHERE type="%s"', $type);

drupal 7:

$nodes = node_load_multiple(array(), array('type' => $type));

drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'NODETYPE')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);

Evet, bu işe yarar.
Muneer

6
$ Koşullar dizisinin amortismana tabi tutulduğunu ve Drupal 8’de kaldırılacağını aklınızda bulundurun, gelecekteki uyumluluk için EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) ' nin kullanılması daha iyi olacaktır . düğüm kimliklerini alın, sonra bunları ilk düğüm argümanına geçirin_load_multiple (). Burada iyi bir ders var: drupal.org/node/1343708
Bala Clark

1
Sadece netlik için, EntityFieldQuery () artık Drupal 8'de değil.
Elijah Lynn

13

Drupal 6 için böyle bir API yok. Yapabileceğiniz en yakın içerik türü için tüm düğüm kimliğini doğru şekilde sorgulamak ve sonra node_load () kullanarak her birini yüklemek, ancak bu n + 1 sorguları gerektirecek ve çok verimli olmayacak.

function node_load_by_type($type, $limit = 15, $offset = 0) {
  $nodes = array();
  $query = db_rewrite_sql("SELECT nid FROM {node} n WHERE type = '%s'", 'n');
  $results = db_query_range($query, $type, $offset, $limit);
  while($nid = db_result($results)) {
    $nodes[] = node_load($nid);
  }
  return $nodes;
}

Not: db_rewrite_sqlerişim kontrolü ve sağlanan diğer filtrelemeyi (i18n modülü tarafından sağlanan dil filtrelemesi gibi) sağlayacaktır.

Drupal 7 için kullanabilirsiniz, $nodes = node_load_multiple(array(), array('type' => $type));ancak $conditionsargümanı node_load_multiple()kullanımdan kaldırılmıştır. Bunun yerine, düğüm kimliklerini sorgulamak için EntityFieldQuery'yi kullanmalı , sonra kullanmalı node_load_multiple()ancak bir $conditionargüman kullanmamalısınız.

function node_load_by_type($type, $limit = 15, $offset = 0) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', $type)
    ->range($offset, $limit);
  $results = $query->execute();
  return node_load_multiple(array_keys($results['node']));
}

Aslında, D6'da böyle bir node_load () yaparsanız: node_load (array ('type' => 'sayfa')) tüm sayfa düğümlerinin bir dizisini alırsınız.
Blake Senftner

@bsenftner node_load (dizi ('type' => 'sayfa')) yalnızca bir düğüm döndürür.
şimşek

7

Zaten birkaç iyi cevap var, ancak soruyu kelimenin tam anlamıyla ele alıyorlar ve sadece düğümlere atıfta bulunuyorlar.

D6'nın istediği şeyi yapmak için bir API'si olmadığından ve kendini D7 ve ilerideki düğümlerle sınırlamak gerekli olmadığından, iyi bir cevabın varlık jenerik olması gerektiğini düşünüyorum.

function entity_load_by_type($entity_type, $bundle, $limit = 10, $offset = 0) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', $entity_type)
    ->entityCondition('bundle', $bundle)
    ->range($offset, $limit);
  $results = $query->execute();
  return entity_load($entity_type, array_keys($results[$]));
}

Hakkında bir cevap ekleyecektim EntityFieldQuery, ama sen zaten kendin yazdın. user_load_multiple()Drupal 7’den bu yana ikinci argümanının kullanımdan kaldırıldığını ve kullanılan kodun gösterdiğiniz kod olması gerektiğini ekleyeceğim .
kiamlaluno

Ben sadece hemen entity_load kullandığım için eski sürümleri kullanımdan kaldırılmış argümanlara bile gerek duymadığımı düşündüm. Bu şekilde, insanların kullanımdan kaldırılmış işlevselliği kullanmaları sonucu kazayla sonuçlanma riski yoktur. Yoksa buna katılmıyor musun?
Letharion

1
bunu mu demek istediniz array_keys($results[$entity_type])?
commonpike

@commonpike Büyük olasılıkla, evet. Şu anda kontrol etme şansım yok, ancak test ederseniz düzenlemek ve düzeltmek için çekinmeyin. :)
Letharion

Biraz farklı bir şey yapıyordum ve belirtmem gerekiyordu entity_load($entity_type, array_keys($results['node']));. Havent diğer varlıklar için test etti ..
commonpike

1

drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'student_vote')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);

1

İçerik türündeki düğümlerin listesini alın

Drupal 6:

$nodes = db_query('SELECT nid FROM {node} WHERE type="%s"', 'student_vote');

Drupal 7:

$nodes = node_load_multiple(array(), array('type' => 'student_vote'));

Drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'student_vote')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);

Umarım bu yardımcı olur.


Cevabınızda yukarıdaki cevaptan farklı olan nedir ? Bu tamamen aynı.
Елин Й.
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.