You are here

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

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 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 242
Defines the default query object which builds and execute a ldap query.

Class

ldap_views_plugin_query_ldap

Code

public function execute(&$view) {
  $start = microtime(TRUE);
  $entries = [];
  $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
    // Not an error.
    if ($result !== FALSE) {
      $entries = array_merge($entries, $result);
      $num_entries += $result['count'];
      unset($result['count']);
    }
  }
  if (property_exists($view->query, 'limit')) {
    $limit = $view->query->limit;
  }
  $offset = property_exists($view->query, 'offset') ? $view->query->offset : 0;
  $result = [];
  $sort_fields = [];
  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'] = [];
    }
  }
  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" />';
    }
    if (isset($entry['thumbnailphoto'])) {
      $entry['thumbnailphoto'][0] = '<img src="data:image/jpeg;base64,' . base64_encode($entry['thumbnailphoto'][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.
              unset($entry[$alias]['count']);
              $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 the field with alias $alias has a corresponding entry in $sort_fields, copy its value into the data key of $sort_fields for later sorting.
        if (array_key_exists($alias, $sort_fields)) {
          $sort_fields[$alias]['data'][$key] = $entry[$alias];
        }
      }
    }
  }
  if (!empty($this->orderby) && !empty($entries)) {
    $params = [];

    // 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 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)) {

      // Remove the count variable.
      $countValue = $entries['count'];
      unset($entries['count']);
      $params[] =& $entries;
      call_user_func_array('array_multisort', $params);
      $params['count'] = $countValue;
    }
    else {
      $params[] =& $entries;
      call_user_func_array('array_multisort', $params);
    }
  }
  for ($i = 0; (!isset($limit) || $i < $limit) && $offset + $i < $num_entries; $i++) {
    $row = [];
    $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(TRUE) - $start;
  $view->query->pager->total_items = $num_entries;
  $view->query->pager
    ->update_page_info();
}