2009-06-10 10 views
0

Dies ist Teil einer Ereignisseite, die nach Datum gefiltert werden kann (mithilfe von vordefinierten Datumsbereichen oder einer Datumsauswahl).Wie umgestalten diese Bedingung, um Wiederholungen zu vermeiden?

Ich möchte vermeiden, die gesamte foreach ($days as $day_number)... usw. Schleife für jede Bedingung zu wiederholen.

Ich denke, dass ganze Schleife zu einer Funktion verschoben werden konnte, aber ich bin mir nicht sicher, wie man es implementiert.

<?php 

// open the db connection 
$db = new wpdb('user', 'pass', 'db', 'server'); 


// $today = date('Y-m-d'); 
$today = '2009-06-21'; 
$tomorrow = date('Y-m-d', mktime(0, 0, 0, date('m'), date('d')+1, date('Y'))); 
$seven_days_ahead = date('Y-m-d', mktime(0, 0, 0, date('m'), date('d')+6, date('Y'))); 
$thirty_days_ahead = date('Y-m-d', mktime(0, 0, 0, date('m'), date('d')+29, date('Y'))); 


echo '<div class="column first">'; 


if (! empty($_REQUEST['date_range']))  
{ 
    // user has chosen a date/range, show matching events 


    $date_range = mysql_real_escape_string($_REQUEST['date_range']); 


    switch($date_range) 
    { 
     case 'all': 

      // code here 

      break; 

     case 'next_7_days': 

      // code here 

      break; 

     case 'next_30_days': 

      // code here 

      break; 

     default: 

      // code here 

    } 


} 
else 
{ 
    // no date selected, show todays events 

    $days = convert_date_to_day_number($today); 

    foreach ($days as $day_number) 
    { 
     $where = sprintf('WHERE e.day_id = %s', $day_number); 

     $events = get_events($where); 

     if ($events) 
     { 
      echo '<table class="results">'; 

      render_day($day_number); 

      foreach ($events as $event) 
      { 
       render_event($event); 
      } 

      echo '</table>'; 
     } 
     else 
     { 
      echo 'No events';        
     } 
    } 

} 

echo '</div> <!--/column-->'; 





function convert_date_to_day_number($date) 
{ 
    global $db; 

    $sql = "SELECT day_number FROM days WHERE day_date = '$date'"; 

    $day_numbers = $db->get_results($sql); 

    foreach ($day_numbers as $key => $value) 
    { 
     $day_number[] = $value->day_number; 
    } 

    return $day_number; 
} 


function get_events($where) 
{ 
    global $db; 

    $sql = "SELECT 
       e.id, 
       TIME_FORMAT(e.start_time, '%H:%i') AS start_time, 
       e.x_prod_desc AS title, 
       -- e.title_en AS title, 
       p.name_en AS place, 
       et.name_en AS type, 
       w.week_number, 
       d.day_date AS start_date 
      FROM event AS e 
      LEFT JOIN place AS p ON p.id = e.place_id 
      LEFT JOIN event_type AS et ON et.id = e.event_type_id 
      LEFT JOIN days AS d ON d.id = e.day_id 
      LEFT JOIN week AS w ON w.id = d.week_id "; 

    $sql .= $where; 

    $events = $db->get_results($sql); 

    return $events;   
} 

function render_event($event) 
{ 
    $request_uri = $_SERVER['REQUEST_URI']; 

    $output = <<<EOD 

    <tr class="week-$event->week_number"> 
     <td class="topic"></td> 
     <td class="time">$event->start_time</td> 
     <td class="summary"> 
     <a href="$request_uri&amp;event_id=$event->id">$event->title</a> 
     </td> 
     <td class="type">$event->type</td> 
     <td class="location"> 
      <span class="addr">$event->place</span> 
     </td> 
    </tr> 

EOD; 

    echo $output; 
} 


function render_day($day_number) 
{ 
    global $db; 

    $sql = "SELECT 
       d.day_number, 
       DATE_FORMAT(d.day_date, '%W %e %M %Y') AS date, 
       DATE_FORMAT(d.day_date, '%b') AS month, 
       DATE_FORMAT(d.day_date, '%e') AS day 
      FROM days AS d 
      WHERE day_number = " . $day_number; 

    $day = $db->get_results($sql); 

    $day = $day[0]; 

    $output = <<<EOD 

    <tr class="day"> 
     <th colspan="5"> 
      <em class="date"> 
       <abbr class="dtstart" title="20090605T1806Z"> 
        <span title="$day->date"> 
         <span class="month">$day->month</span> 
         <span class="day">$day->day</span> 
       </span> 
       </abbr> 
      </em> 
      $day->date 
      <span class="event-day">Day $day->day_number</span> 
     </th> 
    </tr> 

EOD; 

    echo $output; 
} 
?> 

Antwort

0
function generateEventsTable($dateStr) 
{ 
    $days = convert_date_to_day_number($today); 
    foreach ($days as $day_number) 
    { 
     $where = sprintf('WHERE e.day_id = %s', $day_number); 
     $events = get_events($where); 
     if ($events) 
     { 
      echo '<table class="results">'; 
      render_day($day_number); 
      foreach ($events as $event) 
      { 
       render_event($event); 
      } 
      echo '</table>'; 
     } 
     else 
     { 
      echo 'No events';        
     } 
    } 
} 

Nennen Sie es wie folgt aus:

generateEventsTable($today); 
2

Anstatt die Datenbank einmal Abfrage für jeden Tag, würde ich eine WHERE Aussage machen, dass alle Ereignisse für den gewünschten Datumsbereich geholt, und dann die Render-Funktion zu einer schicken, das in der Ergebnismenge durch jede Zeile Schleife und wenn der Tag anders als der vorherige ist, ruft render_day() vor dem Aufruf render_event().

switch (/* input from user */) { 
    // Build a date range here. 
    // Resulting statement would be something like: 
    // WHERE event_date >= '2009-06-10' AND event_date < '2009-06-17' 
} 

$events = get_events($filter); 
$prev_date = null; 
foreach ($events as $event) { 
    if ($event->date != $prev_date) render_day($event->date); 
    render_event($event); 
    $prev_date = $event->date; 
} 
3

Erstens kann man strtotime für relative Daten verwenden möchten:

$today = '2009-06-21'; 
$tomorrow = date('Y-m-d', strtotime('+1 day')); 
$seven_days_ahead = date('Y-m-d', strtotime('+7 days')); 
$thirty_days_ahead = date('Y-m-d', strtotime('+30 day')); 
    // or +1 month (=> calendar month) 

Zweitens Sie zwei Variablen festlegen können mit & Enddaten beginnen, dann:

$date = $start_date; // 'Y-m-d' format 
while($date <= $end_date) { 
    //code here or fill up a table with your days 
    // using $date 
    $date = date('Y-m-d', strtotime('+1day', strtotime($date))); 
} 

Immer dann, wenn Arbeits Mit Daten in PHP sollten Sie überprüfen, strtotime.

+0

+1 für den Hinweis auf strtotime –

+0

$ morgen = date ('Y-m-d', strtotime ($ heute '1 Tag).); etc ... – meleyal

0

Wow! Ich habe es gelesen!

Verwenden Sie zunächst Vorlage-Engine (wie smarty) oder eine andere Möglichkeit, Ihren Code und HTML zu teilen. Das ist eine schlechte Idee, HTML aus den Funktionen heraus wiederzugeben.

Ich bin mir nicht sicher, aber ich denke, dass die Verwendung von Unix-Timestamps in DB Ihre Datenstruktur vereinfachen könnte. Das Gleiche gilt für PHP-Code. Lesen Sie sorgfältig über date/time functions in PHP-Handbuch, ich denke, Sie werden eine Menge interessanter Dinge zu finden ...

Eigentlich, wie ich aus Ihrem Code mit Zeitstempeln und Vorlagen sehen, wird Ihren Code auf eine Zeile zum Abrufen von Daten und reduzieren Zuweisen zu Template-Engine. PHP "date()" Funktion hat bereits eine Option Woche numbe zurückzukehren, Tag-Nummer in einer Woche oder in einem Jahr etc ...

Dies ist dummy exaple was könnte Ihr Code wie folgt aussehen:

$begin = mktime(...); 
$end = mktime(...); 
$query = " 
    SELECT a,b,c 
    FROM events 
    WHERE ctime >= $begin AND ctime <= $end AND ... 
"; 
$events = array(); 
while ($fetch = fetch_here(...)) 
{ 
    $event = new MyEvent(); 
    $event->loadDBFetch($fetch); 
    array_push($events, $event); 
} 
$tplEngine->assign('events', $events); 

Sicher, das ist keine fertige Lösung, aber es scheint mir, dass Ihr Code dem ähnlich sein könnte.

+0

Ich bin nicht in der Lage, Smarty zu verwenden, es ist Teil einer Wordpress-Vorlage. Können Sie eine bessere Methode zum Rendern des HTML vorschlagen? – meleyal

Verwandte Themen