获取给定类型的所有节点


21

我想获得所有在Drupal 8my_custom_type类型的节点。

我知道我可以使用来获得所有节点(任何类型)\Drupal\node\Entity\Node::loadMultiple()以及所有类型的列表\Drupal\node\Entity\NodeType::loadMultiple()

但是如何仅获取给定节点类型的节点?

我真的不想为此使用专门的模块(如果可能的话),只需使其尽可能简单即可。我将在自定义模块中使用该解决方案。

加载所有节点,\Drupal\node\Entity\Node::loadMultiple()然后检查它们的类型foreach会影响性能。

Answers:


39

您可以使用Drupal::entityQuery()Node::loadMultiple()加载给定类型的所有节点:

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

1
有什么办法可以对任何实体类型进行一般性的处理?您可能会认为\ Drupal :: entityQuery($ type)-> condition('type',$ bundle)> execute(); 会工作,但可惜没有。
liquidcms

1
该答案特定于节点实体。其他实体的详细信息将更改。对于一般情况,您应该问另一个问题。
肖恩·康

3
在OOP代码中,现在是$nids = $this->entityTypeManager->getStorage('node')->getQuery()->condition('type','my_custom_type')->execute();。参见drupal.org/node/2849874
leymannx

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

曾经一度相当容易找出和查找文档的东西变得更加混乱和难以查找。这是该主题的热门搜索结果之一,因此,我想花些时间发布使用新方法可以汇总的解决方案。

我的用例是获取某种内容类型的已发布节点的列表,并将它们作为XML发布到页面上,以供第三方使用。

这是我的声明。在这一点上,其中一些可能是多余的,但是到目前为止,我还没有完成代码的升级。

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

这是将对象馈入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;
  }
}

如果需要处理数据,则必须填充一个数组并在那里进行编辑。当然,您仍然可以序列化标准库数组。

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

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.