entity_hierarchy-8.x-2.24/src/Plugin/views/relationship/HierarchyRoot.php

src/Plugin/views/relationship/HierarchyRoot.php
<?php

namespace Drupal\entity_hierarchy\Plugin\views\relationship;

use Drupal\Core\Database\Connection;
use Drupal\views\Plugin\views\relationship\RelationshipPluginBase;
use Drupal\views\Views;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Relationship handler to return the top of the hierarchy.
 *
 * @ingroup views_relationship_handlers
 *
 * @ViewsRelationship("entity_hierarchy_root")
 */
class HierarchyRoot extends RelationshipPluginBase {

  /**
   * Database.
   *
   * @var \Drupal\Core\Database\Connection
   */
  protected $database;

  /**
   * Constructs a new HierarchyIsParentOfEntity object.
   *
   * @param array $configuration
   *   Configuration.
   * @param string $plugin_id
   *   Plugin ID.
   * @param mixed $plugin_definition
   *   Definition.
   * @param \Drupal\Core\Database\Connection $database
   *   Database connection.
   */
  final public function __construct(array $configuration, $plugin_id, $plugin_definition, Connection $database) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->database = $database;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('database')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function query() {
    $this->ensureMyTable();

    // Create a sub-select which finds depth 0 parents of any child.
    $ns_table = $this->definition['nested_set_table'];
    $query = $this->database->select($ns_table, 'eh_child');
    $query->addField('eh_child', 'id', 'eh_child_id');
    $query->addField('eh_child', 'revision_id', 'eh_child_revision_id');
    $query->addField('eh_parent', 'id', $this->definition['left_field']);
    $query->addJoin(
      'INNER',
      $ns_table,
      'eh_parent',
      '(eh_child.left_pos BETWEEN eh_parent.left_pos AND eh_parent.right_pos) AND eh_parent.depth = 0',
    );

    $def = $this->definition;
    $def['type'] = empty($this->options['required']) ? 'LEFT' : 'INNER';
    $def['table formula'] = $query;
    $def['left_table'] = $this->tableAlias;
    $def['field'] = 'eh_child_id';
    $def['adjusted'] = TRUE;

    // Define revision field to join to if needed.
    if (isset($def['extra']['revision'])) {
      $def['extra']['revision']['field'] = 'eh_child_revision_id';
    }

    $id = !empty($def['join_id']) ? $def['join_id'] : 'standard';
    $join = Views::pluginManager('join')->createInstance($id, $def);
    $alias = 'eh_for_' . $this->table;
    $this->alias = $this->query->addRelationship($alias, $join, $this->definition['base'], $this->relationship);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc