Drupal → Создание сравнительной таблицы с значениями из EAV Field

10.07.2024

Дано - ноды с полем EAV Field.

Задача - вывести сравнительную таблицу характеристик некоторых нод:

Решение:

$nodes = Node::loadMultiple([1, 2, 3]);

$table_build = [
  '#theme' => 'table',
  '#header' => [],
  '#rows' => [],
];

// Collect used eav attributes
$eav_attributes = []; /** @var EavAttributeInterface[] $eav_attributes */
foreach ($nodes as $node) {
  /** @var EavItemInterface $eav_field_item */
  foreach ($node->get('field_attributes') as $eav_field_item) {
    if ($eav_attribute = $eav_field_item->getValueEntity()->getAttributeEntity()) {
      $eav_attributes[$eav_attribute->id()] = $eav_attribute;
    }
  }
}

// Build header
$table_build['#header'][] = '';
foreach ($nodes as $nid => $node) {
  $table_build['#header'][$nid] = $node->label();
}

// Build first column
foreach ($eav_attributes as $eav_attribute_id => $eav_attribute) {
  $table_build['#rows'][$eav_attribute_id][0] = $eav_attribute->label();
}

// Build other columns
foreach ($nodes as $nid => $node) {
  // Set blank values
  foreach ($eav_attributes as $eav_attribute_id => $eav_attribute) {
    $table_build['#rows'][$eav_attribute_id][$nid] = '';
  }

  // Set real values
  /** @var EavItemInterface $eav_field_item */
  foreach ($node->get('field_attributes') as $eav_field_item) {
    $eav_value = $eav_field_item->getValueEntity();
    if ($eav_attribute = $eav_value->getAttributeEntity()) {
      $table_build['#rows'][$eav_attribute->id()][$nid] = $eav_value->viewValueField();
    }
  }
}
Написанное актуально для
EAV Field 2.x
Похожие записи

Добавить комментарий