jqGrid: форматер: действия не работают для удаленного URL-адреса json

Я пытался использовать форматировщик jqGrid: «действия» для удаленного URL-адреса json, но он сдвигает строки, потому что количество имен столбцов и фактических возвращаемых данных не совпадают (столбец действия является дополнительным в именах столбцов). Я выполнял поиск в Интернете, и похоже, что все примеры относятся к локальным данным (на странице), где json используется как ключ/значение, а url:somepage.php возвращает столбцы в формате csv (без ключей, только значения) . Также я использую id как скрытое поле, в то время как все примеры показывают id. Я также использую еще один скрытый столбец. вот моя колмодель:

url: "manager_json",
                editurl: "manager_edit",
                datatype: "json",
                //data: mydata,
                width:1000,
                //jsonReader: {
                //                repeatitems : false,
                //           },
                colNames: ["","Id","Uid","Custom Id","Image Name","Coord. X","Coord. Y","Gender","Progress","Status","Created","Updated"], 
                colModel: [{"name":"act","template":"actions","formatoptions":{"editformbutton":true}},{"name":"id","align":"center","width":33,"editable":false,"hidden":true},{"name":"uid","align":"center","width":33,"editable":true,"hidden":true,"editrules":{"edithidden":false,"required":false}},{"name":"ta_id","align":"center","width":100,"editrules":{"required":true}},{"name":"image","width":150,"template":"text","editrules":{"required":true}},{"name":"x","width":100,"align":"center","template":"integer","editrules":{"required":true}},{"name":"y","width":100,"align":"center","template":"integer","editrules":{"required":true}},{"name":"gender","width":100,"align":"center","formatter":"select","stype":"select","editrules":{"required":true},"edittype":"select","editoptions":{"value":"f:Female;m:Male","defaultValue":"m"},"searchoptions":{"sopt":["eq","ne"],"value":":Any;f:Female;m:Male"}},{"name":"progress","width":120,"align":"center","formatter":"select","stype":"select","editrules":{"required":true},"editable":false,"edittype":"select","editoptions":{"value":"-:New;pf:Process Failed;ps:Process Scheduled;pss:Process Success;p:Processing...;s:Staging;tf:Test Failed;ts:Test Scheduled;tss:Test Success;t:Testing...","defaultValue":"m"},"searchoptions":{"sopt":["eq","ne"],"value":":Any;-:New;pf:Process Failed;ps:Process Scheduled;pss:Process Success;p:Processing...;s:Staging;tf:Test Failed;ts:Test Scheduled;tss:Test Success;t:Testing..."}},{"name":"status","width":100,"align":"center","formatter":"select","stype":"select","edittype":"select","editoptions":{"value":"a:Active;n:New","defaultValue":"m"},"searchoptions":{"sopt":["eq","ne"],"value":":Any;a:Active;n:New"}},{"name":"date_created","width":150,"template":"text","editable":false},{"name":"last_updated","width":150,"template":"text","editable":false}]

А вот мои фактические данные с моего сервера (db) в соответствии со спецификацией jqgrid:

{"page":1,"total":1,"records":7,"rows":[{"id":32,"cell":[32,"889daf31ff3e49544f52850258439600","2uu","2ok",2,2,"m","-","a","2017-02-10 18:57:05","2017-02-10 23:37:12"]},{"id":30,"cell":[30,"","11","11",1,1,"m","-","a","2017-02-10 18:01:52","2017-02-10 18:01:52"]},{"id":29,"cell":[29,"aaa","ww222111uu","11",1,1,"m","-","a","2017-02-10 18:00:36","2017-02-10 23:37:08"]},{"id":27,"cell":[27,"","11","1",1,1,"m","-","a","2017-02-10 17:57:41","2017-02-10 17:57:41"]},{"id":25,"cell":[25,"","4tt","4img",4,4,"f","-","n","2017-02-10 17:50:21","2017-02-11 00:26:03"]},{"id":24,"cell":[24,"","1","1",1,1,"m","-","a","2017-02-10 17:49:38","2017-02-10 17:49:38"]},{"id":22,"cell":[22,"","bbb","imam 222",2,22,"f","p","n","2017-02-08 20:14:55","2017-02-10 13:27:57"]}]}

Как видите, в строке ячеек меньше столбцов, чем в colNames и colModel. Также скрыты столбцы id и uid. Я добавил дополнительный поддельный столбец из БД, но это не помогло

я использую jqGrid 4.13.7-pre


person LSP    schedule 11.02.2017    source источник


Ответы (1)


Я бы рекомендовал вам возвращать такие объекты, как

{
    "id": 32,
    "uid": "889daf31ff3e49544f52850258439600",
    "ta_id": "2uu",
    "image": "2ok",
    "x": 2,
    "y": 2,
    "gender": "m",
    "progress": "-",
    "status": "a",
    "date_created": "2017-02-10 18:57:05",
    "last_updated": "2017-02-10 23:37:12"
}

вместо

{
    "id": 32,
    "cell": [
        32, "889daf31ff3e49544f52850258439600", "2uu", "2ok", 2, 2, "m", "-", "a",
        "2017-02-10 18:57:05", "2017-02-10 23:37:12"
    ]
}

как ответ сервера. Это упростит ваш код.

Если вам нужно обработать текущий формат данных, вам придется принудительно включить режим repeatitems: false, используя опцию

jsonReader: {
    repeatitems: false
}

и использовать свойство jsonmap для colModel, чтобы сообщить jqGrid, из какого элемента элемента следует читать данные столбца. jsonmap может быть либо в строковой форме, например

jsonmap: "cell.1"

или в виде функции:

jsonmap: function (item) {
    return item.cell[1];
}

Чтобы сделать код более удобным для сопровождения, вы можете определить такой объект, как

var columnOrder = {
        id: 0,
        uid: 1,
        ta_id: 2,
        image: 3,
        x: 4,
        y: 5,
        gender: 6,
        progress: 7,
        status: 8,
        date_created: 9,
        last_updated: 10
    };

который предоставляет индекс в массиве cell по имени столбца и использует jsonmap как

jsonmap: function (item) {
    return item.cell[columnOrder.uid];
}

Демо https://jsfiddle.net/OlegKi/ozzgnaeh/2/ демонстрирует подход .

person Oleg    schedule 11.02.2017
comment
Причина, по которой я собирался использовать формат массива (а не формат словаря), потому что я ожидал иметь около 5000 строк на странице и, следовательно, минимизировать время загрузки и размер. Предложенный формат данных помог. Работает сейчас. Спасибо Олег. - person LSP; 12.02.2017
comment
@LSP: Добро пожаловать! Вы должны принять ответ, если он решит вашу проблему. Я бы рекомендовал вам использовать размер страницы, соответствующий количеству строк, которые могут отображаться на мониторе, например, rowNum: 25 или rowNum: 20. Использование rowNum: 5000 делает страницу намного медленнее и не дает пользователю никаких преимуществ. Попробуйте демонстрацию с 60000 строк и 10 строк на странице. Это быстрее, чем 1000 строк со всеми 1000 строками на странице. - person Oleg; 12.02.2017
comment
Я не вижу кнопки с надписью принять этот ответ ... где это? - person LSP; 13.02.2017
comment
@LSP: слово «принять» (см. мой предыдущий комментарий) — это ссылка, по которой вы можете щелкнуть, чтобы увидеть, как вы можете принять ответ. - person Oleg; 13.02.2017
comment
Спасибо Олег (ненавижу эти серые невидимые цвета) .. готово :) - person LSP; 13.02.2017