PHP, XML refresh page aan de hand van filemdate

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • dstyle_nl
  • Registratie: Juni 2002
  • Laatst online: 08-09 14:28
Hey Tweakers,

Ik ben niet echt een king als het gaat om php maar het onderstaande heb ik gemaakt. Deze leest 3 xmls uit welke ik vul aan de hand van 3 SQL queries op een database (van TOPdesk). De pagina laat een scherm zien met wijzigingen de afgelopen 3 dagen, vandaag en de komende 3 dagen.

Nou zou ik het mooi vinden als hij de inhoud refreshed aan de hand van de last modified date van de XML files. Hoe doe ik dit? Ik heb wel wat scripts gevonden, ben zelf geen pro maar krijg het helaas niet aan de praat |:(


PHP: filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>

<meta charset="utf-8">
<link rel="apple-touch-icon" sizes="76x76" href="assets/img/apple-icon.png">
<link rel="icon" type="image/png" href="assets/img/favicon.png">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<title>Wijzigingskalender</title>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=1" name="viewport">

<!--     Fonts and icons     -->
  
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">

<!-- CSS Files -->

<link href="assets/css/bootstrap.min.css" rel="stylesheet">
<link href="assets/css/material-kit.css" rel="stylesheet">
<link type="text/css" rel="stylesheet" href="assets/css/materialize.min.css"  media="screen,projection"/>
<style>

alert {
  min-width: 250px;
}

alert-primary {
  min-width: 250px;
}
</style> 

<script type="text/javascript">
tday=new Array("Zondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag","Zaterdag");
tmonth=new Array("Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December");

function GetClock(){
var d=new Date();
var dx=d.toGMTString();
dx=dx.substr(0,dx.length -3);
d.setTime(Date.parse(dx))
d.setSeconds(d.getSeconds() + <?php date_default_timezone_set('Europe/Amsterdam'); echo date('Z'); ?>);
var nday=d.getDay(),ndate=d.getDate(),nmonth=d.getMonth(),nyear=d.getYear();
if(nyear<1000) nyear+=1900;
var nhour=d.getHours(),nmin=d.getMinutes();
if(nmin<=9) nmin="0"+nmin

document.getElementById('clockbox').innerHTML=""+tday[nday]+","+ndate+" "+tmonth[nmonth]+" , "+nyear+" "+nhour+":"+nmin+"";
}

window.onload=function(){
GetClock();
setInterval(GetClock,1000);
}
</script>
</head>



<body>
<!-- Navbar will come here --><!-- end navbar -->
<div id="container"><div class="col-lg-push-9 col-lg-pul container-fluid"><h4><div id="clockbox" align="right"></div></div></h4></div>
<!-- you can use the class main-raised if you want the main area to be as a page with shadows -->
<div class="col-lg-3 container-fluid">
<div class='alert alert-toekomst'>Afgelopen 3 dagen</div>
<?php $xmlDoc = new DOMDocument();

$xmlDoc->load("items.xml");

$xmlObject = $xmlDoc->getElementsByTagName('item');

$itemCount = $xmlObject->length;

for ($i=0; $i < $itemCount; $i++){

   $wijzigingsnummer = $xmlObject->item($i)->getElementsByTagName('wijzigingsnummer')->item(0)->childNodes->item(0)->nodeValue;

   $datum = $xmlObject->item($i)->getElementsByTagName('datum')->item(0)->childNodes->item(0)->nodeValue;

   $wijzigingsomschrijving = $xmlObject->item($i)->getElementsByTagName('wijzigingsomschrijving')->item(0)->childNodes->item(0)->nodeValue;

   $datum2 = date( 'Dd', strtotime( $datum) );
   
   ECHO



  "
  
<div class='alert alert-toekomst col-xs-3 col-md-2 col-lg-3'>$datum</div>
<div class='alert alert-info col-xs-9 col-md-10 col-lg-9 truncate'> <span class='label label-default'>$wijzigingsnummer</span>
$wijzigingsomschrijving</div>
    
    

    ";
   // "Finished Item $wijzigingsnummer $datum $wijzigingsomschrijving<br/>";
}

?>
</div>
<div class="col-lg-6 container-fluid" >
<div class="alert alert-primary truncate">Vandaag&nbspstaan&nbsper&nbsp<?php 

$dom = new DOMDocument();
$dom->load("vandaag.xml");

echo $dom->getElementsByTagName('item')->length, PHP_EOL; // 6
// count all OfferNameList/OfferName elements
$xp = new DOMXPath($dom);

?>&nbspwijzigingsactiviteiten gepland</div> 


<?php $xmlDoc = new DOMDocument();

$xmlDoc->load("vandaag.xml");

$xmlObject = $xmlDoc->getElementsByTagName('item');

$itemCount = $xmlObject->length;

for ($i=0; $i < $itemCount; $i++){

   $wijzigingsnummer = $xmlObject->item($i)->getElementsByTagName('wijzigingsnummer')->item(0)->childNodes->item(0)->nodeValue;

   $datum = $xmlObject->item($i)->getElementsByTagName('datum')->item(0)->childNodes->item(0)->nodeValue;

   $wijzigingsomschrijving = $xmlObject->item($i)->getElementsByTagName('wijzigingsomschrijving')->item(0)->childNodes->item(0)->nodeValue;
   
   $tijd = $xmlObject->item($i)->getElementsByTagName('plannedstartdate')->item(0)->childNodes->item(0)->nodeValue;
   
   $activiteitsnummer = $xmlObject->item($i)->getElementsByTagName('activiteitsnummer')->item(0)->childNodes->item(0)->nodeValue;
   
   $activiteitsomschrijving = $xmlObject->item($i)->getElementsByTagName('activiteitsomschrijving')->item(0)->childNodes->item(0)->nodeValue;

   $datum2 = date( 'Dd', strtotime( $datum) );
   
   $tijd2 = date( 'H:i', strtotime( $tijd) );


   ECHO



  "
<div class='alert alert-primary-blok col-xs-3 col-md-2 col-lg-2'>$tijd2</div>
<div class='alert alert-info col-xs-9 col-md-10 col-lg-10 truncate'> <span class='label label-default'>$wijzigingsnummer</span>
<span class='label label-primary'>$activiteitsnummer</span>
$wijzigingsomschrijving</div>
    ";
   // "Finished Item $wijzigingsnummer $datum $wijzigingsomschrijving<br/>";
}

?>
</div>
</div>

<div class="col-lg-3 container-fluid">
<div class='alert alert-toekomst'>Komende 3 dagen</div>
<?php $xmlDoc = new DOMDocument();

$xmlDoc->load("toekomst.xml");

$xmlObject = $xmlDoc->getElementsByTagName('item');

$itemCount = $xmlObject->length;

for ($i=0; $i < $itemCount; $i++){

   $wijzigingsnummer = $xmlObject->item($i)->getElementsByTagName('wijzigingsnummer')->item(0)->childNodes->item(0)->nodeValue;

   $datum = $xmlObject->item($i)->getElementsByTagName('datum')->item(0)->childNodes->item(0)->nodeValue;

   $wijzigingsomschrijving = $xmlObject->item($i)->getElementsByTagName('wijzigingsomschrijving')->item(0)->childNodes->item(0)->nodeValue;

   $datum2 = date( 'Dd', strtotime( $datum) );
   
   ECHO

  "
 <div class='wrapper'> 
<div class='alert alert-toekomst col-xs-3 col-md-3 col-lg-3'>$datum</div>
<div class='alert alert-info col-xs-9 col-md-9 col-lg-9 truncate'> <span class='label label-default'>$wijzigingsnummer</span>
$wijzigingsomschrijving</div>
 </div>     
    

    ";
   // "Finished Item $wijzigingsnummer $datum $wijzigingsomschrijving<br/>";
}

?>
</div>

<script src="assets/js/jquery.min.js" type="text/javascript"></script>
<script src="assets/js/bootstrap.min.js" type="text/javascript"></script>
<script src="assets/js/material.min.js"></script><!--  Plugin for the Sliders, full documentation here: http://refreshless.com/nouislider/ -->
<script src="assets/js/nouislider.min.js" type="text/javascript"></script><!--  Plugin for the Datepicker, full documentation here: http://www.eyecon.ro/bootstrap-datepicker/ -->
<script src="assets/js/bootstrap-datepicker.js" type="text/javascript"></script><!-- Control Center for Material Kit: activating the ripples, parallax effects, scripts from the example pages etc -->
<script src="assets/js/material-kit.js" type="text/javascript"></script>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="assets/js/materialize.min.js"></script>
</body></html> 

Warzone spelen met andere tweakers? https://discord.gg/EYT3SC9


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 08-10 23:48

Ventieldopje

I'm not your pal, mate!

Moet het perse xml zijn? Op deze manier is dat lastig te onderhouden en foutgevoelig. Gebruik met xml liever Xpath, scheelt een hoop code en is beter leesbaar.

Als het uit een database komt kun je dan niet beter direct verbinding leggen of de gegevens via een webpagina verkrijgen als de database extern en niet bereikbaar is? Dan schrijf je op die server een simpel script dat de xml dat je nu wegschrijft naar een bestand gewoon naar de browser stuurt.

Als verversen een issue is kun je de datum/tijd van laatste aanpassing ook in de data opnemen.

Heb je ook al eens gekeken naar JSON als alternatief? Veel minder overhead en makkelijker te parsen met json_decode :)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • dstyle_nl
  • Registratie: Juni 2002
  • Laatst online: 08-09 14:28
Bedankt voor je antwoord, ik ben geen expert op dit gebied en kan meer code lezen dan zelf schrijven wat je ziet is ook dus wat geknutsel met voorgebrouwen scripts en eigen ingevingen door elkaar heen. Het is overigens een SQL database dus die is niet te raadplegen (en lijkt me ook niet de bedoeling) middels php.

het hoeft niet optimaal te zijn, als het maar doet wat moet.. het is immers ook voor intern.

Ik heb geprobeerd onder staand stuk te verwerken in mijn script dit kreeg ik echter niet aan de praat.

PHP: proxy.php
1
2
3
4
5
6
7
8
9
10
11
<?php
        if (!empty($_GET) && !empty($_GET['check'])) {
            $previouslyChecked = $_GET['check'];

            if (filemtime("filename.txt") > $previouslyChecked) {
               echo 1;
            } else {
               echo 0;
            }
            die();
        } ?>


PHP: script.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<html>
<head>
    <script type="text/javascript" src="jquery.min.js"></script>
</head>

<body>
<?php
    include('filename.txt');
    $lastModified = filemtime("filename.txt");
?>
    <input type="hidden" id="loadedAt" value="<?php echo $lastModified; ?>"/>


     <script type="text/javascript">

        function reloadPage(){
           console.log("within reload");
           window.location.reload();
        }

        function checkFile(){
            console.log("checkfile");
            jQuery.ajax({
                type: "GET",
                url: "proxy.php",
                data: {check: jQuery("#loadedAt").val()},
                success: function(data){ 
                    if (data == 1) {    
                        console.log("reload called");
                        reloadPage(); 
                    }
                    setTimeout(checkFile, 5000);
                }
            });
        };

        jQuery(document).ready(function(){
            console.log("checkfile called");
            checkFile();
        });
    </script>

</body>
</html>

Warzone spelen met andere tweakers? https://discord.gg/EYT3SC9


Acties:
  • 0 Henk 'm!

  • stijn1309
  • Registratie: December 2007
  • Laatst online: 07:29
Eerste wat je moet oplossen is hoe je met je script gaat bepalen dat iets een nieuwere datum heeft?
Om dit te kunnen moeten we ergens de datum opslaan/bewaren van de vorige import.

Dit kan je doen door de XML uit te breiden of simpel weg de datum weg te schrijven naar een TXT-bestand.

code:
1
2
3
4
5
6
7
8
9
10
<?php
if($datumintekstbestand < filemtime("filename.txt"))
{
    refresh data;
}
else
{
  doe niets;
}
?>

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 08-10 23:48

Ventieldopje

I'm not your pal, mate!

dstyle_nl schreef op vrijdag 05 augustus 2016 @ 13:35:
[...]

Het is overigens een SQL database dus die is niet te raadplegen (en lijkt me ook niet de bedoeling) middels php.

[...]
Què? Je bedoeld dan denk ik dat de SQL database niet extern toegankelijk is en het script dus op een andere server draait dan waar de database op draait? Met PHP is het prima mogelijk om met databases te werken, hoe denk je dat al die websites werken? ;)

Je script rommelt nog aan alle kanten (zoals een include van je tekstbestand?). Daardoor lijkt het mij beter als je even een pauze inlast en eerst eens op papier gaat zetten wat precies de structuur wordt (ook voor ons).

Waar is de SQL database (en wat voor type, MySQL?), waar draait het script (zelfde server als database of een andere?), is een XML export echt noodzaak, is het echt van belang dat hij alleen refreshed als er nieuwe data is (ja als bijv. de queries lang duren of er veel berekeningen gedaan moeten worden).

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • dstyle_nl
  • Registratie: Juni 2002
  • Laatst online: 08-09 14:28
Ventieldopje uiteraard werkt php met databases hahaha. Het is echter een MSSQL database. Die op een aparte server draait. Dus geen MYsql welke voor web toepassing is gemaakt ;)

Warzone spelen met andere tweakers? https://discord.gg/EYT3SC9


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
PHP kan ook prima met MSSQL verbinden (mits je toegang hebt uiteraard) ;)
dstyle_nl schreef op vrijdag 05 augustus 2016 @ 15:00:
Dus geen MYsql welke voor web toepassing is gemaakt ;)
Klok/klepel :X
MySQL is geenszins meer/minder geschikt voor "web toepassing" (whatever that may be) dan andere RDBMS'en. Dat je PHP vaak icm MySQL gebruikt ziet worden wil niet zeggen dat 't "meer geschikt" is; het is gewoon vaak onderdeel van de veelvoorkomende LAMP-stack (Linux-Apache-MySQL-PHP).

Enniehoe: Waar hoort mijn topic?
WEB >> PRG

[ Voor 80% gewijzigd door RobIII op 05-08-2016 15:46 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • stijn1309
  • Registratie: December 2007
  • Laatst online: 07:29
Grappige is ook nog dat het Topdesk applicatie betreft... die is toch ook webbased?!?

Maar helemaal eens met wat Roblll zegt. Eerst uitdenken, dan opnieuw bouwen.

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 08-10 23:48

Ventieldopje

I'm not your pal, mate!

dstyle_nl schreef op vrijdag 05 augustus 2016 @ 15:00:
Ventieldopje uiteraard werkt php met databases hahaha. Het is echter een MSSQL database. Die op een aparte server draait. Dus geen MYsql welke voor web toepassing is gemaakt ;)
Your point being? :/ PDO MSSQL bestaat dus niet volgens jou? :X

Zoals RobIII aangeeft is het natuurlijk wel van belang dat je toegang hebt, zeker als het op een externe server draait. Het is vaak standaard alleen toegestaan om verbinding te maken vanaf de zelfde PC. Je dient dan een beperkte gebruiker toegang te geven (bij voorkeur vanaf een vast IP) om toegang te krijgen. Dan kun je er met PHP ook gewoon direct bij ipv. met een XML bestand.

Daarom dus: eerst plannen, dan bouwen :)

[ Voor 34% gewijzigd door Ventieldopje op 05-08-2016 23:28 ]

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • SerealKiller
  • Registratie: Februari 2002
  • Laatst online: 14:03

SerealKiller

Fas est et ab hoste doceri

Even buiten het hele script:

Bij de wijzigingsbeheer module is er een functionaliteit ( wijzigingskalender) deze geeft per dag aan welke wijzigingen afgerond dienen te zijn. Is dit te summier:

Maak 3 selecties aan waarbij gesorteerd wordt op de implementatiedatum. Relatief dus dat TOPdesk kijkt naar "vanaf nu 3 dagen geleden" "vandaag" en " x dagen in de toekomst".

Wil je dit tonen op een scherm, dan kun je het selectieoverzicht tonen via de direct URL. En er zijn genoeg plugins in browsers om een browser te refreshen. En omdat je elke keer de directe URL aanroept ververst het lijstje zich.

Ik weet niet of dit voldoet aan jouw eisen, maar dit is een manier binnen de standaard functionaliteit om overzichten aan te roepen.

War is the only proper school of the surgeon.

Pagina: 1