DataTable Hilfe benötigt

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

peternmb

Mitglied
23 Januar 2020
72
0
6
62
Hallo,

nachdem ich letztes Jahr, Dank der Hilfe hier im Forum, zum ersten Mal mit DataTables gearbeitet habe würde ich das gerne wieder einsetzen.

Problemstellung:
Ich habe in einem Verzeichnis eine beliebige Anzahl kleiner txt-Dateien, deren Inhalt ich gerne in der Tabelle darstellen würde.
Das Grundgerüst konnte ich vom letzten Mal übernehmen, es fehlen jedoch einige spezielle Anpassungen bei denen ich Hilfe benötige.

So sehen die txt-Dateien aus:
www.hildegarda.de/TEST/0101.txt
www.hildegarda.de/TEST/0201.txt
www.hildegarda.de/TEST/0301.txt

Ich habe eine Testseite mit Beispieldaten gebaut, um das besser verdeutlichen zu können - so sieht das aus was ich bisher gemacht habe:
www.hildegarda.de/TEST

Die index.html:
<!DOCTYPE html>
<html>
<head>
<title>Test Datatables</title>
<meta charset="utf-8">
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css">
</head>
<body>
<h2 style="font-family: Helvetica,Arial,sans-serif;">aktueller Test:</h2>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script>
<script src="https://cdn.datatables.net/plug-ins/1.10.20/sorting/datetime-moment.js"></script>
<script type="text/javascript" src="jquery.dataTables.js"></script>
<table id="events" class="display" style="width: 100%;">
<thead>
<tr>
<th>Name</th>
<th>erstellt am</th>
<th>Email</th>
<th>Bildung</th>
</tr>
</thead>
</table>

<script>
$.fn.dataTable.moment('DD.MM.YYYY');
$('#events').DataTable({
"ajax": "data.php",
"language": {
url: 'https://cdn.datatables.net/plug-ins/1.10.20/i18n/German.json'
},
"order": [[ 0, 'desc' ]]
});
</script>

</body>
</html>

Die data.php:
<?php
$files = 0; // Zähler
$path = scandir('./'); // Gibt den Inhalt des ganzen Verzeichnisses in einem Array wieder
$array = []; // Array für Dateiinhalt
foreach ($path as $file) { // Wiederhole den Vorgang für jedes Element des Arrays "$path"
if (substr($file, -4) == '.txt') { // nur txt-Dateien
$subarray = file($file); // Inhalt in array einlesen
$eventid = substr($file, 0, -4); // Dateiname ohne Extension merken
// nach UTF-8 umkodieren
for ($i = 0; $i < count($subarray); $i++) {
$subarray[$i] = utf8_encode($subarray[$i]);
}
$array[] = $subarray;
$files++; // Inkrementiert $files um 1
}
}
$outarray = ["data" => $array];
echo json_encode($outarray);

?>
Was ich nicht hinbekomme:
- ich möchte als erste Spalte den Dateinamen haben
- bei erstellt am hätte ich gerne nur das Datum um das danach sortieren zu können
- in der letzten Spalte bei Bildung hätte ich gerne alle folgenden Einträge in der gleichen Tabellenspalte untereinander

Wäre klasse, wenn ich hier wieder so toll geholfen bekäme. Danke.
 

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.517
479
83
68
Wäre klasse, wenn ich hier wieder so toll geholfen bekäme.
Ich werde mein Bestes tun :smile:

Zunächst mal geht das Auslesen eines Verzeichnisses viel einfacher mit der Funktion glob():
Code:
$files = glob('./*.txt');
$array = [];
foreach ($files as $file) { // Wiederhole den Vorgang für jedes Element des Arrays "$files"
    $subarray = file($file); // Inhalt in array einlesen
    // In einem zweiten Unterarray tragen wir zunächst den aktuellen
    // Dateinamen ein:
    $subarray2 = [$file];
    // Jetzt fügen wir die Elemente aus dem ersten Unterarray hinzu:
    foreach ($subarray as $item) {
        subarray2[] = utf8_encode($item);
    }
    $array[] = subarray2;
}
$outarray = ["data" => $array];
echo json_encode($outarray);
(ungetestet)
Was "nur das Datum" betrifft, so kannst Du den Teilstring davor mit str_replace() entfernen.
Ebenfalls mit str_replace() kannst Du das "|" durch einen Zeilenumbruch ersetzen.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: peternmb

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.517
479
83
68
Dieser Fehler tritt normaler Weise auf, wenn ein Fehler beim Parsen des JSON auftritt und das ist wiederum der Fall, wenn das PHP-Skript eine Fehlermeldung liefert. In solch einem Fall erst Mal ansehen, was das PHP-Skript liefert: Entweder diese Skript direkt im Browser aufrufen oder in den Entwicklerwerkzeugen im Netzwerk Tag die Antwort des Skripte ansehen.
Ich hatte übrigens hier bei dem Pfeil einen Fehler drin, den ich hinterher korrigiert hatte, möglicher Weise hast Du meine editierte Version nicht mit bekommen:
Code:
$files = glob('./*.txt');
$array = [];
foreach ($files as $file) { // Wiederhole den Vorgang für jedes Element des Arrays "$files"
    $subarray = file($file); // Inhalt in array einlesen
    // In einem zweiten Unterarray tragen wir zunächst den aktuellen
    // Dateinamen ein:
    $subarray2 = [$file];
    // Jetzt fügen wir die Elemente aus dem ersten Unterarray hinzu:
    foreach ($subarray as $item) {
        subarray2[] = utf8_encode($item);
    }
    // Fehler hier --->
    // $subarray[] = subarray2;
    $array[] = subarray2;
}
$outarray = ["data" => $array];
 
  • Like
Reaktionen: peternmb

peternmb

Mitglied
23 Januar 2020
72
0
6
62
Sorry, ich bekomme immer noch die Fehlermeldung.

Wenn ich die data.php direkt im Browser aufrufe erhalte ich überhaupt keine Rückgabe - tut mir leid, ich habe von PHP wirklich seehr wenig Ahnung - benötige es auch sehr selten, und wenn versuche nur etwas anzupassen.
 

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.517
479
83
68
Dann schalte mal die Fehleranzeige ein, dieses ganz oben im Skript einfügen:
Code:
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
 
  • Like
Reaktionen: peternmb

peternmb

Mitglied
23 Januar 2020
72
0
6
62
vielen Dank, der erste Teil ist geschafft, auch die Datumssortierung funktioniert mit str__replace.

Was ich jetzt noch möchte, falls das überhaupt möglich ist wäre, dass alle weiteren Einträge der Textdateien jeweils nur in der Tabellenzelle Bildung untereinander gezeigt werden.
 

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.517
479
83
68
auch die Datumssortierung funktioniert mit str__replace.
Wie hast Du das denn gelöst?

alle weiteren Einträge der Textdateien jeweils nur in der Tabellenzelle Bildung untereinander gezeigt werden.
Versuche es so:
Code:
<?php
$files = glob('*.txt');
$array = [];
foreach ($files as $file) { // Wiederhole den Vorgang für jedes Element des Arrays "$files"
    $lines = file($file, FILE_IGNORE_NEW_LINES); // Inhalt in array einlesen
    // In einem zweiten Unterarray tragen wir zunächst den aktuellen
    // Dateinamen ein:
    $subarray2 = [$file];
    // Den Teilstring "gemeldet am: " in der zweiten Zeile loeschen:
    $lines[1] = str_replace('gemeldet am: ', '', $lines[1]);
    // Jetzt fügen wir die Elemente aus dem ersten Unterarray hinzu:
    for ($i = 0; $i < 3; $i++) {
        $subarray2[] = utf8_encode($lines[$i]);
    }
    // Die letzten Zeilen ab der vierten bereit stellen:
    $sliced = array_slice($lines, 3);
    // Mit <br> zusammen fuegen:
    $joined = implode('<br>', $sliced);
    // Und zum Unterarray hinzu fügen:
    $subarray2[] = $joined;
    // Unterarray zum Ergebnis hinzu fügen:
    $array[] = $subarray2;
}
$outarray = ["data" => $array];
echo json_encode($outarray, JSON_PRETTY_PRINT);
 
  • Like
Reaktionen: peternmb

peternmb

Mitglied
23 Januar 2020
72
0
6
62
Vielen Dank, absolut perfekt - funktionierte aus Anhieb genau wie ich es mir vorgestellt habe :smile:

auch die Datumssortierung funktioniert mit str__replace.
Wie hast Du das denn gelöst?
einfach nur mit str_replace die überflüssigen Zeichen entfernt.
Ich hatte erwartet, dasss danach noch eine aufwändige Konvertierung des deutschen Datums in ein sortierfähiges notwendig würde - DataTables scheint aber sogar das mit dem deutschen Datum zu erkennen.

Ich bin echt begeistert von den Möglichkeiten der DataTables, und das mit wenigen Zeilen Code (wenn man es kann...).

Ich hätte das auch über ein Windows-Programm lösen können, wäre aber sehr aufwändig gewesen. Erst alle Dateien per FTP herunterladen, dann alles in eine Datenbank oder ein Array einlesen und vernünftig anzeigen. Da wären dann immer noch keine Such-, Filter- oder Sortiermöglichkeiten...
 
Werbung: