После того, как вы рассматривали этот форум как-то для решения этих проблем и без успеха, я надеюсь, что кто-то может потратить немного времени, чтобы заставить меня понять, что происходит и как его решить.jqGrid проблемы с прикомандированными списками выбора в редакторе формы
Вот снимок проблемы:
и ответ JSON с сервера:
{"page":"1","total":1017,"records":"20335","rows":[{"id":"10390","cell":["10390",
" MM23398A","***.REVISION NE PAS UTILISER","ECHANGEUR","Echangeurs complets
\u00e0 plaques","","","","","","0","1"]},{"id":"1","cell":["1","\"304010","Joint
arm\u00e9 NE PAS UTILISER voir Z304010","VANNE","Pi\u00e8ces d\u00e9tach\u00e9es
de vannes","","","","54.00","","0","4"]},{"id":"13583","cell":["13583","#POMPES"
,"Article g\u00e9n\u00e9rique pompes.","POMPE","Pompes centrifuges compl\u00e8tes
PANTHER","","","","","","0","3"]},{"id":"3","cell":["3","#POMPES\/10944\/0001",
"","ECHANGEUR","Echangeurs complets \u00e0 plaques","","","","","","0","1"]},
{"id":"4","cell":["4","#POMPES\/10944\/0002","","ECHANGEUR","Echangeurs complets
\u00e0 plaques","","","","","","0","1"]},{"id":"5","cell":["5","#POMPES\/10971
\/0003","Article g\u00e9n\u00e9rique pompes","POMPE","Pompes centrifuges compl
\u00e8tes PANTHER","","","","","","0","3"]}
(последняя ячейка является выше выбранной строки)
As вы можете видеть, информация в выбранной строке и форме редактирования («S/famille») не похожи! Это потому, что второй список не заполняется хорошими элементами, в зависимости от первого списка.
Как я могу инициализировать этот список хорошими товарами? Я пробовал несколько способов без успеха, согласно некоторым сообщениям на форуме.
ОБНОВЛЕНО 2013-04-05
Прежде всего, colModels этих списков:
{name:'fam',index:'f.code', width:80,
formoptions:{
elmprefix:"<span style='visibility:hidden;'> (<span style='color:red;'>*</span>) </span>"
},
editable:true,
edittype:'select',
editoptions:{
dataUrl:'selfam.php',
dataEvents: [
{
type: 'change',
fn: function(e) {
$.ajax({
url:'selsfm.php?id='+$(e.target).val(),
async:false,
mType:'GET',
success:function(data){
$("#tr_sfm select.FormElement").html(data);
}
});
}
}
]
}
},
{name:'sfm',index:'s.code', width:80,
formoptions:{
elmprefix:"<span style='visibility:hidden;'> (<span style='color:red;'>*</span>) </span>"
},
editable:true,
edittype:'select',
cellattr: function (rowId, val, rawObject, cm, rdata) {
return ' title="'+rawObject[13]+'"';
}
},
и код для кнопок редактирования, я беру идентификатор из ROWDATA для первоначальной загрузки второй окно списка, и идентификатор из Prev/следующей строке при нажатии на навигационные кнопки:
myGrid.jqGrid('navGrid','#tab21p',{search:false,del:false},
{ // edit options
width:500,
modal:true,
closeOnEscape:true,
recreateForm: true,
editCaption:"Modifier un ARTICLE",
onInitializeForm: function(form) {
rowdata = myGrid.jqGrid('getRowData',selectedId);
id_fam=rowdata['fam_id'];
id_sfm=rowdata['sfm_id'];
$.ajax({
url:'selsfm.php?id='+id_fam+'&edit',
async:false,
mType:'GET',
success:function(data){
$("#tr_sfm select.FormElement").html(data);
$("#tr_sfm select.FormElement").val(id_sfm);
}
});
},
onclickPgButtons : function (whichbutton, formid, rowid) {
var row = myGrid.jqGrid('getGridParam','selrow');
if(whichbutton=='next'){row+=1;}else{row-=1;}
rowdata = myGrid.jqGrid('getRowData',row);
id_fam=rowdata['fam_id'];
id_sfm=rowdata['sfm_id'];
}
},
{ // add options
width:500,
modal:true,
closeOnEscape:true,
recreateForm: true,
addCaption:"Créer un ARTICLE",
onInitializeForm: function(form) {
id_fam=1;
id_sfm=1;
$.ajax({
url:'selsfm.php?id='+id_fam+'&add',
async:false,
mType:'GET',
success:function(data){
$("#tr_sfm select.FormElement").html(data);
$("#tr_sfm select.FormElement").val(id_sfm);
}
});
},
{}, //del options
{} //search options
);
и, наконец, при выборе строки из главной гри d, я беру идентификаторы из ROWDATA для загрузки второго списка:
onSelectRow:function(id,status){
selectedId=id;
rowdata = myGrid.jqGrid('getRowData',id);
id_fam=rowdata['fam_id'];
id_sfm=rowdata['sfm_id'];
$.ajax({
url:'selsfm.php?id='+id_fam+'&select',
async:false,
mType:'GET',
success:function(data){
$("#tr_sfm select.FormElement").html(data);
$("#tr_sfm select.FormElement").val(id_sfm);
}
});
},
Олега, пожалуйста, если у вас есть немного времени, чтобы посмотреть, много много спасибо сказать мне замечания об этом коде, так что я мог бы быть меньше, новичком ! Еще раз спасибо за обмен опытом. Хорошего дня. JiheL
ОБНОВЛЕНО 2013-04-08
я применил некоторые из комментариев Олега, которые позволяют мне получить более четкий код. Большое спасибо, Олег, я очень благодарен за ваш опыт. Я люблю все больше и больше jqGrid, потому что вы.
- О «dataEvents», я не понимаю, почему вы говорите мне использовать это, с e.target. Я видел, что его можно использовать в редактировании, но я не знаю, что вы имеете в виду.
- Переменная 'selectedId' используется, когда я редактирую строку и перемещаюсь с помощью pgButtons. Если я не запоминаю новый идентификатор строки, второй список не обновляется и не совпадает с первым полем.
- Новый момент, когда я верю в форму, я вижу в Firebug все пары, которые отправляются на сервер.
Как вы можете видеть, первый элемент является пустым со значением, то мне кажется, что это «SFM», ColName второго списка в. У вас есть идея, почему это происходит и как его решить?
Надеюсь не беспокоить вас этими постоянными вопросами. Я не нахожу ни одной книги, которая могла бы дать мне некоторые знания о кодировании jqGrid. Надеюсь, что почти это может существовать. Заранее благодарим за потраченное время. Хорошего дня. JiheL
еще раз я должен поблагодарить вас за вашу любезную помощь и то, как вы заставляете меня искать решение этой проблемы. Поскольку эти поля списка заполнены из базы данных, мне пришлось изменить способ, я обновляю свой вопрос, чтобы внести изменения в ваше соглашение. Много времени для меня сохраняется, надеюсь, вы не потратили слишком много времени на мою проблему. Хорошего дня. JiheL – JiheL
@ user2132268: Добро пожаловать! Трудно комментировать код без его отладки. Некоторые вещи могут быть улучшены: почему 'onSelectRow' должен делать' $ .ajax', особенно имея 'async: false', и пытается установить данные в форме, которая не может существовать? Вместо того, чтобы вводить переменную 'selectedId', вы можете использовать' getGridParam' с '' selrow''. Вместо использования 'myGrid' вы можете использовать' $ (this) 'внутри всех обратных вызовов. 'dataEvents' работает для * всех * режимов редактирования. Поэтому я рекомендую вам проверить, будет ли 'e.target' внутри формы и исполнять код, соответствующий используемому режиму редактирования. – Oleg
@ user2132268: Некоторые другие общие замечания о JavaScript-коде: вы используете переменные 'rowdata',' id_fam', 'id_sfm', которые объявляются во внешней области или по всему миру. Лучше объявлять переменные, используемые для временного назначения * локально * внутри соответствующей функции или обратного вызова. Вам лучше использовать 'rowdata.fam_id' вместо' rowdata ['fam_id'] '. Я бы рекомендовал вам ввести функцию, подобную 'reloadSelect', которая делает' $ .ajax' и заполняет зависимый выбор. Вы можете вызвать его с помощью '$ (e.target) .val()' или '$ (this) .jqGrid ('getCel', $ (this) .jqGrid ('getGridParam', 'selrow'), 'fam_id') 'как параметр. – Oleg