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

[GELOEST] Externe JSON abfragen und in Tabelle darstellen

salmi1986

Mitglied
Hallo Leute,
ich wurde gerne eine externe JSON Abfragen und das Ergebnis in einer Tabelle darstellen lassen.

Ich frage die externe JSON mit folgend code ab
Code:
<?php

error_reporting(E_ALL);

$url = 'https://cf-einsaetze.ooelfv.at/webext2/rss/json_laufend.txt';

    $curl = curl_init();
    $headers = array();
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    $json = curl_exec($curl);
    curl_close($curl);
        $data = json_decode($json, TRUE);

    // var_dump($data);

    echo "<pre>";
    print_r($data);
    echo "</pre>";

     echo "<br /><br />";

?>

Dieser code liefert mir folgendes Ergebnis:
Code:
Array
(
    [webext2] => 1
    [version] => 1.3.1
    [title] => laufend
    [pubDate] => Tue, 20 Aug 2024 12:17:01 +0200
    [cnt_einsaetze] => 4
    [cnt_feuerwehren] => 6
    [einsaetze] => Array
        (
            [0] => Array
                (
                    [einsatz] => Array
                        (
                            [num1] => E240803477
                            [einsatzort] => LL - Wilhering
                            [startzeit] => Tue, 20 Aug 2024 11:36:01 +0200
                            [inzeit] =>
                            [status] => offen
                            [alarmstufe] => 1
                            [einsatzart] => TEE
                            [einsatztyp] => Array
                                (
                                    [id] => T1-PERS-UNWEGG
                                    [text] => Personenrettung unwegsames Gelände
                                )

                            [einsatzsubtyp] => Array
                                (
                                    [id] => PERSUNWEGG-TE
                                    [text] => Personenrettung unwegsames Gelände
                                )

                            [adresse] => Array
                                (
                                    [default] => Wilhering
                                    [earea] => Wilhering
                                    [emun] => Wilhering
                                    [efeanme] =>
                                    [estnum] =>
                                    [ecompl] =>
                                )

                            [wgs84] => Array
                                (
                                    [lng] => 14.1755
                                    [lat] => 48.3188
                                )

                            [bezirk] => Array
                                (
                                    [id] => 6
                                    [text] => Linz-Land
                                )

                            [feuerwehren] => Array
                                (
                                    [406205] => Array
                                        (
                                            [feuerwehr] => Feuerwehr/Florian Edramsberg (39205)
                                        )

                                    [406221] => Array
                                        (
                                            [feuerwehr] => Feuerwehr/Florian Schönering (39221)
                                        )

                                    [406223] => Array
                                        (
                                            [feuerwehr] => Feuerwehr/Florian Wilhering (39223)
                                        )

                                )

                            [feuerwehrenarray] => Array
                                (
                                    [0] => Array
                                        (
                                            [fwnr] => 406205
                                            [fwname] => Feuerwehr/Florian Edramsberg (39205)
                                        )

                                    [1] => Array
                                        (
                                            [fwnr] => 406221
                                            [fwname] => Feuerwehr/Florian Schönering (39221)
                                        )

                                    [2] => Array
                                        (
                                            [fwnr] => 406223
                                            [fwname] => Feuerwehr/Florian Wilhering (39223)
                                        )

                                )

                            [cntfeuerwehren] => 3
                        )

                )

            [1] => Array
                (
                    [einsatz] => Array
                        (
                            [num1] => E240803474
                            [einsatzort] => SD - Suben
                            [startzeit] => Tue, 20 Aug 2024 11:16:38 +0200
                            [inzeit] =>
                            [status] => offen
                            [alarmstufe] => 0
                            [einsatzart] => PERSON
                            [einsatztyp] => Array
                                (
                                    [id] => V0-AUFRÄUM
                                    [text] => Verkehrsunfall Aufräumarbeiten
                                )

                            [einsatzsubtyp] => Array
                                (
                                    [id] => AUFRÄUM-VU
                                    [text] => Verkehrsunfall Aufräumarbeiten
                                )

                            [adresse] => Array
                                (
                                    [default] => Suben
                                    [earea] => Suben
                                    [emun] => Suben
                                    [efeanme] =>
                                    [estnum] =>
                                    [ecompl] =>
                                )

                            [wgs84] => Array
                                (
                                    [lng] => 13.4317
                                    [lat] => 48.4102
                                )

                            [bezirk] => Array
                                (
                                    [id] => 10
                                    [text] => Schärding
                                )

                            [feuerwehren] => Array
                                (
                                    [410324] => Array
                                        (
                                            [feuerwehr] => Feuerwehr/Florian Suben (45324)
                                        )

                                )

                            [feuerwehrenarray] => Array
                                (
                                    [0] => Array
                                        (
                                            [fwnr] => 410324
                                            [fwname] => Feuerwehr/Florian Suben (45324)
                                        )

                                )

                            [cntfeuerwehren] => 1
                        )

                )

          

                            [cntfeuerwehren] => 1
                        )

                )

        

                            [cntfeuerwehren] => 1
                        )

                )

        )

)

Nun will ich aber das dieses Ergebnis der Abfrage als Tabelle dargestellt wird habe schon mehrere Versuche gemacht habe komme nicht auf die Lösung ! Es sollt dann ungefähr so aussehen.

Screenshot 2024-08-20 120823.png

Vielen Dank für eure unterstützung
LG Stefan
 
Werbung:
Wenn Du das mit PHP serverseitig lösen willst, musst Du das HTML aus der Datenstruktur $data generieren:

Zunächst eine Schleife über alle Einsätze:
Code:
foreach($data as $einsatz) {
}
Das Datum lasse ich mal weg. Die Überschrift musst Du aus dem Bezirk und dem Einsatztyp zusammen setzen:

Code:
$bezirk = $einsatz['einsatz']['bezirk']['text];
$typ = $einsatz['einsatz']['einsatztyp]['text];
echo "<h2>$bezirk - $typ</h2>";

Für die beteiligten Feuerwehren bietet sich eine Liste an:
die über eine weitere Schleife erzeugt wird:
Code:
foreach ($einsatz['einsatz']['feuerwehrenarray'] as $feuerwehr) {
    $feuerwehrtext = $feuerwehr['text'];
    echo "<li>$feuerwehrtext</li>";
}
Das öffende <ul> und das schließende </ul> kannst Du selbst hinzufügen.

Und für die weiteren Parameter eine Beschreibungsliste:
Würde dann für zwei Beispiele so aussehen:
Code:
$typ = $einsatz['einsatz']['einsatztyp']['text'];
echo "<dt>Einsatztyp:</dt><dd>$typ</dd>";
$art = $einsatz['einsatz']['einsatzart'];
echo "<dt>Einsatzart:</dt><dd>$art</dd>";
usw.
Auch hier musst Du das öffnende <dl> und das schließende </dl> hinzu fügen.

Ungetestet und natürlich nicht vollständig. Versuche, ob Du mit diesen Angaben weiter kommst und melde dich wieder wenn Du Fragen hast.
 
Zuletzt bearbeitet:
@

Sempervivum


Danke für deine Antwort !

Habe den code eingefügt stimmt das so ?
Code:
<?php

error_reporting(E_ALL);

$url = 'https://cf-einsaetze.ooelfv.at/webext2/rss/json_laufend.txt';

    $curl = curl_init();
    $headers = array();
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    $json = curl_exec($curl);
    curl_close($curl);
        $data = json_decode($json, TRUE);

    // var_dump($data);

    foreach($data as $einsatz) {
    }

    $bezirk = $einsatz['einsatz']['bezirk']['text'];
$typ = $einsatz['einsatz']['einsatztyp']['text'];
echo "<h2>$bezirk - $typ</h2>";


?>

es führt jedoch zum folgeden fehler
Code:
Warning: Undefined array key "einsatz" in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 23

Warning: Trying to access array offset on value of type null in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 23

Warning: Trying to access array offset on value of type null in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 23

Warning: Undefined array key "einsatz" in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 24

Warning: Trying to access array offset on value of type null in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 24

Warning: Trying to access array offset on value of type null in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 24
-

Danke nochmals !
LG Stefan
 
Werbung:
Nein, so funktioniert es nicht, Du musst den zweiten Codeblock in die Schleife legen, sonst ist die Variable $einsatz nicht definiert:
Code:
    foreach($data['einsaetze'] as $einsatz) {
        $bezirk = $einsatz['einsatz']['bezirk']['text'];
        $typ = $einsatz['einsatz']['einsatztyp']['text'];
        echo "<h2>$bezirk - $typ</h2>";
    }
Ebenso später die Codeblöcke für die beteiligten Feuerwehren und die weiteren Parameter.
Edit: Ich hatte außerdem übersehen, dass es ein Element "einsaetze" in oberster Stufe gibt, das habe ich oben ergaenzt.
 
Zuletzt bearbeitet:
@

@Sempervivum


Funktioniert leider auch nicht

Code:
Warning: Trying to access array offset on value of type bool in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 21

Warning: Trying to access array offset on value of type null in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 21

Warning: Trying to access array offset on value of type null in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 21

Warning: Trying to access array offset on value of type bool in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 22

Warning: Trying to access array offset on value of type null in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 22

Warning: Trying to access array offset on value of type null in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 22
-

Fatal error: Uncaught TypeError: Cannot access offset of type string on string in C:\xampp8.2.1\htdocs\suchhunde\test.php:21 Stack trace: #0 {main} thrown in C:\xampp8.2.1\htdocs\suchhunde\test.php on line 21
 
Ich habe das jetzt getestet und es funktioniert einwandfrei:
Code:
<?php

error_reporting(E_ALL);

$url = 'https://cf-einsaetze.ooelfv.at/webext2/rss/json_laufend.txt';

$curl = curl_init();
$headers = array();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
$json = curl_exec($curl);
curl_close($curl);
$data = json_decode($json, true);

var_dump($data);

foreach ($data['einsaetze'] as $einsatz) {
    $bezirk = $einsatz['einsatz']['bezirk']['text'];
    $typ = $einsatz['einsatz']['einsatztyp']['text'];
    echo "<h2>$bezirk - $typ</h2>";
}
Wenn es bei dir nicht geht, dann poste bitte noch Mal deinen vollständigen Code, damit man die Zeilennummern richtig zuordnen kann.
 
Werbung:

@Sempervivum

Danke jetzt funktioniert es, dürfte irgendwas nicht mit Kopiert haben.

Wie bekomme ich jetzt den oberen teile augeblendet damit nur das ergebnis anzeigt wird.

Code:
array(7) { ["webext2"]=> bool(true) ["version"]=> string(5) "1.3.1" ["title"]=> string(7) "laufend" ["pubDate"]=> string(31) "Wed, 21 Aug 2024 08:41:01 +0200" ["cnt_einsaetze"]=> int(3) ["cnt_feuerwehren"]=> int(2) ["einsaetze"]=> array(3) { [0]=> array(1) { ["einsatz"]=> array(15) { ["num1"]=> string(10) "E240803606" ["einsatzort"]=> string(14) "LL - Ansfelden" ["startzeit"]=> string(31) "Wed, 21 Aug 2024 08:26:29 +0200" ["inzeit"]=> string(0) "" ["status"]=> string(5) "offen" ["alarmstufe"]=> string(1) "0" ["einsatzart"]=> string(3) "TEE" ["einsatztyp"]=> array(2) { ["id"]=> string(14) "T0-ÜBERFL-GEB" ["text"]=> string(13) "Wasserschaden" } ["einsatzsubtyp"]=> array(2) { ["id"]=> string(13) "ÜBERFLGEB-TE" ["text"]=> string(20) "Gebäude überflutet" } ["adresse"]=> array(6) { ["default"]=> string(9) "Ansfelden" ["earea"]=> string(9) "Ansfelden" ["emun"]=> string(9) "Ansfelden" ["efeanme"]=> string(0) "" ["estnum"]=> string(0) "" ["ecompl"]=> string(0) "" } ["wgs84"]=> array(2) { ["lng"]=> string(7) "14.2881" ["lat"]=> string(7) "48.2097" } ["bezirk"]=> array(2) { ["id"]=> int(6) ["text"]=> string(9) "Linz-Land" } ["feuerwehren"]=> array(1) { [406201]=> array(1) { ["feuerwehr"]=> string(35) "Feuerwehr/Florian Ansfelden (39201)" } } ["feuerwehrenarray"]=> array(1) { [0]=> array(2) { ["fwnr"]=> int(406201) ["fwname"]=> string(35) "Feuerwehr/Florian Ansfelden (39201)" } } ["cntfeuerwehren"]=> int(1) } } [1]=> array(1) { ["einsatz"]=> array(15) { ["num1"]=> string(10) "E240803605" ["einsatzort"]=> string(9) "LL - Enns" ["startzeit"]=> string(31) "Wed, 21 Aug 2024 08:24:08 +0200" ["inzeit"]=> string(0) "" ["status"]=> string(5) "offen" ["alarmstufe"]=> string(1) "0" ["einsatzart"]=> string(5) "BRAND" ["einsatztyp"]=> array(2) { ["id"]=> string(6) "B0-BMA" ["text"]=> string(15) "Brandmeldealarm" } ["einsatzsubtyp"]=> array(2) { ["id"]=> string(7) "BMA1-BR" ["text"]=> string(15) "Brandmeldealarm" } ["adresse"]=> array(6) { ["default"]=> string(4) "Enns" ["earea"]=> string(4) "Enns" ["emun"]=> string(4) "Enns" ["efeanme"]=> string(0) "" ["estnum"]=> string(0) "" ["ecompl"]=> string(0) "" } ["wgs84"]=> array(2) { ["lng"]=> string(7) "14.4791" ["lat"]=> string(7) "48.2174" } ["bezirk"]=> array(2) { ["id"]=> int(6) ["text"]=> string(9) "Linz-Land" } ["feuerwehren"]=> array(1) { [406102]=> array(1) { ["feuerwehr"]=> string(30) "Feuerwehr/Florian Enns (39102)" } } ["feuerwehrenarray"]=> array(1) { [0]=> array(2) { ["fwnr"]=> int(406102) ["fwname"]=> string(30) "Feuerwehr/Florian Enns (39102)" } } ["cntfeuerwehren"]=> int(1) } } [2]=> array(1) { ["einsatz"]=> array(15) { ["num1"]=> string(10) "E240803498" ["einsatzort"]=> string(14) "LL - Ansfelden" ["startzeit"]=> string(31) "Tue, 20 Aug 2024 15:13:53 +0200" ["inzeit"]=> string(0) "" ["status"]=> string(5) "offen" ["alarmstufe"]=> string(1) "0" ["einsatzart"]=> string(6) "SELBST" ["einsatztyp"]=> array(2) { ["id"]=> string(6) "SELBST" ["text"]=> string(24) "Selbstständiger Einsatz" } ["einsatzsubtyp"]=> array(2) { ["id"]=> string(12) "TETRA-SELBST" ["text"]=> string(25) "Einsatz od. Einsatzübung" } ["adresse"]=> array(6) { ["default"]=> string(9) "Ansfelden" ["earea"]=> string(9) "Ansfelden" ["emun"]=> string(9) "Ansfelden" ["efeanme"]=> string(0) "" ["estnum"]=> string(0) "" ["ecompl"]=> string(0) "" } ["wgs84"]=> array(2) { ["lng"]=> string(7) "14.2881" ["lat"]=> string(7) "48.2097" } ["bezirk"]=> array(2) { ["id"]=> int(6) ["text"]=> string(9) "Linz-Land" } ["feuerwehren"]=> array(1) { [406201]=> array(1) { ["feuerwehr"]=> string(35) "Feuerwehr/Florian Ansfelden (39201)" } } ["feuerwehrenarray"]=> array(1) { [0]=> array(2) { ["fwnr"]=> int(406201) ["fwname"]=> string(35) "Feuerwehr/Florian Ansfelden (39201)" } } ["cntfeuerwehren"]=> int(1) } } } }
Linz-Land - Wasserschaden
Linz-Land - Brandmeldealarm
Linz-Land - Selbstständiger Einsatz

Danke nochmals !
 
@Sempervivum

habe jetzt einiges angepasst und es führt schon fast zum endergebnis, nur bekomme ich das mit der Feuewehr nicht so hin, könntest du mir hier nochmals behilflich sein.

Meine diesen TEIL:
Code:
foreach ($einsatz['einsatz']['feuerwehrenarray'] as $feuerwehr) {
    $feuerwehrtext = $feuerwehr['text'];
    echo "<li>$feuerwehrtext</li>";
}

mein code sieht jetzt wie folgt aus:

Code:
 <meta http-equiv="refresh" content="30" />

<?php

error_reporting(E_ALL);

$url = 'https://cf-einsaetze.ooelfv.at/webext2/rss/json_laufend.txt';

$curl = curl_init();
$headers = array();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
$json = curl_exec($curl);
curl_close($curl);
$data = json_decode($json, true);

//var_dump($data);

foreach ($data['einsaetze'] as $einsatz) {


    $startzeit = $einsatz['einsatz']['startzeit'];
    $bezirk = $einsatz['einsatz']['bezirk']['text'];
    $typ = $einsatz['einsatz']['einsatztyp']['text'];
    echo "<h3>$bezirk - $typ </br> <font color='blue' font-size:10px;>".$startzeit."</font></h3>";
    $typ = $einsatz['einsatz']['einsatztyp']['text'];
  
echo "<dl>";
$einsatzort = $einsatz['einsatz']['einsatzort'];
echo "<dt>Einsatzort:</dt><dd>$einsatzort</dd>";
echo "<dt>Einsatztyp:</dt><dd>$typ</dd>";
$art = $einsatz['einsatz']['einsatzart'];
echo "<dt>Einsatzart:</dt><dd>$art</dd>";
$status = $einsatz['einsatz']['status'];
echo "<dt>Status:</dt><dd>$status</dd>";
$alarmstufe = $einsatz['einsatz']['alarmstufe'];
echo "<dt>Alarmstufe:</dt><dd>$alarmstufe</dd>";
echo "</dl>";

}

Danke
LG Stefan
 
Zuletzt bearbeitet:
Werbung:
Das wird dann eine verschachtelte Schleife, d. h. die Schleife über die Feuerwehren muss in die äußere Schleife mit den Einsätzen hinein:
Code:
foreach ($data['einsaetze'] as $einsatz) {

    $startzeit = $einsatz['einsatz']['startzeit'];
    $bezirk = $einsatz['einsatz']['bezirk']['text'];
    $typ = $einsatz['einsatz']['einsatztyp']['text'];
    echo "<h3>$bezirk - $typ </br> <font color='blue' font-size:10px;>" . $startzeit . "</font></h3>";
    $typ = $einsatz['einsatz']['einsatztyp']['text'];

    echo "<dl>";
    $einsatzort = $einsatz['einsatz']['einsatzort'];
    echo "<dt>Einsatzort:</dt><dd>$einsatzort</dd>";
    echo "<dt>Einsatztyp:</dt><dd>$typ</dd>";
    $art = $einsatz['einsatz']['einsatzart'];
    echo "<dt>Einsatzart:</dt><dd>$art</dd>";
    $status = $einsatz['einsatz']['status'];
    echo "<dt>Status:</dt><dd>$status</dd>";
    $alarmstufe = $einsatz['einsatz']['alarmstufe'];
    echo "<dt>Alarmstufe:</dt><dd>$alarmstufe</dd>";
    echo "</dl>";

    echo '<ul>';
    foreach ($einsatz['einsatz']['feuerwehrenarray'] as $feuerwehr) {
        $feuerwehrname = $feuerwehr['fwname'];
        echo "<li>$feuerwehrname</li>";
    }
    echo '</ul>';
}
 
@Sempervivum

Weiters wollt ich dich fragen ob es möglich ist einen Filter einzubauen so dass ich nach Einsatzart filtern kann. Da ich eigentlich nur bestimmt Einsätze für das Projekt benötige.

DANKE
Lg Stefan
 
Werbung:
Hier mal ein grober Entwurf, ohne Anspruch auf Schönheit und Eleganz:
Code:
 <!-- <meta http-equiv="refresh" content="30" /> -->

 <?php

error_reporting(E_ALL);

var_dump($_GET);
$url = 'https://cf-einsaetze.ooelfv.at/webext2/rss/json_laufend.txt';

$curl = curl_init();
$headers = array();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
$json = curl_exec($curl);
curl_close($curl);
$data = json_decode($json, true);

echo '<select id="filter"><option></option>';
//var_dump($data);
foreach ($data['einsaetze'] as $einsatz) {
    $art = $einsatz['einsatz']['einsatzart'];
    echo "<option>$art</option>";
}
echo '</select>';

if (isset($_GET['einsatzart'])) {
    $filterEinsatzart = $_GET['einsatzart'];
} else {
    $filterEinsatzart = '';
}
foreach ($data['einsaetze'] as $einsatz) {
    $art = $einsatz['einsatz']['einsatzart'];
    if ($filterEinsatzart == '' || $filterEinsatzart == $art) {
        $startzeit = $einsatz['einsatz']['startzeit'];
        $bezirk = $einsatz['einsatz']['bezirk']['text'];
        $typ = $einsatz['einsatz']['einsatztyp']['text'];
        echo "<h3>$bezirk - $typ </br> <font color='blue' font-size:10px;>" . $startzeit . "</font></h3>";
        $typ = $einsatz['einsatz']['einsatztyp']['text'];

        echo "<dl>";
        $einsatzort = $einsatz['einsatz']['einsatzort'];
        echo "<dt>Einsatzort:</dt><dd>$einsatzort</dd>";
        echo "<dt>Einsatztyp:</dt><dd>$typ</dd>";
        echo "<dt>Einsatzart:</dt><dd>$art</dd>";
        $status = $einsatz['einsatz']['status'];
        echo "<dt>Status:</dt><dd>$status</dd>";
        $alarmstufe = $einsatz['einsatz']['alarmstufe'];
        echo "<dt>Alarmstufe:</dt><dd>$alarmstufe</dd>";
        echo "</dl>";

        echo '<ul>';
        foreach ($einsatz['einsatz']['feuerwehrenarray'] as $feuerwehr) {
            $feuerwehrname = $feuerwehr['fwname'];
            echo "<li>$feuerwehrname</li>";
        }
        echo '</ul>';
    }
}
?>
 <script>
document.getElementById('filter').addEventListener('change', event => {
    const url = location.href.replace(/\?einsatzart=.*/, '') + `?einsatzart=${event.target.value}`;
    location.href = url;
});
 </script>
Du wirst bemerken, dass mehrfache Einträge in der Auswahl des Filters auftreten, das ist relativ leicht zu beheben.
Und Du möchtest gern, dass die Seite zyklisch aufgefrischt wird. Das ist sehr berechtigt.
Besser wäre es, anstatt diese Version zu verfeinern, die Einsatzdaten mit Ajax zu holen. Dann wird nicht jedes Mal neu geladen beim Auffrischen und nach einer Auswahl. Ich zeige dir später, wie das geht.
 
Hier jetzt eine Version mit Ajax:

index.html
Code:
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Einsatzdaten</title>
    <style>
    </style>
</head>

<body>
    <div id="auswahl-einsatzart"></div>
    <main></main>
    <script>
        const
            intv = 10000,
            url = `hole-einsatzdaten.php?t=${Date.now()}`,
            auswahlEinsatzart = document.querySelector('#auswahl-einsatzart'),
            einsaetze = document.querySelector('main');
        let sel;
        fetch(url)
            .then(response => response.json())
            .then(html => {
                auswahlEinsatzart.innerHTML = html.selectHTML;
                sel = document.querySelector('#auswahl-einsatzart select');
                einsaetze.innerHTML = html.einsatzHTML;
            });
        function holeEinsatzdaten() {
            let queryString = '';
            if (sel.value != '') {
                queryString = `&einsatzart=${sel.value}`;
            }
            fetch(`${url}${queryString}`)
                .then(response => response.json())
                .then(html => {
                    einsaetze.innerHTML = html.einsatzHTML;
                });
        }
        setInterval(holeEinsatzdaten, intv);
        document.addEventListener('change', event => {
            if (event.target.matches('select')) {
                holeEinsatzdaten();
            }
        });
    </script>
</body>

</html>

hole-einsatzdaten.php
Code:
<?php

error_reporting(E_ALL);

$url = 'https://cf-einsaetze.ooelfv.at/webext2/rss/json_laufend.txt';

$curl = curl_init();
$headers = array();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
$json = curl_exec($curl);
curl_close($curl);
$data = json_decode($json, true);

$einsatzArten = [];
$selectHTML = '<select id="filter"><option value="">Alle Einsatzarten</option>';
foreach ($data['einsaetze'] as $einsatz) {
    $art = $einsatz['einsatz']['einsatzart'];
    if (!in_array($art, $einsatzArten)) {
        $einsatzArten[] = $art;
        $selectHTML .= "<option value=\"$art\">$art</option>";
    }
}
$selectHTML .= '</select>';

if (isset($_GET['einsatzart'])) {
    $filterEinsatzart = $_GET['einsatzart'];
} else {
    $filterEinsatzart = '';
}

$einsatzHTML = '';
foreach ($data['einsaetze'] as $einsatz) {
    $art = $einsatz['einsatz']['einsatzart'];
    if ($filterEinsatzart == '' || $filterEinsatzart == $art) {
        $startzeit = $einsatz['einsatz']['startzeit'];
        $bezirk = $einsatz['einsatz']['bezirk']['text'];
        $typ = $einsatz['einsatz']['einsatztyp']['text'];
        $einsatzHTML .= "<h3>$bezirk - $typ </br> <font color='blue' font-size:10px;>" . $startzeit . "</font></h3>";
        $typ = $einsatz['einsatz']['einsatztyp']['text'];

        $einsatzHTML .= "<dl>";
        $einsatzort = $einsatz['einsatz']['einsatzort'];
        $einsatzHTML .= "<dt>Einsatzort:</dt><dd>$einsatzort</dd>";
        $einsatzHTML .= "<dt>Einsatztyp:</dt><dd>$typ</dd>";
        $einsatzHTML .= "<dt>Einsatzart:</dt><dd>$art</dd>";
        $status = $einsatz['einsatz']['status'];
        $einsatzHTML .= "<dt>Status:</dt><dd>$status</dd>";
        $alarmstufe = $einsatz['einsatz']['alarmstufe'];
        $einsatzHTML .= "<dt>Alarmstufe:</dt><dd>$alarmstufe</dd>";
        $einsatzHTML .= "</dl>";

        $einsatzHTML .= '<ul>';
        foreach ($einsatz['einsatz']['feuerwehrenarray'] as $feuerwehr) {
            $feuerwehrname = $feuerwehr['fwname'];
            $einsatzHTML .= "<li>$feuerwehrname</li>";
        }
        $einsatzHTML .= '</ul>';
    }
}
echo json_encode(['selectHTML' => $selectHTML, 'einsatzHTML' => $einsatzHTML],
    JSON_PRETTY_PRINT);
Wenn es bei dir nicht funktioniert oder wenn Du Fragen hast, dann melde dich.
 
@Sempervivum
SUPER ES FUNKTIONIERT !!!! DANKE

Ich hätte noch eine bitte und zwar kann man beim Filter einen Vordefinierten WERT zu EInsatzart "PERSON" definieren ?
Des weitern hätte ich eine Frage und zwar gibt es für die Einsatzarten auch definiere Faben und da würde ich gerne einen Rahmen in der jeweilen Farbe um den Text haben, kannst du mir auch weiter helfen ?

Ist es möglich eine ton abzuspielen wenn ein neuer eintrag vorhanden ist ?

Wir kann auf den
Code:
 "webext2": true,
    "version": "1.3.1",
    "title": "laufend",
    "pubDate": "Wed, 21 Aug 2024 15:35:01 +0200",
    "cnt_einsaetze": 9,
    "cnt_feuerwehren": 12,
zugiffen werden würde hier gerne cnt_einsaetze und cnt_feuerwehren anzeigen lassen.

was ich auch noch benötigen würde ist folgendes, würde gerne einen Link haben welcher google maps öffnet sollte so aussehen http://maps.google.de/maps?q=$lat,$lng&t=k&z=19 wird mir auch angezeigt aber leider nicht als link !



Danke dir im Voraus
LG Stefan
 
Zuletzt bearbeitet:
Werbung:
Ich hätte noch eine bitte und zwar kann man beim Filter einen Vordefinierten WERT zu EInsatzart "PERSON" definieren ?
Ja, tausche das Javascript gegen dieses aus:
Code:
    <script>
        const
            intv = 10000,
            einsatzartDefault = 'SELBST',
            url = `hole-einsatzdaten.php?t=${Date.now()}`,
            urlDefault = `${url}&einsatzart=${einsatzartDefault}`,
            auswahlEinsatzart = document.querySelector('#auswahl-einsatzart'),
            einsaetze = document.querySelector('main');
        let sel;
        fetch(urlDefault)
            .then(response => response.json())
            .then(html => {
                auswahlEinsatzart.innerHTML = html.selectHTML;
                const
                    sel = document.querySelector('#auswahl-einsatzart select'),
                    optDefault = sel.querySelector(`option[value="${einsatzartDefault}"]`);
                if (optDefault) optDefault.setAttribute('selected', true);
                einsaetze.innerHTML = html.einsatzHTML;
            });
        function holeEinsatzdaten() {
            let queryString = '';
            if (sel.value != '') {
                queryString = `&einsatzart=${sel.value}`;
            }
            fetch(`${url}${queryString}`)
                .then(response => response.json())
                .then(html => {
                    einsaetze.innerHTML = html.einsatzHTML;
                });
        }
        setInterval(holeEinsatzdaten, intv);
        document.addEventListener('change', event => {
            if (event.target.matches('select')) {
                holeEinsatzdaten();
            }
        });
    </script>

Was die Farben betrifft, soll der Rahmen nur um den Text, z. B. "Einsatzart: SELBST" oder um den vollständigen Block mit den Daten? Und soll auch die Option in der Auswahl oben den Rahmen bekommen?

Auf die Daten in der obersten Stufe kannst Du so zugreifen:
Code:
            $cntEinsaetze = $data['cnt_einsaetze'];
            $einsatzHTML .= "<li>$cntEinsätze</li>";
Auch hier das öffnende <ul> und das schließende </ul> hinzu fügen. Diese Liste direkt nach dem $einsatzHTML = ''; platzieren und vor der Schleife mit den Einsätzen.

Ist es möglich eine ton abzuspielen wenn ein neuer eintrag vorhanden ist ?
Da macht uns leider der Browser einen Strich durch die Rechnung, er lässt Töne nur nach Interaktion des Benutzers, z. B. Drücken eines Buttons, zu. Alternativ schlage ich einen visuellen Hinweis vor, z. B. einen blinkenden Hinweistext.

Edit: Ich sehe gerade, dass die Daten in der obersten Stufe eine Beschreibungsliste sein müssten. Versuche, mein Beispiel entsprechend umzuändern.
 
@Sempervivum
Was die Farben betrifft, soll der Rahmen nur um den Text, z. B. "Einsatzart: SELBST" oder um den vollständigen Block mit den Daten? Und soll auch die Option in der Auswahl oben den Rahmen bekommen?
Es soll der Komplette Block bekommen, in der auswahl muss es nicht sein !

Ich habe das Script getauscht jetzt wird aber nicht mehr gefiltert !!! Es werden nur mehr die Einsätze mit Typ SELBST angezeigt !

Das mit dem Blinkenden Text ist eine gute idee.

DANKE
Lg Stefan
 
Zuletzt bearbeitet:
Für die Farben müssen wir die Daten in einen Container legen, z. B. ein section:
Code:
// Hier drüber wie bisher
$einsatzHTML = '';
// Hier die Definitionsliste mit den globalen Daten
foreach ($data['einsaetze'] as $einsatz) {
    $art = $einsatz['einsatz']['einsatzart'];
    if ($filterEinsatzart == '' || $filterEinsatzart == $art) {
        $einsatzHTML .= "<section class=\"$art\">";
        $startzeit = $einsatz['einsatz']['startzeit'];
        $bezirk = $einsatz['einsatz']['bezirk']['text'];
        $typ = $einsatz['einsatz']['einsatztyp']['text'];
        $einsatzHTML .= "<h3>$bezirk - $typ </br> <font color='blue' font-size:10px;>" . $startzeit . "</font></h3>";
        $typ = $einsatz['einsatz']['einsatztyp']['text'];

        $einsatzHTML .= "<dl>";
        $einsatzort = $einsatz['einsatz']['einsatzort'];
        $einsatzHTML .= "<dt>Einsatzort:</dt><dd>$einsatzort</dd>";
        $einsatzHTML .= "<dt>Einsatztyp:</dt><dd>$typ</dd>";
        $einsatzHTML .= "<dt>Einsatzart:</dt><dd>$art</dd>";
        $status = $einsatz['einsatz']['status'];
        $einsatzHTML .= "<dt>Status:</dt><dd>$status</dd>";
        $alarmstufe = $einsatz['einsatz']['alarmstufe'];
        $einsatzHTML .= "<dt>Alarmstufe:</dt><dd>$alarmstufe</dd>";
        $einsatzHTML .= "</dl>";

        $einsatzHTML .= '<ul>';
        foreach ($einsatz['einsatz']['feuerwehrenarray'] as $feuerwehr) {
            $feuerwehrname = $feuerwehr['fwname'];
            $einsatzHTML .= "<li>$feuerwehrname</li>";
        }
        $einsatzHTML .= '</ul>';
        $einsatzHTML .= "</section>";
    }
}
echo json_encode(['selectHTML' => $selectHTML, 'einsatzHTML' => $einsatzHTML],
    JSON_PRETTY_PRINT);

Dann kannst Du mit CSS im head-Bereich die Farben zuweisen:
Code:
<head>
    <meta charset="UTF-8">
    <title>Einsatzdaten</title>
    <style>
        section.PERSON {
            border: 2px solid red;
        }

        section.TEE {
            border: 2px solid orange;
        }
        /* usw. */
    </style>
</head>
 
Werbung:
Übrigens: Das font-Tag gibt es nicht mehr, müsste man durch ein span mit CSS ersetzen. Ist aber erst Mal nicht so vordringlich.
 

Neueste Beiträge

Zurück
Oben