Как заставить работать поиск по панели инструментов jqGrid? - PullRequest
4 голосов
/ 09 мая 2011

В http://trirand.com/blog/jqgrid/jqgrid.html, в разделе «Новое в версии 3.7»> «Поиск по столбцу» есть метод, который объяснен для поиска, но он пока не работает для меня.Я добавил:

jQuery("#toolbar").jqGrid('filterToolbar',{stringResult: true,searchOnEnter : false});

и менее важный код из примера.Мой сервер видел немного разные запросы JSON, но без _search=true и без поискового запроса.

http://trirand.com/blog/jqgrid/jqgrid.html также дает неполный пример серверного кода.Оператор SQL приведен в примере PHP:

$SQL = "SELECT item_id, item, item_cd FROM items ".$where." ORDER BY $sidx $sord LIMIT $start , $limit";

, но, хотя $sidx, $sord, $start и $limit имеют код для их определения, $where не являетсяопределяется (или упоминается) где-либо еще на странице.

Как получить поиск по столбцу, например, документы страницы, где мой сервер поражен соответствующими запросами?

Ответы [ 4 ]

8 голосов
/ 10 мая 2011

Метод filterToolbar должен вызываться для того же элемента, который вы используете для определения сетки.Посмотрите на рабочий пример , которым он был использован.

Я не могу помочь вам с PHP-частью вашего вопроса, потому что я сам не использую PHP.Тем не менее, демонстрационные файлы из на странице загрузки jqGrid , похоже, содержат несколько примеров кода PHP, которые могут быть вам полезны.

3 голосов
/ 26 октября 2012

Спасибо предыдущему автору за отправную точку для решения проблемы. Вот готовый фрагмент кода server-side PHP, реализующий обработку поисковых запросов (из jqGrid):

$filters = $_POST['filters'];
$search = $_POST['_search'];

    $where = "";

if(($search==true) &&($filters != "")) {


        $filters = json_decode($filters);
        $where = " where ";
        $whereArray = array();
        $rules = $filters->rules;
        $groupOperation = $filters->groupOp;
        foreach($rules as $rule) {

            $fieldName = $rule->field;
            $fieldData = mysql_real_escape_string($rule->data);
            switch ($rule->op) {
           case "eq":
                $fieldOperation = " = '".$fieldData."'";
                break;
           case "ne":
                $fieldOperation = " != '".$fieldData."'";
                break;
           case "lt":
                $fieldOperation = " < '".$fieldData."'";
                break;
           case "gt":
                $fieldOperation = " > '".$fieldData."'";
                break;
           case "le":
                $fieldOperation = " <= '".$fieldData."'";
                break;
           case "ge":
                $fieldOperation = " >= '".$fieldData."'";
                break;
           case "nu":
                $fieldOperation = " = ''";
                break;
           case "nn":
                $fieldOperation = " != ''";
                break;
           case "in":
                $fieldOperation = " IN (".$fieldData.")";
                break;
           case "ni":
                $fieldOperation = " NOT IN '".$fieldData."'";
                break;
           case "bw":
                $fieldOperation = " LIKE '".$fieldData."%'";
                break;
           case "bn":
                $fieldOperation = " NOT LIKE '".$fieldData."%'";
                break;
           case "ew":
                $fieldOperation = " LIKE '%".$fieldData."'";
                break;
           case "en":
                $fieldOperation = " NOT LIKE '%".$fieldData."'";
                break;
           case "cn":
                $fieldOperation = " LIKE '%".$fieldData."%'";
                break;
           case "nc":
                $fieldOperation = " NOT LIKE '%".$fieldData."%'";
                break;
            default:
                $fieldOperation = "";
                break;
                }
            if($fieldOperation != "") $whereArray[] = $fieldName.$fieldOperation;
        }
        if (count($whereArray)>0) {
            $where .= join(" ".$groupOperation." ", $whereArray);
        } else {
            $where = "";
        }
    }


    // evaluating $sidx, $sord, $start, $limit 

    $SQL = "SELECT id, brandName, name, description FROM products".$where." ORDER BY $sidx $sord LIMIT $start , $limit"; 
    $result = mysql_query( $SQL ) or die("Couldn't execute query.".mysql_error()); 
2 голосов
/ 13 ноября 2011

Вы можете попробовать этот код для простейшего случая:

        $filters = $_GET['filters'];

        $where = "";
        if (isset($filters)) {
            $filters = json_decode($filters);
            $where = " where ";
            $whereArray = array();
            $rules = $filters->rules;

            foreach($rules as $rule) {
                $whereArray[] = $rule->field." like '%".$rule->data."%'";
            }
            if (count($whereArray)>0) {
                $where .= join(" and ", $whereArray);
            } else {
                $where = "";
            }
        }    

Перед использованием в производстве убедитесь, что вы обрабатываете случаи, когда $ _GET ['filters'] содержит мусор вместо json, и имена / значения полей должным образом экранированы. В противном случае есть много места для инъекций SLQ.

0 голосов
/ 23 февраля 2013

Спасибо за размещение вашего кода!

Единственным изменением было то, что мне пришлось убрать двойные кавычки в параметре 'filters', чтобы он заработал:

$ filters = str_replace ('\ "', '"', $ _ POST ['filters']);

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