Как сделать негативную фильтрацию в таблицах данных плагина jquery? - PullRequest
0 голосов
/ 01 марта 2012

Привет! Я использую плагин таблиц данных для jquery, и я хотел бы изменить свой сценарий на стороне сервера, чтобы разрешить отрицательный поиск ex. ! Foo. и это показало бы все, кроме фу. У меня есть код, который я написал, но он, кажется, не работает, и я не уверен, почему. я могу регулярно фильтровать, но когда я использую! foo, он просто возвращает все в таблице.

$sWhere = "";
if ( $_GET['sSearch'] != "" )
{
    $aWords = preg_split('/\s+/', $_GET['sSearch']);
    $sWhere = "WHERE (";

    for ( $j=0 ; $j<count($aWords) ; $j++ ) {
        if ( $aWords[$j] != "" ) {
            if(substr($aWords[$j], 0, 1) == "!") {
                    $notString = substr($aWords[$j], 1);
                    $sWhere .= "(";
                    for ( $i=0 ; $i<count($aColumns) ; $i++ ) {
                            $sWhere .= $aColumns[$i]." NOT LIKE '%".mysql_real_escape_string( $notString )."%' OR ";
                    }
            } else {
                $sWhere .= "(";
                for ( $i=0 ; $i<count($aColumns) ; $i++ ) {
                        $sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string( $aWords[$j] )."%' OR ";
                }
            }
            $sWhere = substr_replace( $sWhere, "", -3 );
            $sWhere .= ") AND ";
        }
    }
    $sWhere = substr_replace( $sWhere, "", -4 );
}

спасибо

Ответы [ 2 ]

0 голосов
/ 10 июня 2016

Весь этот код, который вы вставили, написан на PHP, поэтому он вообще не использует среду DataTables для поиска, и я собираюсь предположить, что у вас включена обработка на стороне сервера.

Для выполнения отрицательного фильтра на стороне сервера с использованием SQL NOT LIKE было бы хорошо, как вы пытались сделать, но весь ваш код положительного и отрицательного фильтров обрабатывается в одном цикле дайджеста.Я бы добавил еще $_GET, например $_GET['sSearch_type'], чтобы обрабатывать ваши негативные фильтры в совершенно отдельном цикле.До тех пор, пока вы можете воспроизводить запрос в PHP MyAdmin (или независимо от того, какой менеджер SQL вы используете), не будет никаких проблем при настройке запроса в отдельном цикле с использованием отдельного $_GET для управления типом поиска.

Для тех из вас, кто хочет на самом деле , используйте DataTables для фильтрации и нуждаются в выражении отрицательного фильтра: @Nate правильно использовать выражение regex, но реализация не являетсяt обсуждается.

Есть два API-способа, которыми я знаю, чтобы использовать регулярное выражение таким образом.fnFilter() или search()

fnFilter() устарели, вы все еще можете использовать его, но лучше использовать функцию search() API, которая была написана для замены fnFilter().

Документы:

ПРИМЕР:

// case insensitive filter a column for all
// values that don't match 'closed'
column.search( '^(?!closed).*$', true, false, true ).draw();

ПРИМЕР ОСУЩЕСТВЛЕНИЯ:

/**
 * This example creates a select box filter which 
 * appends to the thead cell of the 3rd column 
 * from the left (i.e. column at index 2). The values
 * of the select <option></option> are generated
 * automatically based on the column's real values
 * except for the 2 top most filters. The first is "All"
 * which passes and empty string to the regex filter, 
 * and the second top most filter is "All Open Projects"
 * which triggers the negative regex filter to remove 
 * all rows where the column value is set to "Closed" 
 * or "closed"
 */
$(document).ready(function() {
    $('#report-table').DataTable({
        initComplete: function () {
            this.api().columns().every( function () {
                var column_index = this[0][0],
                    column = this,
                    not_closed = 'not_closed',
                    select = $('<select id="status_col_filter" style="margin-left:10px;"><option value="">All</option><option value="'+ not_closed +'">All Open Projects</option></select>');

                if (column_index === 2) {
                    select
                        .appendTo( $(column.header()) )
                        .on( 'change', function () {
                            var val = $.fn.dataTable.util.escapeRegex( $(this).val() );
                            if (val === not_closed) {
                                // negative regex for all open status projects
                                column.search( '^(?!closed).*$', true, false, true ).draw();
                            } else {
                                // regular positive regex - filter by column value
                                column.search( val ? '^'+val+'$' : '', true, false ).draw();
                            }
                        });

                    column.data().unique().sort().each( function ( d, j ) {
                        select.append( '<option value="'+d+'">'+d+'</option>' )
                    });
                }
            });
        }
    });
});
0 голосов
/ 01 марта 2012

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

^((?!foo).)*$

Посмотрите на пример здесь и посмотрите, нужно ли вам это:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...