DataTables Фильтрация отдельных столбцов на стороне сервера

Я надеялся, что кто-то может помочь мне с этим. Я сошел с ума от этого.

У меня есть ситуация, когда я загружаю сетку DataTables (кстати, отличная штука!), И все отлично. Потом иду искать и сталкиваюсь с проблемами. Данные, заполняемые в сетке, поступают из двух разных таблиц базы данных (это нормально), но когда кто-то выполняет поиск, у меня нет возможности узнать, куда идти и получать данные. Мне нужно знать, по каким критериям осуществляется поиск (например, по названию или контакту). Я вижу, что когда поиск вызывается с сервера через поле поиска по умолчанию, есть такие переменные, как «sSearch_0», которые все не установлены, как они устанавливаются?

Вот код инициализации таблицы:

oTable = $('#example').dataTable({
"bJQueryUI": true,
"bFilter": true,
"sPaginationType": "full_numbers",
"bPaginate " : true,
"bServerSide" : true,
"sAjaxSource" : "php/tabledata.php",
"aoColumnDefs": [
     { "bSortable": false, "aTargets": [ 0,6,8 ] },
 { "sClass": "tdCenter", "aTargets": [ 0,1,2,3,4,5,6,7,8 ] }
     ],
"fnServerData": function ( sSource, aoData, fnCallback ) {
aoData.push( { "name": "userid", "value": userid } );
$.getJSON( sSource, aoData, function (json) { 
fnCallback(json)
});
}           

});

Я рассмотрел варианты добавления данных в «fnServerData» и фактически использовал их для первого вызова сервера инициализации, но не уверен, как использовать это для последующего вызова сервера. Я пытался использовать «fnFilter», но я не вижу, чтобы выполнение вызова сервера для получения дополнительных данных. На данный момент я не вижу никакого другого способа выполнить вызов сервера, кроме окна поиска по умолчанию, и я вижу какой-то способ узнать, для какого столбца выполняется поиск.

Может ли кто-нибудь помочь мне здесь и указать мне правильное направление?


person ackerchez    schedule 20.12.2010    source источник
comment
Во-первых, позвольте мне поприветствовать вас в Stackoverflow! Во-вторых, я укажу вам на отличную статью о том, «как правильно задавать вопросы на SO. и, наконец, я спрошу, не могли бы вы опубликовать jQuery, который вы используете, и вызовы базы данных (будь то внешний php-скрипт или в самом jQuery). Надеюсь, мы сможем вам помочь... =)   -  person David says reinstate Monica    schedule 20.12.2010
comment
Используете ли вы все функции поиска или поиск по одному столбцу? Для поиска по всем вам придется написать код для поиска каждого из ваших столбцов в двух разных таблицах. Если это поиск по столбцу, вы можете сопоставить sSearch_x (x = обычно индекс столбца) в вашем индексе столбца.   -  person DarrellNorton    schedule 20.12.2010
comment
Я использовал весь функционал поиска, который идет из коробки. Я не знаю, как настроить поиск по одному столбцу, я бы хотел, чтобы это работало. Как это настроить?   -  person ackerchez    schedule 20.12.2010


Ответы (2)


Если вы получаете данные с сервера для плагина DataTables, вы должны установить для bServerSide значение true, установить для sAjaxSource соответствующий URL-адрес и в идеале настроить fnServerData, если вам нужно выполнять какие-либо обратные вызовы.

Если вы используете обработку на стороне сервера, вся сортировка, фильтрация и разбиение по страницам должны выполняться вами на сервере. Если вы правильно настроите DataTables, он будет запрашивать данные с сервера каждый раз, когда происходит пейджинг, фильтрация или сортировка.

документация по серверному API DataTables

пример PHP-обработки на стороне сервера

person DarrellNorton    schedule 20.12.2010

В интересах всех, кто отнесется к этому вопросу, вот что я реализовал.

Клиентская сторона (JavaScript)

Выполнение fnFilter после нажатия клавиши Enter.

$(tableId + " thead input").keypress( function () {
  if (event.which == 13) {
    event.preventDefault();
    oTable.fnFilter( this.value, $("thead input").index(this) );
  }
} );

Серверная сторона (Ruby)

Найдите хэш параметра sSearch_(int) и извлеките индекс столбца из ключа. Получите имена столбцов из массива и создайте строку поиска.

def column_search
  search_string = []
  params.keys.map {|x| x if params[x].present? and x.include? "sSearch_"}.compact.each do |search|
    index = search.split("_").last.to_i
    search_string << "#{columns[index]} ilike '%#{params[search]}%'"
  end
  search_string.join(' and ')
end
person Geordee Naliyath    schedule 21.02.2014