public function ldap_views_plugin_query_ldap::execute in Lightweight Directory Access Protocol (LDAP) 7.2
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 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
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();
}