Список событий со списком временных меток, сгруппированных по часам в табличном представлении, в PHP. - PullRequest
2 голосов
/ 08 октября 2010

Во время рефакторинга я ищу оптимизированный алгоритм для расписания (календаря) в PHP.

У меня есть список событий, у которых есть список временных отметок.Это должно быть представлено в табличной форме.Текущий код работает, но имеет а) довольно причуды и б) очень негибкий.Я ищу рефакторинг этой части и ищу информацию об оптимизированных способах.

Пример здесь , обратите внимание на заголовок таблицы с часами.И время в течение этого часа сгруппировано в этом столбце.Одно событие, имеющее две отметки времени за один час, может быть проигнорировано (может произойти только теоретически, согласно техническим документам)

Таблица построена с помощью Drupals theme_table () , которую я могустроить из любого массива, имея массивы для каждой строки .часть Drupal, однако, здесь не представляет большого интереса:)

Текущий код (фрагменты):

<?php
//inside function that builds the content for the page linked to above:
$this_morning = _playdates_get_start_of_day_with($timestamp);
$this_night = _playdates_get_end_of_day_with($timestamp);
$nodes = _playdates_load_all_in_range($types, $this_morning, $this_night);
usort($nodes, '_playdates_cmp_titles');
//we now have a list of "nodes", being the events listed in the first column, which have
//  a list of playdates, the timestamps. $node->nid is a unique id for each event.  
foreach ($nodes as $node) {
  $times = $dates = array();
  if (is_array($node->starts_at)) {
    foreach ($node->starts_at as $starts_at) {
      $date = getdate($starts_at);
      $dates[$starts_at] = $date;
      if (!isset($active) && ($timestamp <= ($date[0] + $timezone))) {
        $active = _playdates_get_idx_hour($date);
      }
    }
    $times = _playdates_group_by_hour($dates);
    foreach ($times as $key => $value) {
      $header_times[$key] = $key;
    }
    $header = array_merge($header, $header_times);
    $entries[$node->nid] = $node;
    $entries[$node->nid]->times = $times;
  }
}

function _playdates_group_by_hour($timestamps, $playdate = NULL) {
  $indexes = array();
  foreach ($timestamps as $key => $value) {
    $indexes[_playdates_get_idx_hour($value)] = theme('playdates_format_time', $value, $playdate);
  }
  ksort($indexes);
  return $indexes;
}   

function _playdates_get_idx_hour($date) {
  return playdates_format_date($date[0], 'custom', 'H:00');
}

Итак, шаблон: захватить (и упорядочить) список событий.Зацикливайтесь на этом, для каждого события зацикливайтесь на временных метках и создавайте массив, ключом которого является час временной метки (сгруппируйте по часам).

Существуют ли лучшие образцы?Есть ли более общий способ добиться этого?Любые ключевые слова, которые я могу найти (я понятия не имею, как будет называться такой шаблон)?

пример набора данных Узлы $ (удаленные ненужные данные) выглядят так:

array(15) {
  [1]=>
  object(stdClass)#48 (6) {
    ["title"]=> 
    string(19) "Cosa voglio di più"
    ["type"]=>
    string(4) "film"
    ["nid"]=>
    string(4) "2823"
    ["premiere"]=>
    object(stdClass)#49 (1) {
      ["starts_at"]=>
      string(10) "1286550000"
    }
    ["starts_at"]=>
    array(2) {
      [0]=>
      string(10) "1286550000"
      [1]=>
      string(10) "1286559000"
    }
    ["ends_at"]=>
    array(2) {
      [0]=>
      string(1) "0"
      [1]=>
      string(1) "0"
    }
  }
  [12]=>
  object(stdClass)#46 (6) {
    ["title"]=>
    string(5) "Tirza"
    ["type"]=>
    string(4) "film"
    ["nid"]=>
    string(4) "2813"
    ["premiere"]=>
    object(stdClass)#47 (1) {
      ["starts_at"]=>
      string(10) "1286550000"
    }
    ["starts_at"]=>
    array(3) {
      [0]=>
      string(10) "1286550000"
      [1]=>
      string(10) "1286558100"
      [2]=>
      string(10) "1286566200"
    }
    ["ends_at"]=>
    array(3) {
      [0]=>
      string(1) "0"
      [1]=>
      string(1) "0"
      [2]=>
      string(1) "0"
    }
  }
  [14]=>
  object(stdClass)#36 (6) {
    ["title"]=>
    string(47) "Vision - aus dem Leben der Hildegard von Bingen"
    ["type"]=>
    string(4) "film"
    ["nid"]=>
    string(4) "2783"
    ["premiere"]=>
    object(stdClass)#39 (1) {
      ["starts_at"]=>
      string(10) "1286541900"
    }
    ["starts_at"]=>
    array(1) {
      [0]=>
      string(10) "1286541900"
    }
    ["ends_at"]=>
    array(1) {
      [0]=>
      string(1) "0"
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 15 ноября 2010

Вы пробовали модуль " Календарь ".Модуль Календарь можно использовать для отображения событий в виде календаря.Имеет виды, таксономию и поддержку cck.Настройка также очень проста.

Я предлагаю найти добавленные модули, прежде чем думать о нашем скриптеМы можем думать о нашем скрипте, только если нет добавленных модулей, которые удовлетворяют нашим требованиям.

0 голосов
/ 03 ноября 2010

Я совсем не знаком с Drupal, поэтому я собираюсь сделать предложение, основанное на моем собственном подходе к вашему запросу, о рефакторинге отображения списка названий фильмов в одном столбце и времени начала всоответствующий столбец времени.

Вы начинаете с массива фильмов (или «фильмов»), содержащих названия фильмов и метки времени начала.Я предполагаю, что где-то вы можете получить или создать массив часов для заголовка столбца.

В приведенном ниже примере игнорируется, что вы имеете дело с объектом или что объект содержит массивы, только для демонстрации альтернативного подхода .Вместо того, чтобы выполнять все форматирование и сортировку, которые вы выполняете, этот шаблон выполняет итерацию по каждому фильму и использует второй foreach для итерации по столбцам часа и проверяет, соответствует ли время фильма часовому времени.

<?php foreach($movie_array as $movie){
    echo '<td>'.$movie['title'].'</td>';
    foreach($hours as $hour){
        if(date('H',$movie['starts_at']) == date('H',$hour)){
            echo '<td>'.date('H:i',$movie['starts_at']).'</td>';
        }//endif
        else{
            echo '<td></td>';
        }//endelse
    }//endforeach
 }//endforeach
?>

Я пропустил настройку таблицы, и, конечно, вы можете заменить мои html-сущности тем, что предпочитаете настроить таблицу.

Я думаю, что это жизнеспособный шаблон, который, кажется, упрощает логикуВаш оригинальный шаблон и остается гибким.Надеюсь, я не понял и не упустил критическую часть вашей проблемы.

...