2013-04-04 2 views
0

После того, как вы рассматривали этот форум как-то для решения этих проблем и без успеха, я надеюсь, что кто-то может потратить немного времени, чтобы заставить меня понять, что происходит и как его решить.jqGrid проблемы с прикомандированными списками выбора в редакторе формы

Вот снимок проблемы:

enter image description here

и ответ 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;'>&nbsp;&nbsp;(<span style='color:red;'>*</span>)&nbsp;</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;'>&nbsp;&nbsp;(<span style='color:red;'>*</span>)&nbsp;</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, потому что вы.

  1. О «dataEvents», я не понимаю, почему вы говорите мне использовать это, с e.target. Я видел, что его можно использовать в редактировании, но я не знаю, что вы имеете в виду.
  2. Переменная 'selectedId' используется, когда я редактирую строку и перемещаюсь с помощью pgButtons. Если я не запоминаю новый идентификатор строки, второй список не обновляется и не совпадает с первым полем.
  3. Новый момент, когда я верю в форму, я вижу в Firebug все пары, которые отправляются на сервер. enter image description here

Как вы можете видеть, первый элемент является пустым со значением, то мне кажется, что это «SFM», ColName второго списка в. У вас есть идея, почему это происходит и как его решить?

Надеюсь не беспокоить вас этими постоянными вопросами. Я не нахожу ни одной книги, которая могла бы дать мне некоторые знания о кодировании jqGrid. Надеюсь, что почти это может существовать. Заранее благодарим за потраченное время. Хорошего дня. JiheL

ответ

2

jqGrid не содержит встроенной поддержки зависимых выборок.

Если вы действительно нуждаетесь в реализации зависимых выборок, я могу переслать the answer. Он показывает, как изменить вручную содержание второго (зависимого) выбора на основе изменений в первом.

В целом, jqGrid нужно обязательно использовать гибкий способ, как refresh Некоторые выбирают по новым параметрам (например, dataUrl).

+0

еще раз я должен поблагодарить вас за вашу любезную помощь и то, как вы заставляете меня искать решение этой проблемы. Поскольку эти поля списка заполнены из базы данных, мне пришлось изменить способ, я обновляю свой вопрос, чтобы внести изменения в ваше соглашение. Много времени для меня сохраняется, надеюсь, вы не потратили слишком много времени на мою проблему. Хорошего дня. JiheL – JiheL

+0

@ user2132268: Добро пожаловать! Трудно комментировать код без его отладки. Некоторые вещи могут быть улучшены: почему 'onSelectRow' должен делать' $ .ajax', особенно имея 'async: false', и пытается установить данные в форме, которая не может существовать? Вместо того, чтобы вводить переменную 'selectedId', вы можете использовать' getGridParam' с '' selrow''. Вместо использования 'myGrid' вы можете использовать' $ (this) 'внутри всех обратных вызовов. 'dataEvents' работает для * всех * режимов редактирования. Поэтому я рекомендую вам проверить, будет ли 'e.target' внутри формы и исполнять код, соответствующий используемому режиму редактирования. – Oleg

+0

@ 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

Смежные вопросы