Статья: Вывод названий материалов в Drupal с определенными типами и связанными подтипами

При разработке сайтов на Drupal иногда возникает необходимость вывести названия материалов с определенным типом и связанный названия подтипа. В этой статье мы рассмотрим, как это можно сделать.

Шаг 1: Создание типа материала и подтипа

В первую очередь, необходимо создать тип материалов и подтип, с которыми будет связан материал. Например, мы создадим тип материала «Статья» и подтип «Новости».


$entity_type = 'node_type';
$entity = [
  'type' => 'article',
  'name' => 'Статья',
];
$storage = Drupal::entityTypeManager()->getStorage($entity_type);
$storage->create($entity)->save();

$entity = [
  'type' => 'news',
  'name' => 'Новости',
];
$storage->create($entity)->save();

Шаг 2: Вывод названий материалов с определенным типом и связанных подтипов

Для вывода названий материалов с определенным типом и связанных подтипов можно использовать запрос к базе данных. Вот пример кода для этого:


$query = \Drupal::entityQuery('node')
  ->condition('type', 'article')
  ->condition('field_subtype.entity.name', 'Новости');

$nids = $query->execute();
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($nids);

foreach ($nodes as $node) {
  echo $node->getTitle();
}

Дополнительные вопросы и ответы

Вопрос 1: Как вывести названия материалов с несколькими связанными подтипами?

Для вывода названий материалов с несколькими связанными подтипами можно использовать оператор OR в условиях запроса к базе данных. Вот пример кода:


$query = \Drupal::entityQuery('node')
  ->condition('type', 'article')
  ->condition('field_subtype.entity.name', 'Новости')
  ->condition('field_subtype.entity.name', 'События', 'OR');

$nids = $query->execute();
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($nids);

foreach ($nodes as $node) {
  echo $node->getTitle();
}

Вопрос 2: Как вывести только определенное количество названий материалов?

Для вывода только определенного количества названий материалов можно использовать метод range(). Вот пример кода:


$query = \Drupal::entityQuery('node')
  ->condition('type', 'article')
  ->range(0, 5);

$nids = $query->execute();
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($nids);

foreach ($nodes as $node) {
  echo $node->getTitle();
}

Вопрос 3: Как вывести названия материалов с определенным типом, но без связанных подтипов?

Для вывода названий материалов с определенным типом, но без связанных подтипов, можно использовать метод isNull(). Вот пример кода:


$query = \Drupal::entityQuery('node')
  ->condition('type', 'article')
  ->condition('field_subtype', NULL, 'IS NULL');

$nids = $query->execute();
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($nids);

foreach ($nodes as $node) {
  echo $node->getTitle();
}