ajax xml отображение данных с отношением мастер-деталь - PullRequest
1 голос
/ 02 апреля 2020

Через эту таблицу данных JQ bootstrap 4 (с возможностью датирования. net) я хочу для табличного отображения следующий файл xml:

<?xml version="1.0" encoding="UTF-8"?>
 <persns> 
  <prsn> 
  <fname>Smith</fname>  <!-- first name-->
  <lname>Milton</lname> <!-- last name --> 
  <age>44</age> 
  <e-mail>smilt@gmail.com</e-mail> 
  <phnmbr>3568236712</phnmbr>
  <addrss>5th summer st, mntb</addrss>
  <city>Portland</city>
 </prsn>
 <prsn> 
  <fname>Ken</fname> 
  <lname>Jackson</lname> 
  <age>37</age>
  <e-mail>ken.jackson@yahoo.com</e-mail> 
  <phnmbr>2638762076</phnmbr> 
  <addrss>19th Penfield ave, brtcl</addrss>
  <city>Kelowna</city>
 </prsn>
 <prsn> 
  <fname>Susan</fname>
  <lname>Arkland</lname> 
  <age>48</age>
  <e-mail>s.arklnd@hotmail.com</e-mail>
  <phnmbr>50834219704</phnmbr>
  <addrss>34th Mansfield st, sgtp</addrss>
  <city>Raleigh</city>
 </prsn>
 <prsn>
  <fname>Patsy</fname> 
  <lname>Brighton</lname>
  <age>38</age>
  <e-mail>patsy.brghton@gmail.com</e-mail> 
  <phnmbr>814522096358</phnmbr> 
  <addrss>12th Peel st, pnslv</addrss>
  <city>Philadelphia</city>
 </prsn>
 <prsn>
  <fname>John</fname>
  <lname>Torg</lname>
  <age>54</age>
  <e-mail>john.torg@tzeus.com</e-mail> 
  <phnmbr>042197327784</phnmbr>
  <addrss>27th north st, cnda</addrss>
  <city>Penticton</city>
</prsn>

, но с master- подробные функциональные возможности, как показано на следующей ссылке скрипта:

https://jsfiddle.net/nnb97rh9/3/

Только то, что до этой скрипки есть данные. json данных! (и мне нужно для. xml отображения) Соответствующий (почти функциональный). js (через основную таблицу я хочу отображать только следующие заголовки таблицы: fname, lname, age, city, в то время как остальные будут скрыты; они будут отображаться только как связанные дочерние строки таблицы):

$(function(){
 var prstbl = $("#prsns").dataTable(columns: [{"class":'details-control', 
"orderable":false, "data":null, "defaultContent":''},
          {dtaTbl:"fname"},
          {dtaTbl:"lname"},
          {dtaTbl:"age"},
          {dtaTbl:"city"},
          {dtaTbl:"e-mail", "visible":false},
          {dtaTbl:"phnmbr", "visible":false},
          {dtaTbl:"addrss", "visible":false}
         ]}),
 oTable = $('#prsne').DataTable()

function format(d)
{ 
  return '<table cellpadding="3" cellspacing="0" border="0" style="padding- 
  left:40px">'
+ '<tr>' + '<td>e-mail addrss</td>'
+ '<td>' + d.email + '</td>' + '</tr>'
+ '<tr>' + '<td>phn nmber</td>'
+ '<td>' + d.phnmbr + '</td>' + '</tr>'
+ '<tr>' + '<td>address</td>'
+ '<td>' + d.addrss + '</td>' + '</tr>'
+ '</table>'
}

$.ajax({type:"GET", url:"persns.xml", dataType:"xml", success:
function(xml)
{
var prsns = $(xml).find("prsn")
prsns.each(function(idx, prs)
        {
         var prs = $(prs), dtaTbl = [] 
         prs.children().each(function(j,chdnd)
             {
              dtaTbl.push($(chdnd).text())  
             })
         prstbl.fnAddData(dtaTbl)
      })
 }
})

$('#prsns tbody').on('click', 'td.details-control', function()
        {
         var tr = $(this).closest('tr'),
             row = oTable.row(tr) 
         if(row.child.isShown()) // if the row is already expanded, 
    collapse it
         {
          row.child.hide()
          tr.removeClass('shown')
         }
         else // if collapsed row, expandit it 
         {
          row.child(format(row.data())).show()
          tr.addClass('shown')
      }
   })
 })

Соответствующая часть. html выглядит следующим образом:

<body>
 <h5>Master-detail persons display</h5>
  <table id="prsns" border="1" class="table display" width="60%">
  <thead><tr><th></th><th>frst nme</th><th>name</th><th>age</th> 
   <th>city</th> <th>e-mail addrss</th></tr></thead> 
  <tbody></tbody>
 </table>
</body>

И есть также маленький. css файл, подобный следующему:

td.details-control {background: url ('https://raw.githubusercontent.com/DataTables/DataTables/1.10.7/examples/resources/details_open.png') центр без повтора центра; курсор: указатель; }

tr.shown td.details-control {background: url ('https://raw.githubusercontent.com/DataTables/DataTables/1.10.7/examples/resources/details_close.png') центр без повтора центра; }

Повторяю, все отображения, которые мне нужно сделать, касаются этого. xml файла, а не. json или только. html! Я знаю, как это сделать с json таблицей. Так что, ребята, пожалуйста, помогите мне с этим вопросом. Спасибо всем заранее

1 Ответ

2 голосов
/ 02 апреля 2020

Есть несколько проблем с кодом, слишком много, чтобы описать. Ниже приведен исправленный код.

Обратите внимание, что я использую механизм jsFiddle для извлечения XML файла, замените его своим собственным.

(function () {
   function format(d) {
      return '<table cellpadding="3" cellspacing="0" border="0" style="padding-left: 40 px ">' +
         '<tr>' + '<td>e-mail addrss</td>' +
         '<td>' + d['e-mail'] + '</td>' + '</tr>' +
         '<tr>' + '<td>phn nmber</td>' +
         '<td>' + d['phnmbr'] + '</td>' + '</tr>' +
         '<tr>' + '<td>address</td>' +
         '<td>' + d['addrss'] + '</td>' + '</tr>' +
         '</table>';
   }

   var prstbl = $("#prsns").DataTable({
      columns: [
         {
            "class": 'details-control',
            "orderable": false,
            "data": null,
            "defaultContent": ''
         },
         {
            data: "fname"
         },
         {
            data: "lname"
         },
         {
            data: "age"
         },
         {
            data: "city"
         },
         {
            data: "e-mail",
            "visible": false
         },
         {
            data: "phnmbr",
            "visible": false
         },
         {
            data: "addrss",
            "visible": false
         }
      ]
   });

   $.ajax({
      type: "POST",
      url: "/echo/xml",
      data: {
            xml: '<?xml version="1.0" encoding="UTF-8" ?><persns>'
            + '<prsn><fname>Smith</fname><lname>Milton</lname><age>44</age><e-mail>smilt@gmail.com</e-mail><phnmbr>3568236712</phnmbr><addrss>5th summer st, mntb</addrss><city>Portland</city></prsn>'
            + '<prsn><fname>Ken</fname><lname>Jackson</lname><age>37</age><e-mail>ken.jackson@yahoo.com</e-mail><phnmbr>2638762076</phnmbr><addrss>19th Penfield ave, brtcl</addrss><city>Kelowna</city></prsn>'
            + '<prsn><fname>Susan</fname><lname>Arkland</lname><age>48</age><e-mail>s.arklnd@hotmail.com</e-mail><phnmbr>50834219704</phnmbr><addrss>34th Mansfield st, sgtp</addrss><city>Raleigh</city></prsn>'
            + '<prsn><fname>Patsy</fname><lname>Brighton</lname><age>38</age><e-mail>patsy.brghton@gmail.com</e-mail><phnmbr>814522096358</phnmbr><addrss>12th Peel st, pnslv</addrss><city>Philadelphia</city></prsn>'
            + '<prsn><fname>John</fname><lname>Torg</lname><age>54</age><e-mail>john.torg@tzeus.com</e-mail><phnmbr>042197327784</phnmbr><addrss>27th north st, cnda</addrss><city>Penticton</city></prsn>'
        + '</persns>',
      },
      dataType: 'xml',
      success: function (xml) {
         var prsns = $(xml).find("prsn");
         prsns.each(function (idx, prs) {
            var rowData = [];
            $(prs).children().each(function (j, chdnd) {
               rowData[$(chdnd).get(0).tagName] = $(chdnd).text();
            });
                prstbl.row.add(rowData);
        });

        prstbl.draw();       
      }
   });

    $('#prsns tbody').on('click', 'td.details-control', function () {
      var tr = $(this).closest('tr');
      var row = prstbl.row(tr);

      // if the row is already expanded, collapse it
      if (row.child.isShown())  {
            row.child.hide();
            tr.removeClass('shown');
        // if collapsed row, expand it             
      } else {
         row.child(format(row.data())).show();
         tr.addClass('shown');
      }
   });
})();

См. обновленный пример для код и демонстрация.

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