Skip to content
Snippets Groups Projects

Resolve #3412450 "Add a cte"

Merged Lee Rowlands requested to merge issue/entity_hierarchy-3412450:3412450-add-a-cte into 5.x
Files
10
@@ -4,9 +4,13 @@ declare(strict_types=1);
namespace Drupal\entity_hierarchy\Plugin\views\field;
use Drupal\entity_hierarchy\Storage\QueryBuilderFactory;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\entity_hierarchy\Query\TreeDepthSelect;
use Drupal\views\Plugin\views\field\FieldPluginBase;
use Drupal\views\ResultRow;
use Drupal\views\Plugin\views\query\Sql;
use Drupal\views\Views;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
@@ -18,32 +22,19 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
*/
class HierarchyDepth extends FieldPluginBase {
/**
* Constructs a new HierarchyDepth object.
*
* @param array $configuration
* Configuration.
* @param string $plugin_id
* Plugin ID.
* @param mixed $plugin_definition
* Definition.
* @param \Drupal\entity_hierarchy\Storage\QueryBuilderFactory $queryBuilderFactory
* The query builder factory service.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, protected readonly QueryBuilderFactory $queryBuilderFactory) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
}
protected EntityFieldManagerInterface $entityFieldManager;
protected EntityTypeManagerInterface $entityTypeManager;
protected Connection $database;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('entity_hierarchy.query_builder_factory')
);
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
$instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
$instance->entityTypeManager = $container->get('entity_type.manager');
$instance->entityFieldManager = $container->get('entity_field.manager');
$instance->database = $container->get('database');
return $instance;
}
/**
@@ -51,18 +42,20 @@ class HierarchyDepth extends FieldPluginBase {
*/
public function query() {
$this->ensureMyTable();
}
/**
* {@inheritdoc}
*/
public function render(ResultRow $values) {
if ($entity = $this->getEntity($values)) {
$queryBuilder = $this->queryBuilderFactory->get($this->configuration['entity_hierarchy_field'], $entity->getEntityTypeId());
return $queryBuilder->findDepth($entity);
}
return '';
assert($this->query instanceof Sql);
$query = new TreeDepthSelect($this->database, $this->entityFieldManager->getFieldStorageDefinitions($this->getEntityType())[$this->configuration['entity_hierarchy_field']], $this->entityTypeManager);
$def = $this->definition;
$def['type'] = 'LEFT';
$def['table formula'] = $query;
$def['left_table'] = $this->tableAlias;
$def['field'] = 'id';
$def['adjusted'] = TRUE;
$join = Views::pluginManager('join')->createInstance('standard', $def);
$alias = 'depth_for_' . $this->table;
$joinAlias = $this->query->addRelationship($alias, $join, $this->definition['base'], $this->relationship);
$this->field_alias = $this->query->addField($joinAlias, 'depth');
}
}
Loading