function ldap_views_plugin_query_ldap::execute in Lightweight Directory Access Protocol (LDAP) 7
Same name and namespace in other branches
- 8.2 ldap_views/plugins/ldap_views_plugin_query_ldap.inc \ldap_views_plugin_query_ldap::execute()
- 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();
}