Форматирование событий в соответствии со временем начала


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

На этой картинке это не показано, но представьте, что слева от 25-го числа есть колонка с часами (с 8 утра до 11 вечера или около того). Если событие начинается... скажем, в 1 час дня, я бы хотел, чтобы оно отображалось где-то в середине страницы. Если событие начинается в 8:30 утра, оно должно показывать между 8 и 9 утра.

events

Думаю, я мог бы сделать это с помощью таблиц, но мне было интересно, есть ли другой способ. Возможно ли это с помощью простого html/css, возможно, с помощью Javascript? Есть какие-нибудь предложения о том, как лучше всего этого добиться? Если я использую таблицу, я все еще не уверен, как лучше всего это сделать. Сотовый каждые тридцать минут? У меня есть доступ к времени начала и окончания каждого события с моей точки зрения. Массив событий (в данном примере 25-й) выглядит следующим образом это:

Array

[1] => Array
    (
        [title] => Ethiek
        [description] => Ethiek: Opdracht 1
        [time_start] => 11:30:00
        [time_end] => 12:00:00
    )

[2] => Array
    (
        [title] => Project Management
        [description] => Test: Project Management
        [time_start] => 15:00:00
        [time_end] => 16:00:00
    )

[event_count] => 2

Я ценю любой совет, который вы можете мне дать. Большое спасибо!

РЕДАКТИРОВАТЬ: Начал щедрую награду за это, потому что я все еще застрял, и я был бы признателен за некоторые отзывы.

ОБНОВЛЕНИЕ:

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

        foreach($details[0] as $key => $detail)
    {
        echo "<div class='grid'>";
        $header = "<p class='detail_header'>";
        $header .= ucfirst($dates[0][$key]['name']) . ", " . $key . " " . $init['curr_month_name'];
        $header .= "<img src='" . base_url() . "assets/images/create_event.png' alt='Plan iets'></p>";

        echo $header;

        for($i = 1; $i <= $details[0][$key]['event_count']; $i++)
        {
            echo "<div class='event " . $details[0][$key][$i]['type'] . "'>";
                echo "<p class='event_title'>" . $details[0][$key][$i]['title'] . "</p>";
                echo $details[0][$key][$i]['description'];
            echo "</div>";
        }
        echo "</div>";  

    }

Это немного запутанно, не говоря уже о том, что у меня есть тот же код в другой раз, чтобы исправить некоторые исключения. Но что еще более важно.. Я чувствую, что эти циклы не позволяют мне вносить в него много изменений. Я попытался добавить два div для AM и PM, чтобы разделить события на блоки до полудня и после полудня, а затем просто отобразить время события (чтобы избежать необходимости работать с тысячью блоков по 15 минут). Но да.. Это не сработало, так как это было бы поставьте пару "PM" дивов, если днем будет более одного события.

У меня возникает соблазн просто оставить все как есть на данный момент и просто отобразить время начала/окончания в разделах событий.. пока я не придумаю лучший способ считывать их из массива и отображать.

Любая помощь/предложения приветствуются. Спасибо.

Author: cabaret, 2011-04-25

6 answers

На самом деле я тоже делаю это прямо сейчас. Мое решение состояло в том, чтобы пойти с 960.gs- как дивы.

Во-первых, я определяю ряд констант: время начала отображения, время окончания отображения, столбцы в час, общее количество столбцов. В случае моего приложения эти переменные настраиваются пользователем.

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

Теперь, 960.gs концепция. Основой для сетки является знание того, что у вас есть X количество места для отображения вашего контента...с 960 это 960 пикселей. У меня больше обычаев, но это обеспечивает концепцию. Вы можете разделить это на довольно много чисел, что станет основой для разделения сетки. Используя этот подход, я могу легко определить столбец от grid_1 до grid_4, и он будет иметь ширину, равную соразмерный процент от общей ширины (т. Е. При макете из 16 столбцов, делающий 4 столбца, охватывал бы 25 %) Он совместим с несколькими браузерами и не требует явного количества четких разделителей. Вам просто нужно сложить числа так, чтобы они соответствовали количеству столбцов, с которыми вы хотите работать.

Теперь я начну с математических расчетов, чтобы выяснить, сколько времени представляет каждый столбец. Я собираю каждый день, используя цикл foreach: я начинаю с часа времени начала отображения и увеличиваю его. Если время начала события равно приращению, я запускаю div, стилизованный соответствующим образом в соответствии с моими критериями раскраски. Аналогично, если мое время окончания

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

Таблицы определенно облегчают это (версия 1 была таблицами), но это можно сделать в любом случае, если у вас хватит терпения.

 3
Author: bpeterson76, 2011-04-27 19:37:06

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

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

 3
Author: HopefullyHelpful, 2011-04-25 15:07:01

Вы могли бы использовать подход css и абсолютное позиционирование записей вашего календаря. Затем вам понадобится класс css для каждого временного интервала. Просто чтобы дать некоторую ориентацию:

.timeslot_0 {
 position: absolute;
 top: 0px;
}
.timeslot_1 {
 position: absolute;
 top: 50px;
}
.timeslot_2 {
 position: absolute;
 top: 100px;
}

<div id="calendar">
   <div class="day">
     <div class="entry timeslot_0>Schedule Enty</div>
     <div class="entry timeslot_2>Schedule Enty</div>
   </day>
   <div class="day">
     <div class="entry timeslot_1>Schedule Enty</div>
   </day>
   <div class="day"></day>
   <div class="day"></day>
   <div class="day"></day>
</div>

Это та же идея, что и bedind 960grid

В качестве альтернативы вы могли бы использовать процент для позиции сверху, чтобы в 8 утра было 8%, а в 6 вечера - 100%. Это немного сложно в зависимости от доступного размера и прочего, но может сработать. Я еще не пробовал. Просто застрял у меня в голове, как еще одна возможность.

 2
Author: pintxo, 2011-04-27 15:39:26

Я бы посоветовал не использовать таблицы, а использовать Javascript и CSS.

  1. Используйте Javascript, чтобы получить ширину фона календаря: например, 800 пикселей.
  2. Разделите эту ширину, чтобы разместить 30-минутные слоты в течение 24 часов; 800 / (24 * 2) = 16 пиксели
    • 24 * 2 (48) это количество 30-минутных слотов за 24 часа.
    • 16 пикселей - это то, сколько места у вас есть за 30 минут.
  3. Для каждого события, которое у вас есть, возьмите время начала в блоках по 30 минут и умножьте его на 16 пикселей, чтобы получить его положение с левой стороны.
    • Для события, которое начинается в 2:30 (блоки 5x30 минут), 5*16 = 80 пикселей слева
    • Для события, которое начинается в 12:00 (блоки 24x30 минут), 24 *16 = 384 пикселя слева
    • Для события, которое начинается в 14:30 (блоки 29x30 минут), 29*16 = 464 пикселя слева

Я предлагаю самый простой способ реализовать это с помощью jQuery;

var usableWidth = $('div.calendar').width();

eventsCollection.each(function(singleEvent) {
    $(singleEvent).width = (getStartTimeInMinutes(singleEvent) / 30) * (24 * 2); 

});

Для этого вам потребуется представить свои события в формате JSON (нотация объектов Javascript). Используя php, это легко сделать с помощью json_encode().

Этот метод может быть немного сложным для понимания на первый взгляд, но он сохраняет вашу разметку (HTML) очень чистой и очень хорошо работает с экраном любого размера. Самое главное, поскольку ваши события будут представлены в виде объектов Javascript, это даст вам действительно отличную отправную точку для создания действительно богатого приложения Ajax.

 2
Author: xconspirisist, 2011-04-30 22:42:32

Рад слышать, что вы делаете успехи. Таблицы по-прежнему кажутся мне лучшим решением для этого. Подумайте об этом: - вы можете изменить ширину, высоту и т. Д., Чтобы установить их в виде сетки, как вы хотите. - вы точно знаете структуру, поэтому пробег по таблице - это простой код цикла

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

Кстати, введите URL-адрес работающей версии для нас, когда закончите.

 1
Author: boisvert, 2011-04-29 10:58:19

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

Теперь таблицы довольно жесткие, так что простите за грубость этого: P

-------------------------------------------------------------------------------------------
                 hrs | mins |total mins|        
day start time | 10  |  0   |600       |running time in mins        
day end time   | 23  | 30   |1410      |810     
item start time| 13  |  0   |780       |running time | distance to cover | starting point
item end time  | 16  | 40   |1000      |220          | 27.16%            | 180
-------------------------------------------------------------------------------------------

Если вы посмотрите на вышесказанное. У меня есть день со временем начала или окончания. Это может быть преобразовано в любой формат времени, который вам нужен, в неделю, месяц, в любом случае. Дело в том, что вы можете просмотреть все свои товары и найти самую раннюю дату начала и самое позднее время окончания, рассчитав 100% расстояния до вашего события (для меня 810 минут).

Отсюда вы можете рассчитать % баллов, которые человеку даже необходимо покрыть (время выполнения одного события/общее время выполнения события *100). Это будет расстояние для рисования этого отдельного элемента.

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

Спасибо. КДЖ

 1
Author: Kieran, 2011-05-02 02:55:28