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; } }