views:

832

answers:

1

Hi,

I'm using jqgrid to display a list of sites and I want to do some server side validation when a site is added or edited. (Form editing rather than inline. Validation needs to be server side for various reasons I won't go into.)

I thought the best way would be to check the data via an ajax request when the beforeSubmit event is triggered. However this only seems to work when I'm editing an existing row in the grid - the function isn't called when I add a new row.

Have I got my beforeSubmit in the wrong place?

Thanks for your help.

    $("#sites-grid").jqGrid({
        url:'/json/sites',
        datatype: "json",
        mtype: 'GET',         
        colNames:['Code', 'Name', 'Area', 'Cluster', 'Date Live', 'Status', 'Lat', 'Lng'],
        colModel :[ 
          {name:'code', index:'code', width:80, align:'left', editable:true}, 
          {name:'name', index:'name', width:250, align:'left', editrules:{required:true}, editable:true}, 
          {name:'area', index:'area', width:60, align:'left', editable:true}, 
          {name:'cluster_id', index:'cluster_id', width:80, align:'right', editrules:{required:true, integer:true}, editable:true, edittype:"select", editoptions:{value:"<?php echo $cluster_options; ?>"}}, 
          {name:'estimated_live_date', index:'estimated_live_date', width:120, align:'left', editable:true, editrules:{required:true}, edittype:"select", editoptions:{value:"<?php echo $this->month_options; ?>"}}, 
          {name:'status', index:'status', width:80, align:'left', editable:true, edittype:"select", editoptions:{value:"Live:Live;Plan:Plan;"}}, 
          {name:'lat', index:'lat', width:140, align:'right', editrules:{required:true}, editable:true}, 
          {name:'lng', index:'lng', width:140, align:'right', editrules:{required:true}, editable:true}, 
        ],
        height: '300',
        pager: '#pager-sites',
        rowNum:30,
        rowList:[10,30,90],
        sortname: 'cluster_id',
        sortorder: 'desc',
        viewrecords: true,
        multiselect: false,
        caption: 'Sites',
        editurl: '/json/sites'
     });

    $("#sites-grid").jqGrid('navGrid','#pager-sites',{edit:true,add:true,del:true, beforeSubmit : function(postdata, formid) { 
        $.ajax({
            url      : 'json/validate-site/', 
            data     : postdata,
            dataType : 'json',
            type     : 'post',
            success  : function(data) { 
                alert(data.message);
                return[data.result, data.message];
            }
        });
    }});
A: 

If you want to use beforeSubmit event, you should use it on the other place (see http://www.trirand.com/jqgridwiki/doku.php?id=wiki:navigator):

$("#sites-grid").jqGrid('navGrid','#pager-sites',{/**/},
    {beforeSubmit : function(postdata, formid) { /**/ }} // edit parameters
    );

I have the same opintion as Botondus (see comment), that you try to use beforeSubmit in a wrong way. Server which receive the edit data request (request to save modified data) must not save it. It can of cause validate the data and answer with HTTP error instead of 200 OK. To decode error response and prepare an error message use can use errorTextFormat event (see http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing#events).

Oleg
Thanks for the input guys - it does make more sense to do the validation / saving in the same operation. But I still have the same problem: the beforeSubmit and afterSubmit events only fire when editing an existing row. How can I validate when I add a new row? Is there some kind of "afterAdd" function? Can't seem to find it in the documentation.
Eoghan
If you want to use Server Side Validation, the data filled by user will be send to the server and the server can either save it and send back the Id of the new data row or send back HTTP error with the error description which you display to the user. If you want to make client side validation you can do it inside of `beforeSubmit` for Add in the same way as for Edit. The function `navGrid` has the full form `jQuery("#grid_id").jqGrid('navGrid','#gridpager',{parameters},prmEdit, prmAdd, prmDel, prmSearch, prmView);` where `prmAdd` have the same form as `prmEdit` which I described in my answer.
Oleg