2015-03-13 2 views
0

Extjs 5.0Удаленная фильтрация; нет возвращаемого значения

В сетке у меня есть табличка с текстовым полем, используемым для фильтрации сетки (удаленной).

Работает нормально.

Однако, если я делаю фильтрацию со словом, которое не существует в базе данных (например, «mywxtyz»), выдает ошибку: Ext.JSON.decode(): вы пытаетесь декодировать недействительную строку JSON , и вывод будет нулевым.

То, что я хотел, было тогда, когда поиск не возвратил никакой записи (не существует в базе данных), было отображено простое сообщение или текст в сетке emptyText или в окне.

как я могу это сделать?

Заранее спасибо.

Мой код:

onButtonFilter : function(button, newValue, oldValue, eOpts){ 
var me = this; 
var textfield = Ext.ComponentQuery.query('#filter')[0]; 
var grid = Ext.ComponentQuery.query('#griditemId')[0]; 
var store = grid.getStore(); 

if (form.isValid()) { 
    store.proxy.extraParams = { 
     action : 'filterGrid', 
     name : textfield.getValue() 
    }, 
    store.load(); 
    } 
} 

Пример моего PHP:

<?php 

include("conexion.php"); 

$action = $_REQUEST['action']; 

switch($action){ 

    case "create":{ 
    } 

    case "read":{ 

    $start = $_REQUEST['start']; 
    $limit = $_REQUEST['limit']; 

    $statement = $conexao->stmt_init(); 

    $sqlQuery = "SELECT name, email FROM contact LIMIT ?, ?"; 
    $sqlTotal = "SELECT COUNT(name) as num FROM contact"; 


    if(isset($_REQUEST['action']) AND $_REQUEST['action'] == 'filterGrid') { 

     $name = $_REQUEST['name']; 

     $sqlQuery = "SELECT name, email 
         FROM contact 
         WHERE name like '%$name%' 
         LIMIT ?, ?"; 

     $sqlTotal = "SELECT COUNT(name) as num 
         FROM contact 
         WHERE name LIKE '%$name%'"; 
    } 


    if ($statement = $conexao->prepare($sqlQuery)){ 
     $statement->bind_param("ii", $start, $limit); 
     $statement->execute(); 


     $statement->bind_result($col1, $col2); 

     while($statement->fetch()){ 
      $output[] = array($col1, $col2); 
     }; 


    if ($statement = $conexao->query($sqlTotal)){ 
     $row = $statement->fetch_row(); 
     $total = $row[0]; 
    } 

    $sucess = array("success" => mysqli_errno($conexao) == 0); 

    echo json_encode(array(
     "success" => $sucess, 
     "total" => $total, 
     "data" => $output 
    )); 

    $conexao->close(); 

    break; 
    } 

    case "update":{ 
    } 

    case "destroy":{ 
    } 
} 
?> 

Магазин:

Ext.define('APP.store.StoreList', { 
extend: 'Ext.data.Store', 

itemId:'mystore', 

model: 'SPP.model.ModelList', 

pageSize: 25, 
autoLoad:true, 
autoLoad: {start: 0, limit: 25}, 

autoSync: false, 

proxy: { 
    type: 'ajax', 

    actionMethods:{ 
      create:'POST', 
      read:'POST', 
      update:'POST', 
      destroy:'POST' 
    }, 


    api: { 
     create: 'php/crudActionList.php?action=create', 
     read: 'php/crudActionList.php?action=read', 
     update: 'php/crudActionList.php?action=update', 
     destroy: 'php/crudActionList.php?action=destroy' 
    }, 

    reader: { 
     type: 'json', 
     rootProperty: 'data', 
     totalProperty:'total', 
     successProperty: 'success' 
    }, 

    writer: { 
     type: 'json', 
     writeAllFields: true, 
     encode: true, 
     rootProperty: 'data' 
    } 
    }, 
}); 
+0

Thanks JasonMArcher – josei

ответ

1

Я думаю, что проблема здесь в том, что $ выход и $ всего переменных пусты, если совпадений не найдено. Возможно, если вы инициализируете его и установите его в пустой массив перед оператором while, это сделает трюк.

Таким образом, вместо

while($statement->fetch()){ 
     $output[] = array($col1, $col2); 
    }; 

должно быть

$output = []; 
    while($statement->fetch()){ 
     $output[] = array($col1, $col2); 
    }; 

То же самое с общей частью. Установите $ total на 0 раньше времени.

Так следующее

if ($statement = $conexao->query($sqlTotal)){ 
    $row = $statement->fetch_row(); 
    $total = $row[0]; 
} 

Должно быть

$total = 0; 
if ($statement = $conexao->query($sqlTotal)){ 
    $row = $statement->fetch_row(); 
    $total = $row[0]; 
} 

UPDATE: Для того, чтобы обеспечить сообщение пользователю, что не были возвращены никакие записи, вы хотите использовать опцию обратного вызова нагрузки функция. http://docs.sencha.com/extjs/5.1/5.1.0-apidocs/#!/api/Ext.data.Store-method-load

Так, что-то вроде следующего должно работать:

store.load({ 
scope: this, 
callback: function(records, operation, success) { 
    if(records.length === 0){ 
     Ext.Msg.alert("Nothing Found", "No records found"); 
    } 
} 

});

+0

Спасибо, ekbarber за вашу помощь. – josei

+0

Спасибо, ekbarber. Ваше предложение очень помогло. Теперь не отображается ошибка. Тем не менее, я хочу сообщить пользователю, что не было найдено никаких записей. есть идеи как это сделать? Еще раз спасибо. – josei

+0

@josei Уверенная вещь – ekbarber

Смежные вопросы