You are here

public function DraggableViewsSort::query in DraggableViews 2.0.x

Called to add the sort to a query.

Overrides SortPluginBase::query

File

src/Plugin/views/sort/DraggableViewsSort.php, line 76

Class

DraggableViewsSort
Basic sort handler for Draggableviews Weight.

Namespace

Drupal\draggableviews\Plugin\views\sort

Code

public function query() {

  // We should variablise these somehow??
  $base = 'draggableviews_structure';
  $base_field = "entity_id";

  // Grab our view/plugin reference.
  list($view_id, $view_display_id) = $this
    ->splitViewSortDataOptions($this->options['draggable_views_reference']);
  $def = $this->definition;
  $def['table'] = $base;
  $def['field'] = $base_field;
  $def['left_table'] = $this->query->view->storage
    ->get('base_table');
  $def['left_field'] = $this->query->view->storage
    ->get('base_field');
  $def['adjusted'] = TRUE;
  $def['extra'][] = [
    'field' => 'view_name',
    'value' => $view_id,
  ];
  $def['extra'][] = [
    'field' => 'view_display',
    'value' => $view_display_id,
  ];
  if (!empty($this->definition['extra'])) {
    $def['extra'] = $this->definition['extra'];
  }
  if (!empty($def['join_id'])) {
    $id = $def['join_id'];
  }
  else {
    $id = 'draggableviews_with_args';
  }
  $join = Views::pluginManager('join')
    ->createInstance($id, $def);

  // Use a short alias for this:
  $alias = $def['table'];
  $this->alias = $this->query
    ->addRelationship($alias, $join, $this->query->view->storage
    ->get('base_table'), $this->relationship);
  if ($this->options['draggable_views_null_order'] == "before") {
    $formula = "!ISNULL({$this->alias}.{$this->realField})";
  }
  else {
    $formula = "ISNULL({$this->alias}.{$this->realField})";
  }

  // We add both to handle ordering of NULL values.
  $this->query
    ->addOrderBy(NULL, $formula, $this->options['order'], $this->alias . "_" . $this->realField);
  $this->query
    ->addOrderBy($this->alias, $this->realField, $this->options['order']);
}