Как отобразить элемент каждый i == 1-й раз в таблице? - PullRequest
0 голосов
/ 26 мая 2018

Примечание"$ db" - это экземпляр класса моей базы данных, а "getRows ()" - это пользовательская функция в этом классе.

У меня есть JQuery Datatable, и янеобходимо заполнить его данными (доменные имена и записи MX).Мне нужно, чтобы он напечатал в таблицу как:

domain1 |   MX Record1
        |   MX Record2

domain2 |   MX Record1
        |   MX Record2
        |   MX Record3

Он работает в виде простого текста с этим кодом:

foreach ($records = $db->getRows("select name, group_concat(content) from records where type='MX' group by name", ['']) as $record) {

    $strings = explode(",", $record['group_concat(content)']);
    $name = $record['name'];
    $count = 0;
    foreach($strings as $string => $mx) {
        $count++;
        if($count <= 1 ) {
            echo "<strong>" . $name . "</strong> | " . $mx;
        }
        else {
            echo "----------------------- | " . $mx;
        }
        echo " -- Count: " . $count . "<br>";

    }
    echo "<br>";

}

Вывод:

domain1.com | xxxx.xxxxxxxxxxxxx.com -- Count: 1
----------- | xxxx.xxxxxxxxxxxxx.com -- Count: 2
----------  | xxxx.xxxxxxxxxxxxx.com -- Count: 3

domain2.net | xxxx.xxxxxxxxxx.net -- Count: 1
----------- | xxxx.xxxxxxxxxx.net -- Count: 2

domain3.com | xxxx-xxxxxx.xxxxxxxxxxxxxxxxx.com -- Count: 1
----------- | xxxx-xxxxxxx.xxxxxxxxxxxxxxxxx.com -- Count: 2
----------  | xxxx-x.xxxxxxxxxxxxxxxxxxxx.com -- Count: 3

Однако в моей таблице результат ужасен.Вот код для всего (без CSS):

<div class="container">
     <table id="mx_report_table" class="table table-bordered" >
          <thead>
          <tr>
               <th>Name</th>
               <th>MX Record</th>
          </tr>
          </thead>
          <tbody>
          <?php

          foreach($records = $db->getRows("SELECT name, group_concat(content) FROM records WHERE type='MX' GROUP BY name", ['']) as $record) {
              $strings = explode(",", $record['group_concat(content)']);
              $name = $record['name'];
              $count = 0;


              foreach($strings as $string => $mx) {
                  $count++;
                  if($count <= 1) {
                      echo "<tr><td>$name</td><td>$mx</td></tr>";
                  }
                  else {
                      echo "<tr><td></td><td>$mx</td></tr>";
                  }

              }
          }
          ?>
          </tbody>
     </table>
</div>
</body>
<script>
    document.title='MX Report';
    $(function() {
        $('#mx_report_table').DataTable({
            "scrollY":"400px",
            "scrollCollapse":true,
            "paging":true,
            "lengthMenu":[10,25,50,100],
            "pageLength":25
        });
    });
</script>

Вот как выглядит таблица:

enter image description here

Гдея ошибся, если я в основном (по крайней мере, я думаю) делать то же самое в моей таблице?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Да, каждый домен имеет соответствующие записи mx

Вы можете просто зациклить и вывести данные в таблицу:

foreach($strings as $string => $mx) {
    echo "<tr>
              <td>$name</td>
              <td>$mx</td>
          </tr>";
}

То, как у вас есть таблицапросто, строка за строкой выглядит одинаково, оставляя пустую ячейку под столбцом имени, читателю приходится «предполагать», что на самом деле отсутствует пропущенное доменное имя, но они должны учитывать, что предыдущее относится к нескольким записям MX.

Я предлагаю отдельные разделы с заголовком в качестве имени домена и всеми соответствующими записями MX под заголовком каждого имени домена.Например, пустая строка или что-то в этом роде.

Я бы покончил с зацикливанием на вызове db, так как там тоже все могло пойти не так.И просто извлеките данные из БД в массив, зациклите каждое доменное имя из массива со всеми соответствующими записями MX этого имени, и укажите имя в качестве строки заголовка, а затем записи MX в строках внизу, затем следующее имя в качестве строки заголовкаи его записи MX внизу.

0 голосов
/ 27 мая 2018

Как я уже упоминал в комментарии, это плагин DataTable, который (преднамеренно) портит работу, сортируя все строки по значению первого столбца.Добавьте "order": false к опциям DataTable, чтобы отключить возможность сортировки.

$('#mx_report_table').DataTable({
    "scrollY":"400px",
    "scrollCollapse":true,
    "paging":true,
    "lengthMenu":[10,25,50,100],
    "pageLength":25,
    "order": false
});

Демонстрация: https://jsfiddle.net/bep6uvfo/1/

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