View source
<?php
function slickgrid_get_data($view_name, $offset, $rows, $sortcol = FALSE, $sortdir = 'asc') {
drupal_add_http_header('Cache-Control', 'private, no-cache, no-store, must-revalidate, max-age=0');
$view = views_get_view($view_name);
if ($sortcol) {
$sort = array(
'id' => $sortcol,
'table' => 'node',
'field' => $sortcol,
'relationship' => 'none',
'group_type' => 'group',
'ui_name' => '',
'order' => strtoupper($sortdir),
'exposed' => FALSE,
);
$key = $sortcol;
switch ($sortcol) {
case 'title':
break;
case 'filename':
$sort = array(
'id' => $sortcol,
'table' => 'file_managed',
'field' => $sortcol,
'order' => strtoupper($sortdir),
);
break;
default:
$field = field_info_field($sortcol);
if ($field) {
switch ($field['type']) {
case 'taxonomy_term_reference':
foreach ($sort['id'] = $field['storage']['details']['sql'][FIELD_LOAD_CURRENT] as $table => $more_info) {
foreach ($more_info as $key => $name) {
if ($key != 'format') {
$view->display['default']->display_options['relationships'][$name]['id'] = $name;
$view->display['default']->display_options['relationships'][$name]['table'] = $table;
$view->display['default']->display_options['relationships'][$name]['field'] = $name;
$sort['id'] = 'name';
$sort['field'] = 'name';
$sort['table'] = 'taxonomy_term_data';
$sort['relationship'] = $name;
break;
}
}
}
break;
default:
foreach ($sort['id'] = $field['storage']['details']['sql'][FIELD_LOAD_CURRENT] as $table => $more_info) {
foreach ($more_info as $key => $name) {
if ($key != 'format') {
$sort['id'] = $name;
$sort['field'] = $name;
$sort['table'] = $table;
break;
}
}
}
}
}
}
array_unshift($view->display['default']->display_options['sorts'], $sort);
}
$potential_filters = $_GET;
unset($potential_filters['q']);
foreach ($potential_filters as $field => $value) {
if (($value = trim($value)) != FALSE) {
$operator = 'contains';
$op_val = $value;
if (Database::getConnection()
->databaseType() == 'mysql') {
if (_is_regex($value)) {
$value = substr($value, 1, -1);
$op_val = $value;
$operator = 'regular_expression';
}
}
$filter = array(
'id' => $field,
'table' => 'node',
'field' => $field,
'relationship' => 'none',
'group_type' => 'group',
'ui_name' => '',
'operator' => $operator,
'value' => $op_val,
'group' => 1,
'exposed' => FALSE,
'expose' => array(),
'is_grouped' => FALSE,
'group_info' => array(),
);
switch ($field) {
case 'filename':
$filter['table'] = 'file_managed';
break;
default:
$real_field = field_info_field($field);
if ($real_field) {
foreach ($real_field['storage']['details']['sql'][FIELD_LOAD_CURRENT] as $table => $more_info) {
foreach ($more_info as $key => $name) {
if ($key != 'format') {
$field = $name;
$filter['id'] = $name;
$filter['field'] = $name;
$filter['table'] = $table;
break;
}
}
}
switch ($real_field['type']) {
case 'user_reference':
if ($operator == 'regular_expression' && $op_val != '') {
$val = $op_val;
$op = 'RLIKE';
}
else {
$val = '%' . db_like($value) . '%';
$op = 'LIKE';
}
$filter['value'] = drupal_map_assoc(db_select('users', 'u')
->condition('name', $val, $op)
->fields('u', array(
'uid',
))
->execute()
->fetchCol());
if (empty($filter['value'])) {
$filter['value'] = $val;
}
unset($filter['operator']);
break;
case 'node_reference':
if ($operator == 'regular_expression' && $op_val != '') {
$val = $op_val;
$op = 'RLIKE';
}
else {
$val = db_like($value) . '%';
$op = 'LIKE';
}
$filter['value'] = drupal_map_assoc(db_select('node', 'n')
->condition('title', $val, $op)
->fields('n', array(
'nid',
))
->execute()
->fetchCol());
if (empty($filter['value'])) {
$filter['value'] = $val;
}
unset($filter['operator']);
break;
case 'taxonomy_term_reference':
if ($operator == 'regular_expression' && $op_val != '') {
$t_val = array_keys(taxonomy_get_terms_by_name_match_regex($op_val));
}
else {
$t_val = array_keys(taxonomy_get_terms_by_name_match($value));
}
foreach ($real_field['storage']['details']['sql'][FIELD_LOAD_CURRENT] as $table => $more_info) {
foreach ($more_info as $key => $name) {
if ($key != 'format') {
$filter['operator'] = 'or';
$filter['value'] = $t_val;
$filter['reduce_duplicates'] = 0;
$filter['type'] = 'textfield';
$filter['limit'] = 100;
$filter['vocabulary'] = 'cod';
$filter['hierarchy'] = 0;
break;
}
}
}
break;
case 'list_text':
$filter['operator'] = 'or';
$filter['value'] = array(
$filter['value'] => $filter['value'],
);
break;
case 'number_integer':
$filter['operator'] = '=';
$filter['value'] = array(
'min' => '',
'max' => '',
'value' => $filter['value'],
);
break;
}
}
}
$view->display['default']->display_options['filters'][$field] = $filter;
}
}
$referer = drupal_parse_url($_SERVER['HTTP_REFERER']);
if (strpos($referer['path'], '://')) {
$path = parse_url($referer['path']);
$path = substr($path['path'], 1);
}
else {
$path = $referer['path'];
}
$path = explode('/', $path);
$argumnets = array();
foreach ($view->display['default']->display_options['arguments'] as $argument) {
switch ($argument['default_argument_type']) {
case 'taxonomy_tid':
if ($argument['default_argument_options']['term_page']) {
$arguments[] = $path[2];
}
}
}
drupal_alter('slickgrid_view_arguments', $arguments, $view);
$view
->set_arguments($arguments);
$view
->render();
drupal_add_http_header('Content-Type', 'application/json; charset=utf-8');
if (!$view->data) {
$view->data = array();
}
echo drupal_json_encode(array(
'data' => $view->data,
));
ajax_footer();
}
function _is_regex($str) {
$first_char = substr($str, 0, 1);
$last_char = substr($str, -1);
if (strlen($str) < 3 || $first_char != $last_char || ctype_alnum($first_char) || $first_char == " " || $first_char == "\\") {
return false;
}
$str = substr($str, 1, -1);
if (strpos($str, '[') !== false && strpos($str, ']') !== false) {
return true;
}
elseif (strpos($str, '*') !== false) {
return true;
}
elseif (strpos($str, '?') !== false) {
return true;
}
elseif (strpos($str, '$') !== false) {
return true;
}
elseif (strpos($str, '^') !== false) {
return true;
}
else {
return false;
}
}
function taxonomy_get_terms_by_name_match($name, $vocabulary = NULL, $match = 'both') {
switch ($match) {
case 'both':
$name = '%' . db_like(trim($name)) . '%';
break;
default:
$name = db_like(trim($name)) . '%';
}
$query = db_select('taxonomy_term_data', 't')
->fields('t', array(
'tid',
))
->condition('name', $name, 'LIKE');
if (isset($vocabulary)) {
$vocabulary = taxonomy_vocabulary_machine_name_load($vocabulary);
$query
->condition('vid', $vocabulary->vid);
}
$tids = $query
->execute()
->fetchCol();
if (count($tids)) {
return taxonomy_term_load_multiple($tids);
}
else {
return array(
PHP_INT_MAX => PHP_INT_MAX,
);
}
}
function taxonomy_get_terms_by_name_match_regex($name) {
$name = db_like(trim($name));
$query = db_select('taxonomy_term_data', 't')
->fields('t', array(
'tid',
))
->condition('name', $name, 'RLIKE');
if (isset($vocabulary)) {
$vocabulary = taxonomy_vocabulary_machine_name_load($vocabulary);
$query
->condition('vid', $vocabulary->vid);
}
$tids = $query
->execute()
->fetchCol();
if (count($tids)) {
return taxonomy_term_load_multiple($tids);
}
else {
return array(
PHP_INT_MAX => PHP_INT_MAX,
);
}
}