entity_hierarchy-8.x-2.24/src/Plugin/views/argument/HierarchyIsSiblingOfEntity.php

src/Plugin/views/argument/HierarchyIsSiblingOfEntity.php
<?php

namespace Drupal\entity_hierarchy\Plugin\views\argument;

use Drupal\Core\Form\FormStateInterface;

/**
 * Argument to limit to parent of an entity.
 *
 * @ingroup views_argument_handlers
 *
 * @ViewsArgument("entity_hierarchy_argument_is_sibling_of_entity")
 */
class HierarchyIsSiblingOfEntity extends EntityHierarchyArgumentPluginBase {

  /**
   * Set up the query for this argument.
   *
   * The argument sent may be found at $this->argument.
   */
  public function query($group_by = FALSE) {
    $this->ensureMyTable();
    // Load the actual entity.
    $filtered = FALSE;
    if ($entity = $this->loadEntity()) {
      $stub = $this->nodeKeyFactory->fromEntity($entity);
      if ($node = $this->getTreeStorage()->findParent($stub)) {
        // Query between a range with fixed depth, excluding the original node.
        $filtered = TRUE;
        $lower_token = ':lower_' . $this->tableAlias;
        $upper_token = ':upper_' . $this->tableAlias;
        $depth_token = ':depth_' . $this->tableAlias;
        $expression = "$this->tableAlias.$this->realField BETWEEN {$lower_token} and {$upper_token} AND $this->tableAlias.$this->realField <> {$lower_token} AND $this->tableAlias.depth = {$depth_token}";
        $arguments = [
          $lower_token => $node->getLeft(),
          $upper_token => $node->getRight(),
          $depth_token => $node->getDepth() + 1,
        ];
        if (!$this->options['show_self']) {
          $self_token = ':self' . $this->tableAlias;
          $expression .= " AND $this->tableAlias.id != {$self_token}";
          $arguments[$self_token] = $stub->getId();
        }

        $this->query->addWhereExpression(0, $expression, $arguments);
      }
    }
    // The parent entity doesn't exist, or isn't in the tree and hence has no
    // children.
    if (!$filtered) {
      // Add a killswitch.
      $this->query->addWhereExpression(0, '1 <> 1');
    }
  }

  /**
   * {@inheritdoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    $form['show_self'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Show self'),
      '#default_value' => $this->options['show_self'],
      '#description' => $this->t('Filter out the current child from the list of siblings.'),
    ];
    parent::buildOptionsForm($form, $form_state);
    unset($form['depth']);
  }

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = parent::defineOptions();
    unset($options['depth']);
    $options['show_self'] = ['default' => FALSE];

    return $options;
  }

}

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

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