2015-12-03 21 views
0

我試圖修改別人創建的一些代碼,但由於缺乏太多的php經驗,特別是因爲它處理在drupal網站上的字段中輸入的日期,所以我很困難。使用php和drupal檢查日期

目前,php正在檢查是否有任何博客文章($ event_items)在drupal界面中創建並相應地運行。如果event_item帖子的開始日期是將來,我想要發生的事情是在網站上顯示。如果不是,則event_item帖子不會顯示,如果事件未來將顯示一條消息。

目前,如果將來沒有event_items,則沒有任何帖子會顯示在網站上,但是由於帖子仍然存檔在drupal界面中,所以郵件不會顯示。

我所做的所有嘗試都必須編輯代碼,但它已經解決了這個問題,但是排除了頁面上的某些其他功能,或者導致消息顯示在過去的每個event_item帖子中。

下面是相關的代碼:

<?php 
unset($content['field_events_event_items']['#prefix']); 
unset($content['field_events_event_items']['#suffix']); 
$all_events = array(); 
$event_items = field_get_items('node', $node, 'field_events_event_items'); 
    for ($i = 0; $i < count($event_items); $i++) { 
     $value = field_view_value('node', $node, 'field_events_event_items', $event_items[$i]); 
     $field_collection = $value['entity']['field_collection_item'][key($value['entity']['field_collection_item'])]; 
     $start_time[] = $field_collection['field_event_date_time']['#items'][0]['value']; 
     if (date('Y-m-d 00:00:00', strtotime($field_collection['field_event_date_time']['#items'][0]['value'])) >= date('Y-m-d H:i:s')) { 
      $all_events[date('Y-m-d H:i:s', strtotime($field_collection['field_event_date_time']['#items'][0]['value']))][] = $field_collection; 
     } 
    } 
if (isset($event_items[0])) { 
?> 
    <div class="panel-group" id="event-listings" role="tablist" aria-multiselectable="true"> 
<?php 

    ksort($all_events); 
    $prev_date = ''; 
    foreach ($all_events as $date => $date_events) { 
     if (date('F Y', strtotime($date)) != $prev_date) { 
?> 
    <h3 class="filter-group-heading"><?=(date('Y') == date('Y', strtotime($date)) ? date('F', strtotime($date)) : date('F Y', strtotime($date)))?></h3> 
<?php 
     } 
     foreach ($date_events as $i => $date_event) { 
      print render($date_event); 
     } 
     $prev_date = date('F Y', strtotime($date));   
    } 
?> 
     </div> 
<?php 
} else { 
?>  
     <div> 
       <p>Sorry, there are no scheduled events coming up.</p> 
     </div> 
<?php 
} 
?> 

在正確的方向上的任何輕推,將不勝感激。

回答

1

這裏的主要問題似乎是if (isset($event_items[0])) {行。嘗試更改爲if ($all_events) {

下面是一個清理版本,其中包含更多描述性變量名稱以及更少的代碼重複,您可以檢查是否需要某些靈感。

<?php 
unset($content['field_events_event_items']['#prefix']); 
unset($content['field_events_event_items']['#suffix']); 

$timeFormat     = 'Y-m-d H:i:s'; 
$eventsWithFutureStartDates = array(); 
$allEventsUnfilteredByDate = field_get_items('node', $node, 'field_events_event_items'); 

for ($i = 0; $i < count($allEventsUnfilteredByDate); $i++) { 
    $value = field_view_value('node', $node, 'field_events_event_items', $allEventsUnfilteredByDate[$i]); 

    $field_collection = $value['entity']['field_collection_item'][key($value['entity']['field_collection_item'])]; 

    $eventDateTime   = $field_collection['field_event_date_time']['#items'][0]['value']; 
    $eventDateTimeUnix  = strtotime($eventDateTime); 
    $eventDateTimeMidnight = date('Y-m-d 00:00:00', $eventDateTimeUnix); 
    $itemIsInFuture  = ($eventDateTimeMidnight >= date($timeFormat)); 

    if ($itemIsInFuture) { 
     $eventsWithFutureStartDates[date($timeFormat, $eventDateTimeUnix)][] = $field_collection; 
    } 
} 

if ($eventsWithFutureStartDates) { 
    ?> 
    <div class="panel-group" id="event-listings" role="tablist" aria-multiselectable="true"> 
     <?php 

     ksort($eventsWithFutureStartDates); 
     $prev_date = ''; 
     foreach ($eventsWithFutureStartDates as $date => $date_events) { 
      if (date('F Y', strtotime($date)) != $prev_date) { 
       ?> 
       <h3 class="filter-group-heading"><?=(date('Y') == date('Y', strtotime($date)) ? date('F', strtotime($date)) : date('F Y', strtotime($date)))?></h3> 
       <?php 
      } 
      foreach ($date_events as $i => $date_event) { 
       print render($date_event); 
      } 
      $prev_date = date('F Y', strtotime($date)); 
     } 
     ?> 
    </div> 
    <?php 
} else { 
    ?> 
    <div> 
     <p>Sorry, there are no scheduled events coming up.</p> 
    </div> 
    <?php 
} 
+0

Nate,非常感謝。這極大地澄清了事情......顯然使用strtotime來獲取unix時間戳是我並不十分清楚的。我對「if itemIsInFuture」條件發生了什麼感到困惑。是這樣的概念:「如果數組項目在將來,將它放在futureEvents數組中,它將成爲新的field_collection數組。」這是正確的球場嗎?它基本上從field_collection中過濾掉所有過去的事件?無論如何,如果你能清楚這一點,我會更加欣賞,但我再次非常感謝你的迴應。 –

+1

是的,你基本上是對的。並且要清楚:我提供的版本在功能上與您發佈的代碼相同(除了我建議的單行更改外)。以下是我如何理解(新)代碼的邏輯: (1)獲取所有事件並將它們存儲在'$ allEventsUnfilteredByDate'數組中。 (2)迭代每一個,並確定它的日期是否在未來。如果是,請將它添加到'$ eventsWithFutureStartDates'數組中。 (3)一旦我們完成了'for'循環,我們可以忽略'$ allEventsUnfilteredByDate'數組。 (4)是否有未來的事件? – Nate

+0

(4a)是:打印每一個,並確保它們出現在正確的日期標題下方。請注意,當我們正在執行此迭代時(在第二個for循環中),原先在第一個循環中保存爲「$ field_collection」的數據現在再次可用作$ date_event變量。 (4b)否:顯示「對不起,沒有預定的事件發生。」 – Nate