दिए गए प्रकार के सभी नोड प्राप्त करें


21

मैं सभी नोड्स प्राप्त करना चाहूंगा जो कि ड्रुपल 8 मेंmy_custom_type टाइप के हैं ।

मुझे पता है कि मैं सभी नोड्स (किसी भी प्रकार का) के साथ \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 :: unitQuery ($ प्रकार) -> स्थिति ('प्रकार', $ बंडल)> निष्पादित (); काम करेगा, लेकिन दुख की बात है कि नहीं।
लिक्विडम्स

1
यह उत्तर नोड संस्थाओं के लिए विशिष्ट है। अन्य संस्थाओं के लिए विवरण बदल जाएगा। आपको सामान्य मामले के लिए एक और प्रश्न पूछना चाहिए।
शॉन कॉन

3
OOP कोड में अब यह है $nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();Drupal.org/node/2849874 देखें ।
लेमनकैन

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

कुछ ऐसा था, जो एक समय में, यह पता लगाने के लिए काफी सरल था और प्रलेखन खोजने के लिए बहुत अधिक भ्रमित और कठिन हो गया है। यह इस विषय के लिए शीर्ष खोज परिणामों में से एक है, इसलिए मैं एक समाधान पोस्ट करने के लिए समय निकालना चाहता हूं जो मैं नए तरीकों का उपयोग करके एक साथ रखने में सक्षम था।

मेरे उपयोग के मामले को एक निश्चित सामग्री प्रकार के प्रकाशित नोड्स की एक सूची मिल रही है और उन्हें एक पृष्ठ पर एक्सएमएल के रूप में प्रकाशित करने के लिए तीसरे पक्ष द्वारा उपभोग किया जा रहा है।

यहां मेरी घोषणाएं हैं। उनमें से कुछ इस बिंदु पर बहुत कम हो सकते हैं, लेकिन मैंने अभी तक कोड को अपग्रेड नहीं किया है।

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

यहाँ एक्सएमएल में ऑब्जेक्ट को फीड करने के लिए कोड है

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

उम्मीद है की यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.