jqgrid saveRow не делает вызов ajax - PullRequest
2 голосов
/ 30 мая 2011

добираюсь туда с помощью jqgrid, хотя я все еще не могу сохранить данные строк на сервере

мое мини-приложение создает кнопки для каждой строки, что вызывает геокод googlemaps.геокод заполняет форму на моей странице возвращенными данными.

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

РЕДАКТИРОВАТЬ --------------

Я изменил свой код, чтобы попытаться получить ответ от saveRow IНе вижу, что ЛЮБЫЕ ВЫЗОВЫ AJAX ПРОИЗВОДЯТСЯ в firebug, если я предупреждаю saveRow, что он возвращает false, я попытался поместить функцию error, чтобы перехватить ошибку, но это, похоже, не вызывается.Олег предположил, что в базе данных есть несколько идентификаторов, но это невозможно, так как это первичный ключ autonumber.я не вижу запроса к моему server.php обновить запись, вызываемую.

$('body').delegate('#displayaddr_btn', 'click', function(){
    myID = $(this).attr('rel');
    myLat = $('#lat').val();
    myLng = $('#lng').val();
    myAddress = $('#displayaddr').val();    
    alert('ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);
    jQuery("#rowed2").jqGrid('setRowData',myID,{ lat_mdt:myLat, lng_mdt:myLng, displayaddr_mdt:myAddress }); 

alert (jQuery ("# ​​rowed2"). jqGrid ('saveRow', myID) jQuery ("# ​​rowed2") .jqGrid ('saveRow', myID, {errorfunc: function (id, error) {alert ('произошла ошибка в saveRow () - ID:' + id + 'Error:' + error);}});})

кажется, что ничего не происходит, оповещение выводит всю информацию, которая должна, но я не вижу обращения к странице обработки для обновления записи.

----------- Обновление в ответ на Олега -------------------------------

Привет, Олег, спасибо, что принялвремя, действительно, произошла ошибка в моем php-файле для обновления записи, теперь это исправлено, вывод Количество ключей: 4 соответствует числу значений: 4my update = UPDATE mapdata_mdt SET idetp_mdt = 0, geoaddr_mdt = 'n11hl', active_mdt = 0, flag_mdt = 0 ГДЕ id_mdt = 1343 - это код, который я поместил на страницу php, и мой ожидаемый результат.

на самом деле функции редактирования в сетке работают должным образом: моя проблема в том, чтокогда я пытаюсь бежать saveRow() от кнопки, внешней по отношению к jqrid.кнопки (3 из них) генерируются под сеткой, когда нажата кнопка «гео» для строки сетки)

Это то место, где у меня возникают проблемы при нажатии кнопки saveRow() возвращает false,из того, что я вижу, вызов server.php даже не сделан, поэтому я не могу отладить любой ответ.

(я раньше не использовал WFC, веб-сервисы ASMX ASP.NET MVC и не хочу усложнятьвещи на данный момент !!)

что не хватает? Test URL (геокодировать первую запись с именем TEST в списке, чтобы заполнить форму, затем нажмите одну из кнопок сохранения для соответствующего текстового поля)

вот весь мой код:

function setAddrButtons(myID, mylat, mylng){
        alert(' setaddrButtons----ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);

        $('#displayaddr_btn').attr('rel', myID);
        $('#revlook_btn').attr('rel', myID);
        $('#altaddr_btn').attr('rel', myID);
        $('#lat').val(mylat);
        $('#lng').val(mylng);   
    }
    //jquery grid stuff
   $('body').delegate('#displayaddr_btn', 'click', function(){
        myID = $(this).attr('rel');
        myLat = $('#lat').val();
        myLng = $('#lng').val();
        myAddress = $('#displayaddr').val();    
        alert('ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);
        alert(jQuery("#rowed2").jqGrid('saveRow',myID)
    jQuery("#rowed2").jqGrid('saveRow',myID,
        {errorfunc:function(id, error){
            alert('there was an error in saveRow()- ID:'+id+' Error: '+error);
        }
    });

    })
    $('body').delegate('#revlook_btn', 'click', function(){
        myID = $(this).attr('rel');
        myLat = $('#lat').val();
        myLng = $('#lng').val();
        myAddress = $('#revlook').val();

        alert('ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);

        jQuery("#rowed2").jqGrid('setRowData',myID,{ lat_mdt:myLat, lng_mdt:myLng, displayaddr_mdt:myAddress });
        alert(jQuery("#rowed2").jqGrid('saveRow',myID)
    jQuery("#rowed2").jqGrid('saveRow',myID,
        {errorfunc:function(id, error){
            alert('there was an error in saveRow()- ID:'+id+' Error: '+error);
        }
    });

    })
    $('body').delegate('#altaddr_btn', 'click', function(){
        myID = $(this).attr('rel');
        myLat = $('#lat').val();
        myLng = $('#lng').val();
        myAddress = $('#altaddr').val();
        alert('ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);

        alert(jQuery("#rowed2").jqGrid('saveRow',myID)
    jQuery("#rowed2").jqGrid('saveRow',myID,
        {errorfunc:function(id, error){
            alert('there was an error in saveRow()- ID:'+id+' Error: '+error);
        }
    }); 

    })

    myGrid = jQuery("#rowed2").jqGrid({ 
        url:'data/stokistdata_s_json.php?q=3', 
        datatype: "json",
        mtype: "POST", 
        rowNum:10, 
        rowList:[50,100,150,200,300,400,500,600], 
        pager: '#prowed2', 
        sortname: 'name_mdt', 
        viewrecords: true, 
        gridview:true,
        sortorder: "asc", 
        rowNum:50, 
        scroll: true, 
        editurl: "data/server.php", 
        caption:"Stockist's and Orchid days",
        colNames:[
            'Actions',
            'id',
            'Type', 
            'Name', 
            'Geo Address',
            'Display Address',
            'Telephone',
            'Email', 
            'website', 
            'lat', 
            'lng', 
            'flag', 
            'description', 
            'active'
        ], 
        colModel:[{
            name:'Actions',
            index:'Actions',
            width:100,
            sortable:false,
            search:false
        }, {
            name:'id_mdt',
            index:'id_mdt',
            width:15,
            align:"left",
            sortable:true,
            search:false,
            hidden: true, 
            editable: true, 
            editrules: { edithidden: true }, 
            editoptions:{readonly:true},
            hidedlg: true,
            key: true
        }, {
            name:'id_etp',
            index:'id_etp', 
            width:90, 
            align:"left",
            sortable:true,
            editable:true,
            edittype:"select",
            formatter:'select',
            editoptions:{value:{1:'Stokist',0:'Orchid Day'}},
            editrules:{required:true},
            search:true,
            stype:'select',
            sopt: ['eq'],
            searchoptions:{value:{'':'All',1:'Stockist',2:'Orchid Day'}}
        },{
            name:'Name_mdt',
            index:'Name_mdt',
            align:"left", 
            width:150,
            editable:true,
            editrules:{required:true},
            search:true,
            stype:'text',
            sopt:['cn']
        }, {
            name:'geoaddr_mdt',
            index:'geoaddr_mdt',
            width:150, 
            align:"left",
            editable:true,
            search:false,
            edittype:"textarea", 
            editoptions:{rows:"3",cols:"30"}
        }, {
            name:'displayaddr_mdt',
            index:'displayaddr_mdt', 
            width:150, 
            align:"left",
            editable:true,
            search:false,
            edittype:"textarea", 
            editoptions:{rows:"3",cols:"30"}
        }, {
            name:'telephone_mdt',
            index:'telephone_mdt', 
            width:80,
            align:"left",
            editable:true,
            search:false
        }, {
            name:'email_mdt',
            index:'email_mdt', 
            editrules:{email:true, required:false},
            width:80, 
            align:"left",
            sortable:false,
            editable:true,
            search:false
        }, {
            name:'website_mdt',
            index:'website_mdt', 
            editrules:{url:true, required:false},
            width:80, 
            align:"left",
            sortable:false,
            editable:true,
            search:false
        }, {
            name:'lat_mdt',
            index:'lat_mdt', 
            width:40, 
            align:"left",
            sortable:false,
            editable:true,
            search:false
        } , {
            name:'lng_mdt',
            index:'lng_mdt', 
            width:40, 
            align:"left",
            sortable:false,
            editable:true,
            search:false
        }, {
            name:'flag_mdt',
            index:'flag_mdt', 
            width:20, 
            align:"left",
            sortable:true,
            editable:true,
            edittype:"select",
            editoptions: {value:{1:'Flagged',0:'No Flag'}},
            search:true,//
            stype:'select',
            searchoptions:{value:{'':'All',1:'Flagged',0:'No Flag'}}//{value:":Both;1:Flagged;0:No Flag"}
        }, {
            name:'description_mdt',
            index:'description_mdt', 
            width:150, 
            align:"left",
            sortable:false,
            editable:true,
            search:false,
            edittype:"textarea", 
            editoptions:{rows:"3",cols:"30"}
        }, {
            name:'active_mdt',
            index:'active_mdt', 
            width:20, 
            align:"left",
            sortable:true,
            editable:true,
            edittype:"select",
            editoptions: {value:{1:'Active',0:'Hidden'}},
            search:true,//
            stype:'select',
            searchoptions:{value:{'':'All','1':'Active','0':'Hidden'}} //{value:":Both;1:Active;0:Hidden"}
        }], search : {
             caption: "Search...",
             Find: "Find",
             Reset: "Reset",
             matchText: " match",
             rulesText: " rules"
       },

        gridComplete: function(){ 
            var ids = jQuery("#rowed2").jqGrid('getDataIDs'); 
            for(var i=0;i < ids.length;i++){ 
                var cl = ids[i]; 
                be = "<input style='height:22px;width:20px;' type='button' value='E' alt='Edit Location' onclick=\"jQuery('#rowed2').editGridRow('"+cl+"');\" />"; 
                se = "<input style='height:22px;width:20px;' type='button' value='S' onclick=\"jQuery('#rowed2').saveRow('"+cl+"');\" />"; 
                ce = "<input style='height:22px;width:20px;' type='button' value='C' onclick=\"jQuery('#rowed2').restoreRow('"+cl+"');\" />";
                fl = "<input style='height:22px;width:50px;' type='button' value='Find' alt='Find Location' class='findMe' rel='"+cl+"' />";
                gc = "<input style='height:22px;width:50px;' type='button' value='Geo' class='geocodeMe' rel='"+cl+"' />";
                jQuery("#rowed2").jqGrid('setRowData',ids[i],{Actions:fl+gc}); 
            } 
        }
    }); 

    jQuery("#rowed2").jqGrid('navGrid',"#prowed2",
        {edit:true,add:true,del:true,search:true,refresh:true},
        {closeOnEscape:true, recreateForm: true, width:500},
        {closeOnEscape:true, recreateForm: true, width:500}    // Add options

    ); 
    myGrid.jqGrid('filterToolbar',{defaultSearch:'cn',stringResult:true});

1 Ответ

1 голос
/ 30 мая 2011

Я попробовал ваш тестовый URL и проследил относительно Fiddler результаты редактирования первой строки.

Если я отредактирую первую строку вашей сетки и введу текст «test» в поле «Name», я смогу увидеть, что jqGrid отправляет на сервер HTTP-запрос POST, содержащий данные

id_mdt=1343&id_etp=0&Name_mdt=test&geoaddr_mdt=n11hl&displayaddr_mdt=&telephone_mdt=&email_mdt=&website_mdt=&lat_mdt=&lng_mdt=&flag_mdt=0&description_mdt=&active_mdt=0&oper=edit&id=1343

Данные содержат содержимое всех редактируемых файловых полей и два дополнительных параметра oper=edit и id=1343 (аналогично id_mdt=1343). Ваш сервер должен просто внести изменения и ответить любым успешным кодом HTTP в случае успеха и кодом ошибки HTTP в случае неудачного обновления данных. Ответ вашего сервера имеет заголовок, который начинается с

HTTP/1.1 200 OK
Content-Type: text/html

и в теле, имеющем

Number of keys: 4 matches number of values: 4my update = UPDATE mapdata_mdt SET idetp_mdt = 0,geoaddr_mdt = 'n11hl',active_mdt = 0,flag_mdt = 0 WHERE id_mdt = 1343<br />
<b>Notice</b>:  Undefined variable: growthConn in <b>E:\Domains\f\focus-on-plants.com\user\htdocs\admin\stokists\data\server.php</b> on line <b>137</b><br />
<br />
<b>Warning</b>:  mysql_query(): supplied argument is not a valid MySQL-Link resource in <b>E:\Domains\f\focus-on-plants.com\user\htdocs\admin\stokists\data\server.php</b> on line <b>137</b><br />

Итак, можно увидеть много проблем:

  1. Текст «Количество ключей: 4 совпадения» в ответе можно интерпретировать так, как будто id_mdt не является первичным ключом в соответствующей таблице базы данных, поскольку существует более одного элемента данных, имеющего id_mdt. Вы должны проверить дизайн вашей базы данных.
  2. Странные сообщения об ошибках показывают, что обновление не удалось. Вы должны проверить строку 137 E:\Domains\f\focus-on-plants.com\user\htdocs\admin\stokists\data\server.php кода сервера.
  3. Вы должны изменить свой код так, чтобы в случае ошибки ошибка HTTP-код был помещен в ответ сервера.

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

Еще одно замечание. Из заголовков сервера видно, что вы используете Microsoft IIS 7.0 в качестве веб-сервера. Почему вы не используете веб-сервисы WFC, ASMX ASP.NET MVC вашего сайта? В любом случае я должен включить сжатие как динамического, так и статического содержимого на веб-сервере. Это улучшит производительность сайта. Кроме того, вы должны изменить код, который вы используете в gridComplete, чтобы улучшить производительность. Есть много альтернатив. Взгляните здесь . Например, здесь и здесь (в последнем ответе важна часть производительности и привязки событий; пользовательский форматер можно заменить ссылками на кнопки).

ОБНОВЛЕНО : Мне кажется, что ваша следующая проблема заключается в том, что вы пытаетесь использовать saveRow просто для публикации информации о строке на сервере. saveRow публикует информацию о строке, которая находится в режиме встроенного редактирования, поэтому после вызова editRow . Вместе с другими вещами editRow добавляет атрибут editable="1" в строку (к элементу <tr>) с кодом, подобным:

$("#"+rowid).attr("editable","1");

Близко к началу теста saveRow , в котором строка, которую вы пытаетесь сохранить, имеет атрибут. Это не возвращение и ничего не делать.

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