You are here

function ldap_views_plugin_query_ldap::execute in Lightweight Directory Access Protocol (LDAP) 7

Same name and namespace in other branches
  1. 8.2 ldap_views/plugins/ldap_views_plugin_query_ldap.inc \ldap_views_plugin_query_ldap::execute()
  2. 7.2 ldap_views/plugins/ldap_views_plugin_query_ldap.inc \ldap_views_plugin_query_ldap::execute()

Executes the query and fills the associated view object with according values.

Values to set: $view->result, $view->total_rows, $view->execute_time, $view->pager['current_page'].

$view->result should contain an array of objects.

Overrides views_plugin_query::execute

File

ldap_views/plugins/ldap_views_plugin_query_ldap.inc, line 206
Defines the default query object which builds and execute a ldap query

Class

ldap_views_plugin_query_ldap
@file Defines the default query object which builds and execute a ldap query

Code

function execute(&$view) {
  $start = microtime();
  $entries = array();
  $num_entries = 0;
  if (empty($this->options['qid'])) {
    watchdog('ldap_views', 'Query definition is empty');
    return;
  }
  foreach ($this->fields as $field) {
    $attributes[$field['alias']] = $field['field'];
    $field_alias[$field['alias']] = drupal_strtolower($field['field']);
  }
  $ldap_data = new LdapQuery(ldap_views_get_qid($view));
  $ldap_server = new LdapServer($ldap_data->sid);
  $ldap_server
    ->connect();
  $ldap_server
    ->bind();

  // TODO: Can't use sizelimit if it must be ordered || cache?
  // $ldap_server->search() hasn't orderby (ldap_sort)
  // But we can't use ldap_sort because there's no DESC option
  foreach ($this
    ->build_ldap_basedn($ldap_data->baseDn) as $basedn) {
    $result = $ldap_server
      ->search($basedn, $this
      ->build_ldap_filter($ldap_data->filter), array_values($attributes), 0, $ldap_data->sizelimit, $ldap_data->timelimit, $ldap_data->deref, $ldap_data->scope);

    /***
        // ldap_sort can't be used because there's no DESC option
        if (!empty($this->orderby)) {
          // Array reverse, because the most specific are first - PHP works the opposite way of SQL.
          foreach (array_reverse($this->orderby) as $field) {
            @ldap_sort($ldap_server->connection, $result, $field['field']);
          }
        }
     */
    if ($result !== FALSE) {

      // not an error
      $entries = array_merge($entries, $result);
      $num_entries += array_shift($result);
    }
  }
  $limit = $view->query->limit;
  $offset = $view->query->offset;
  $result = array();
  $sort_fields = array();
  if (!empty($this->orderby)) {
    foreach ($this->orderby as $orderby) {
      $sort_fields[drupal_strtolower($orderby['field'])]['direction'] = $orderby['direction'];
      $sort_fields[drupal_strtolower($orderby['field'])]['data'] = array();
    }
  }
  foreach ($entries as $key => &$entry) {
    if (isset($entry['jpegphoto'])) {
      $entry['jpegphoto'][0] = "<img src='data:image/jpeg;base64," . base64_encode($entry['jpegphoto'][0]) . "' alt='photo' />";
    }
    foreach ($view->field as $field) {
      if (!isset($field_alias[$field->field_alias])) {
        continue;
      }
      $alias = $field_alias[$field->field_alias];
      if (is_array($entry) && array_key_exists($alias, $entry)) {
        if (is_array($entry[$alias])) {
          switch ($field->options['multivalue']) {
            case 'v-all':

              // remove 'count' index
              array_shift($entry[$alias]);
              $entry[$alias] = implode($field->options['value_separator'], $entry[$alias]);
              break;
            case 'v-count':
              $entry[$alias] = $entry[$alias]['count'];
              break;
            case 'v-index':
              $index = $field->options['index_value'] >= 0 ? intval($field->options['index_value']) : $entry[$alias]['count'] + $field->options['index_value'];
              $entry[$alias] = array_key_exists($index, $entry[$alias]) ? $entry[$alias][$index] : $entry[$alias][0];
              break;
          }
        }

        // order criteria
        if (array_key_exists($alias, $sort_fields)) {
          $sort_fields[$alias]['data'][$key] = $entry[$alias];
        }
      }
    }
  }
  if (!empty($this->orderby) && !empty($entries)) {
    $params = array();

    // In PHP 5.3 every parameter in the array has to be a reference when calling array_multisort() with call_user_func_array().
    $asc = SORT_ASC;
    $desc = SORT_DESC;
    foreach ($sort_fields as &$field) {
      $params[] =& $field['data'];
      if (drupal_strtoupper($field['direction']) == 'ASC') {
        $params[] =& $asc;
      }
      else {
        $params[] =& $desc;
      }
    }
    $params[] =& $entries;

    // Some LDAP setups output a 'count' variable first in the array, which changes the array size;
    // temporarily remove it, sort the arrays, and then put it back.
    if (array_key_exists('count', $entries)) {
      $countValue = array_shift($entries);

      // remove the count variable
      $params[] =& $entries;
      call_user_func_array('array_multisort', $params);
      array_unshift($params, $countValue);
    }
    else {
      $params[] =& $entries;
      call_user_func_array('array_multisort', $params);
    }
  }
  for ($i = 0; (!isset($limit) || $i < $limit) && $offset + $i < $num_entries; $i++) {
    $row = array();
    $entry =& $entries[$offset + $i];
    foreach ($view->field as $field) {
      if (!isset($field_alias[$field->field_alias])) {
        continue;
      }
      if (array_key_exists($field_alias[$field->field_alias], $entry)) {
        $row[$field->field_alias] = $entry[$field_alias[$field->field_alias]];
      }
    }
    $result[] = $row;
  }
  $view->result = $result;
  $view->total_rows = $num_entries;
  $view->execute_time = microtime() - $start;
  $view->query->pager->total_items = $num_entries;
  $view->query->pager
    ->update_page_info();
}