The parameter of serializeDelData callback contains id field only - jqgrid

I use jgGrid 4.5.4. When a user presses the Delete button, I need to send two pieces of information to the server: the record ID, and record version (for optimistic locking). I know that serializeDelData callback can be used for this purpose:
serializeDelData:serializeDelDataCallback
...
function serializeDelDataCallback(data) {
// The "data" argument has "id" and "oper" fields only! Where can I get other fields of the current grid row?
...
return $.param(modifiedData);
}
However, the argument of the serializeDelData callback contains id and oper fields only. I use a similar callback for posting new and updated records - that callback provides all fields of the current row.
Where can I get other fields of the current grid row in the serializeDelData callback? (I need to get the row version which is a hidden field in the grid.)

If you use optimistic locking then the rows of the grid contains probably record version column.
The most easy way to onclickSubmit callback (see the documentation) for example in the following form
onclickSubmit: function (options, rowid) {
return {
rowVer: $(this).jqGrid("getCell", rowid, "rowVersion")
};
}
In the above code I suppose that you have column with the name rowVersion which hold record version which you need to send as rowVer param. In general you can use getCell in the same way inside of serializeDelData, but onclickSubmit seems me more simple. The returned properties of onclickSubmit will be combined with the standard parameters used by Delete, so you should have all information which you need.

Related

How to check id which I used from a table that related with other multiple table?

When I want to delete a row from table I want to check the tables which use the id of this row. If used then it doesn't allow to delete.
You can simply check whether specific column(containing other table's key) in the row is empty or null and if it is empty then delete the row otherwise skip it.
You have two ways in which you can do it-
using eloquent get the row by primary key and check the property on collection.
write a stored procedure in the database and call it in your Laravel code.
You can use the deleting model event to check if the relationships exist. If they do, then prevent the delete.
https://laravel.com/docs/5.7/eloquent#events
If you create an observer for your model, you can use something like this:
public function deleting($model)
{
if($model->someRelation->count()) { // replace ->someRelation with whatever you want to check
return false; // prevent delete
}
if($model->anotherRelation->count()) {
return false; // prevent delete
}
}

Codeigniter check unique value when editing form without using callback function

Codeigniter check unique value while editing form.
When edit the form it checks for current row, and it give username already exist. so how to avoid it.and don't check for current record.
So how can i pass id to is_unique function in CI_Form_Validation class function and add condition?
See my below code:
$this->custom_validation->set_rules('username','Username',
'trim|required|max_length[30]|is_unique[adminuser.username]');
Simply put a unique validation only if value of that field is changed ie.
$old_value='old value';
if ($posted_value!=$old_value) {
$this->custom_validation->set_rules('username','Username',
'trim|required|max_length[30]|is_unique[adminuser.username]');
} else {
$this->custom_validation->set_rules('username','Username',
'trim|required|max_length[30]);
}

Kendo datasource model - difference between _data[0] and get(0)

I would like to know the difference between
$("#uploadedFile").val(e.files[0].name);
var model = $("#blueprint_listview").data("kendoListView").dataSource.get(0);
model.set("filename", $("#uploadedFile").val());
And
$("#uploadedFile").val(e.files[0].name);
var model = $("#blueprint_listview").data("kendoListView").dataSource._data[0];
model.set("filename", $("#uploadedFile").val());
I am having an editable listview with a upload.
And the above code is written on the success event on the kendo upload.
The second code works fine for insert and update.
However, the first code works fine for insert, but for update it is showing an error which says - "The model is not defined"
I was wondering what could be the reason?
As stated in the documentation, get retrieves a record with the corresponding id. This way, when a new record is inserted it seems that it has the default id of 0, that's why get(0) === _data[0] but when you are updating the listview, a "real" id (>=1) is given to your new line and there is no longer an item with id=0, so model is then null.
On the other side, the internal method _data is an array with all the lines of your list view put in the order of their position in the listview. But if you want to access to this property, the equivalent "public" method is at :
$("#blueprint_listview").data("kendoListView").dataSource._data[0] ===
$("#blueprint_listview").data("kendoListView").dataSource.at(0); // allways true

jqGrid saving a row with nullable columns

So I have a jqGrid on an ASP.NET MVC 3 website. It's loading the data, searching, filtering, and saving rows with the built in pop-up editor. What I can't get to work is saving a nullable property. I'm using LargeJsonResult instead of the built in JsonResult, so an example of a row in the grid is this:
// C# class
public class Row
{
public string A { get; set; }
public string B { get; set; }
public int C { get; set; }
}
// an example object instance, let's say these values come from the DB
var ret = new Row { A = "a", B = null, C = 5 };
// the JSON string sent to the grid will look like this (notice B is omitted)
// "{ A: 'a', C: 5 }"
Now, the grid will show this as:
A B C
a undefined 5
And this brings me to my problem. The pop-up edit form will show "undefined" in the textbox for B, and will also post this to the server. So if I save that to the database, I'll have "undefined" in my DB instead of null.
How do I get jqGrid to preserve the null value round trip? One solution that seems to me very hacky is based on something Oleg solved in another thread:
// override jqGrid serialization
jQuery.extend(jQuery.jgrid.edit, { ajaxEditOptions: { contentType: "application/json" }, serializeEditData: function (data) {
return JSON.stringify(data).replace(/"undefined"/g, 'null');
}});
This will work, but seems dangerous because it's doing mass edits of data without the user's knowledge. In thinking more about it, I guess this is the fundamental problem of saving back null instead of "undefined" or some other string representation of null (empty string, etc.). The desired behavior would be:
if the property is null, and the user doesn't change the value, it posts as null
if the user changes the value, the property is no longer null
Can we get the grid's edit form to behave like this for nullable properties? Or would I have to create a custom edit form that tracks what the user does with a property?
I hope that I understand your problem. In one my applications where I used jqGrid I had once the problem with NULL values. At the time of development of the application I was not sure how to solve the problem and I placed on the server side the text value "(NULL)" instead of null value of one property. The grid was for advanced users who understand what "(NULL)" is. The value "(NULL)" has no sense in the field (one had no user account with the name) and inside of server code for the Edit operation I could distinguish "(NULL)" value from the real field value. In the way I could come over the problem.
In your case you should solve at least two problems:
You should decide how the null value should be displayed. The "undefined" text seems me not the best one. You can solve the problem with the "undefined" text either on the server side (like I did in my case) or with respect of custom formatter. The custom formatter is very simple thing. It define how a cell value should be displayed as a HTML fragment of the <td> contain. You can for example include an additional hidden <span> element or other HTML element or attribute which will save the information that the value was null.
You should solve the problem with decoding of the null value on the server side during Edit operations. You can solve the problem very easy on the server side (like I do with compare of the corresponding field to the "(NULL)") or with respect of custom unformatter on the client side. The custom unformatter will get the information from the grid cell (from the hidden <span> or other hidden HTML element or attribute) and place the information in the server request.
You can look at the demo for the answer to see an example how one can use a hidden <span> to save an additional information in the cell with respect of custom formatter and to read the information later with respect of custom unformatter.

ADO.NET DataRow - check for column existence

How do I check for the existence of a column in a datarow?
I'm building datatables to organize some data that I've already pulled back from the database. Depending on the type of data in each row, I need to create a datatable with different columns. Then, later on, I want to check and see if the datatable I am looking at has a certain column.
I know I can catch the exception and handle it that way, but I'm curious if there is a property or method on the datarow object that will do this for me?
Here's how I can do it by catching the exception:
public static String CheckEmptyDataRowItem(DataRow row, String rowName, String nullValue)
{
try
{
return row[rowName].ToString();
}
catch (System.ArgumentException)
{
return nullValue;
}
}
You can simply check like this:
return row.Table.Columns.Contains(columnName);
DataTables have that schema info, so check if the Row's Table's Columns collection contains the field.

Resources