You are here

public function LdapQuery::execute in Lightweight Directory Access Protocol (LDAP) 8.4

Same name and namespace in other branches
  1. 8.3 ldap_query/src/Plugin/views/query/LdapQuery.php \Drupal\ldap_query\Plugin\views\query\LdapQuery::execute()

Execute the query.

Parameters

\Drupal\views\ViewExecutable $view: The view.

Return value

bool|void Nothing if query can be executed.

Overrides QueryPluginBase::execute

File

ldap_query/src/Plugin/views/query/LdapQuery.php, line 78

Class

LdapQuery
Views query plugin for an SQL query.

Namespace

Drupal\ldap_query\Plugin\views\query

Code

public function execute(ViewExecutable $view) {
  if (!isset($this->options['query_id']) || empty($this->options['query_id'])) {
    \Drupal::logger('ldap')
      ->error('You are trying to use Views without having chosen an LDAP Query under Advanced => Query settings.');
    return FALSE;
  }
  $start = microtime(TRUE);

  // @todo Dependency Injection.

  /** @var \Drupal\ldap_query\Controller\QueryController $controller */
  $controller = \Drupal::service('ldap.query');
  $controller
    ->load($this->options['query_id']);
  $filter = $this
    ->buildLdapFilter($controller
    ->getFilter());
  $controller
    ->execute($filter);
  $results = $controller
    ->getRawResults();
  $fields = $controller
    ->availableFields();
  $index = 0;
  $rows = [];
  foreach ($results as $result) {
    $row = [];
    foreach ($fields as $field_key => $void) {
      if ($result
        ->hasAttribute($field_key, FALSE)) {
        $row[$field_key] = $result
          ->getAttribute($field_key, FALSE);
      }
    }
    $row['dn'] = [
      0 => $result
        ->getDn(),
    ];
    $row['index'] = $index++;
    $rows[] = $row;
  }
  if (!empty($this->orderby) && !empty($rows)) {
    $rows = $this
      ->sortResults($rows);
  }
  foreach ($rows as $row) {
    $view->result[] = new ResultRow($row);
  }

  // Pager.
  $totalItems = count($view->result);
  $offset = $view->pager
    ->getCurrentPage() * $view->pager
    ->getItemsPerPage() + $view->pager
    ->getOffset();
  $length = NULL;
  if ($view->pager
    ->getItemsPerPage() > 0) {

    // A Views ExposedInput for items_for_page will return a string value
    // via a querystring parameter.
    $length = (int) $view->pager
      ->getItemsPerPage();
  }
  if ($offset > 0 || $length > 0) {
    $view->result = array_splice($view->result, $offset, $length);
  }
  $view->pager
    ->postExecute($view->result);
  $view->pager->total_items = $totalItems;
  $view->pager
    ->updatePageInfo();
  $view->total_rows = $view->pager
    ->getTotalItems();

  // Timing information.
  $view->execute_time = microtime(TRUE) - $start;
}