I have problems to get a date range with php simpleXML.
So my XML structure looks like this:
<events>
<event_data>
<id>1</id>
<startdate realdate="2013-08-06">1375740000</startdate>
<enddate realdate="2013-08-13">1376344800</enddate>
</event_data>
<event_data>
<id>2</id>
<startdate realdate="2013-08-10">1376085600</startdate>
<enddate realdate="2013-08-17">1376690400</enddate>
<event_data>
<event_data>
<id>3</id>
<startdate realdate="2013-08-17">1376690400</startdate>
<enddate realdate="2013-08-24">1377295200</enddate>
</event_data>
<event_data>
<id>4</id>
<startdate realdate="2013-08-24">1377295200</startdate>
<enddate realdate="2013-09-07">1378504800</enddate>
<event_data>
<event_data>
<id>5</id>
<startdate realdate="2013-08-25">1377381600</startdate>
<enddate realdate="2013-09-08">1378591200</enddate>
</event_data>
<event_data>
<id>6</id>
<startdate realdate="2013-09-15">1379196000</startdate>
<enddate realdate="2013-09-23">1379887200</enddate>
<event_data>
<event_data>
<id>7</id>
<startdate realdate="2013-10-26">1382738400</startdate>
<enddate realdate="2013-11-02">1383346800</enddate>
</event_data>
<event_data>
<id>8</id>
<startdate realdate="2013-11-10">1384038000</startdate>
<enddate realdate="2013-11-15">1384470000</enddate>
<event_data>
<event_data>
<id>9</id>
<startdate realdate="2014-01-11">1389394800</startdate>
<enddate realdate="2014-01-18">1389999600</enddate>
</event_data>
<event_data>
<id>10</id>
<startdate realdate="2014-01-19">1390086000</startdate>
<enddate realdate="2014-01-24">1390518000</enddate>
<event_data>
</events>
and much more entries like that with different start and end dates.
my php script looks like this:
<form action="" method="post">
<div id="slider-range"></div>
<input type="text" name="startdate" style="margin:40px 0 0">
<input type="text" name="enddate" style="margin:40px 0 0">
<input type="submit" name="submitClub" value="Submit" />
</form>
<?php
?>
<div id="eventList">
<?php
$sxe = simplexml_load_file('events.xml');
if($sxe) {
if(isset($_POST['submitClub'])) {
$varStart = $_POST['startdate'];
$varEnd = $_POST['enddate'];
if($varStart) {
foreach($sxe->xpath('//event_data') as $item) {
$row = simplexml_load_string($item->asXML());
$start = strtotime($varStart);
$end = strtotime($varEnd);
$v = $row->xpath('//startdate[. ="' . $start . '"]');
$z = $row->xpath('//enddate[. ="' . $end . '"]');
while($v <= $z){
?>
<div class="item <?php echo $item->categoryid ?> clearfix">
<div class="left">
<div class="header_data">
<h2><?php echo $item->name ?></h2>
<div class="date"><?php
$startdate = $item->startdate->attributes()->realdate;
$enddate = $item->enddate->attributes()->realdate;
echo date("d.m.Y", strtotime($startdate)) . ' - ' . date("d.m.Y", strtotime($enddate));
?></div>
<div class="club"><?php echo $item->club ?></div>
<div class="theme"><?php echo $item->theme ?></div>
</div>
</div>
</div>
<?php $start = $start + 86400;
$v = $row->xpath('//startdate[. ="' . $start . '"]');
}
}
} else {
echo 'Keine Events';
}
}
} else {
echo '<p>Die Datei konnte nicht geöffnet werden</p>';
}
?>
</div>
So if a user choose in the slider-range the startdate as August 10, 2013 and as an enddate September 12, 2013 the follwing events should be displayed:
<events>
<event_data>
<id>1</id>
<startdate realdate="2013-08-06">1375740000</startdate>
<enddate realdate="2013-08-13">1376344800</enddate>
</event_data>
<event_data>
<id>2</id>
<startdate realdate="2013-08-10">1376085600</startdate>
<enddate realdate="2013-08-17">1376690400</enddate>
<event_data>
<event_data>
<id>3</id>
<startdate realdate="2013-08-17">1376690400</startdate>
<enddate realdate="2013-08-24">1377295200</enddate>
</event_data>
<event_data>
<id>4</id>
<startdate realdate="2013-08-24">1377295200</startdate>
<enddate realdate="2013-09-07">1378504800</enddate>
<event_data>
<event_data>
<id>5</id>
<startdate realdate="2013-08-25">1377381600</startdate>
<enddate realdate="2013-09-08">1378591200</enddate>
</event_data>
The start and enddate is dynamic and not static, so the user can choose also other start and end dates.
So if a user choose a date range between December 24, 2013 and July 15, 2014 these evenets should be displayed:
<event_data>
<id>9</id>
<startdate realdate="2014-01-11">1389394800</startdate>
<enddate realdate="2014-01-18">1389999600</enddate>
</event_data>
<event_data>
<id>10</id>
<startdate realdate="2014-01-19">1390086000</startdate>
<enddate realdate="2014-01-24">1390518000</enddate>
<event_data>
I hope this clarifys what I need.
Maybe someone can help or give me a hint.
It's a bit tricky to get the XPath right but this should do it:
$events = simplexml_load_file('events.xml');
$xpath = sprintf(
'/events/event_data[
(%1$d >= startdate and %2$d <= enddate)
or
(%1$d <= enddate and %2$d >= startdate)
]',
strtotime('December 24, 2013'),
strtotime('July 15, 2014')
);
var_dump($events->xpath($xpath));
This selects an <event_data>
element when (the user supplied startdate is after or on the event startdate and the user supplied enddate is before or on the event enddate) or (the user supplied enddate is before or on the end date and the startdate is on or after the event startdate).
Demos: http://eval.in/42811 and http://eval.in/42812