क्या प्रकार द्वारा नोड्स की सूची प्राप्त करने के लिए एक Drupal API फ़ंक्शन है?


35

क्या एक Drupal API फ़ंक्शन है node_load()जो किसी दिए गए प्रकार द्वारा नोड्स की सूची लौटाएगा?

मैंने कोशिश की है $nodes = node_load(array("type" => 'student_vote')), लेकिन यह केवल एक नोड लौटाता है।

मुझे पता है कि मैं कुछ ऐसा कोड कर सकता हूं node_load(), लेकिन मैं यह देखना चाहता था कि क्या ऐसा कुछ हो सकता है।

जवाबों:


45

Drupal के संस्करण पर निर्भर करता है:

ड्रुपल 6:

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

ड्रुपल 7:

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

ड्रुपल 8:

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

हां, यह काम करेगा।
मुनीर

6
इस बात को ध्यान में रखें कि $ शर्तें सरणी को ह्रास किया गया है और Drupal 8 में हटा दिया जाएगा, भविष्य की अनुकूलता के लिए EntityFieldQuery ( api.drupal.org/api/drupal/includes%2121ity.inc/class/… ) का उपयोग करना बेहतर होगा। नोड आईडी प्राप्त करें, फिर नोड_लोड_मूल्ट () के पहले तर्क में पास करें। यहाँ एक अच्छा ट्यूटोरियल है: drupal.org/node/1343708
बाला क्लार्क

1
स्पष्टता के लिए, EntityFieldQuery () Drupal 8 में अब और नहीं है
एलिजा लिन

13

Drupal 6 के लिए ऐसा कोई API नहीं है। आप जो निकटतम काम कर सकते हैं, वह सामग्री प्रकार के लिए सभी नोड आईडी के लिए ठीक से क्वेरी करना है, फिर प्रत्येक को node_load () का उपयोग करके लोड करें, लेकिन इसके लिए n + 1 प्रश्नों की आवश्यकता होगी और यह बहुत कुशल नहीं है।

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

नोट: db_rewrite_sqlपहुँच जाँच और अन्य मॉड्यूल प्रदान करना सुनिश्चित करेगा फ़िल्टरिंग (जैसे कि i18n मॉड्यूल द्वारा प्रदान की गई भाषा फ़िल्टरिंग)।

Drupal 7 के लिए, आप उपयोग कर सकते हैं $nodes = node_load_multiple(array(), array('type' => $type));लेकिन $conditionsतर्क node_load_multiple()वितर्कित है। इसके बजाय, आपको EntityFieldQuery का उपयोग नोड आईडी के लिए क्वेरी करने के लिए करना चाहिए, फिर उपयोग करें node_load_multiple()लेकिन बिना किसी $conditionतर्क के।

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']));
}

दरअसल, यदि आप D6 में एक नोड_लोड () इस तरह करते हैं: नोड_लोड (सरणी ('प्रकार' => 'पेज')) तो आपको सभी पेज नोड का एक सरणी मिलेगा।
ब्लेक सेफ्टनर

@bsenftner नोड_लोड (सरणी ('प्रकार' => पृष्ठ ')) केवल एक नोड लौटाता है।
चिम

7

पहले से ही कई अच्छे उत्तर हैं, लेकिन वे प्रश्न को शाब्दिक रूप से लेते हैं और केवल नोड्स को संदर्भित करते हैं।

चूँकि D6 के पास ऐसा करने के लिए API नहीं है, जो माँगा जा रहा है, और D7 में अपने आप को नोड्स तक सीमित करना आवश्यक नहीं है और आगे, मुझे लगता है कि एक अच्छा उत्तर होना चाहिए।

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[$]));
}

मैं इसके बारे में एक उत्तर जोड़ने जा रहा था EntityFieldQuery, लेकिन आप पहले ही अपना लिख ​​चुके हैं। मैं बस इतना जोड़ना चाहूंगा कि user_load_multiple()ड्रुपल 7 के बाद से दूसरे तर्क को हटा दिया गया है, और प्रयुक्त कोड वह होना चाहिए जो आप दिखाते हैं।
kiamlaluno

मुझे लगा कि मुझे पुराने संस्करणों को संदर्भित करने की आवश्यकता नहीं है क्योंकि मैं अभी-अभी Unit_load का उपयोग करता था। इस तरह से वहाँ लोगों की "नहीं" जोखिम गलती से हटाए गए कार्यक्षमता का उपयोग कर समाप्त हो रहा है। या आप उससे असहमत हैं?
लेटेरियन

1
क्या आपका मतलब था array_keys($results[$entity_type])?
आम

@commonpike सबसे अधिक संभावना है, हाँ। मेरे पास इस समय जांच करने का अवसर नहीं है, लेकिन यदि आप इसे जांचते हैं तो संपादित करने और सही करने के लिए स्वतंत्र महसूस करते हैं। :)

मैं कुछ अलग कर रहा था और निर्दिष्ट करने की आवश्यकता थी entity_load($entity_type, array_keys($results['node']));
हेवेंट ने

1

ड्रुपल 8:

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

1

सामग्री प्रकार से नोड्स की सूची प्राप्त करें

Drupal 6:

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

ड्रुपल 7:

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

ड्रुपल 8:

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

आशा है कि यह मददगार होगा।


उपरोक्त उत्तर की तुलना में आपके उत्तर में क्या भिन्न है ? बिलकुल ऐसा ही है।
Елин Й
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.