Форматирование событий в соответствии со временем начала
Все еще работаю над своим приложением планировщика/календаря. Я почти закончил, у меня есть некоторые более сложные части работы, но я застрял на еще одной сложной части. Я хочу показать свои события в сетке в соответствии с их временем начала.
На этой картинке это не показано, но представьте, что слева от 25-го числа есть колонка с часами (с 8 утра до 11 вечера или около того). Если событие начинается... скажем, в 1 час дня, я бы хотел, чтобы оно отображалось где-то в середине страницы. Если событие начинается в 8:30 утра, оно должно показывать между 8 и 9 утра.
Думаю, я мог бы сделать это с помощью таблиц, но мне было интересно, есть ли другой способ. Возможно ли это с помощью простого 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" дивов, если днем будет более одного события.
У меня возникает соблазн просто оставить все как есть на данный момент и просто отобразить время начала/окончания в разделах событий.. пока я не придумаю лучший способ считывать их из массива и отображать.
Любая помощь/предложения приветствуются. Спасибо.
6 answers
На самом деле я тоже делаю это прямо сейчас. Мое решение состояло в том, чтобы пойти с 960.gs- как дивы.
Во-первых, я определяю ряд констант: время начала отображения, время окончания отображения, столбцы в час, общее количество столбцов. В случае моего приложения эти переменные настраиваются пользователем.
Во-вторых, я запрашиваю массив событий, с которыми мне нужно разобраться. Они включают время начала и время окончания, а также детали, которые я хочу отобразить. Я буду использовать jQuery QTIP для всплывающего окна сведения, которые зависают, поэтому данные для их заполнения также включены в этот запрос.
Теперь, 960.gs концепция. Основой для сетки является знание того, что у вас есть X количество места для отображения вашего контента...с 960 это 960 пикселей. У меня больше обычаев, но это обеспечивает концепцию. Вы можете разделить это на довольно много чисел, что станет основой для разделения сетки. Используя этот подход, я могу легко определить столбец от grid_1 до grid_4, и он будет иметь ширину, равную соразмерный процент от общей ширины (т. Е. При макете из 16 столбцов, делающий 4 столбца, охватывал бы 25 %) Он совместим с несколькими браузерами и не требует явного количества четких разделителей. Вам просто нужно сложить числа так, чтобы они соответствовали количеству столбцов, с которыми вы хотите работать.
Теперь я начну с математических расчетов, чтобы выяснить, сколько времени представляет каждый столбец. Я собираю каждый день, используя цикл foreach: я начинаю с часа времени начала отображения и увеличиваю его. Если время начала события равно приращению, я запускаю div, стилизованный соответствующим образом в соответствии с моими критериями раскраски. Аналогично, если мое время окончания
Моя концепция заключается в том, чтобы делать это на временной основе для календаря еженедельного типа. Но общая идея может быть легко изменена для календаря в стиле месяца или даже для дня календарь.
Таблицы определенно облегчают это (версия 1 была таблицами), но это можно сделать в любом случае, если у вас хватит терпения.
Ваша идея о таблицах звучит как лучший вариант. Предполагая, что все границы таблицы скрыты, вы можете перейти к любому размеру временного интервала, который диктует ваше приложение, не делая его слишком беспорядочным.
Я бы просто начал со строки, представляющей 15 минут, если им просто нужно выстроиться примерно в нужное время. Ваш эффект :hover
для каждого блока может показывать точное время, и тогда таблица просто позволяет вам rowspan
просматривать ваши события через приблизительные 15-минутные временные интервалы чтобы сделать его достаточно четким, чтобы он был визуально репрезентативным.
Вы могли бы использовать подход 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%. Это немного сложно в зависимости от доступного размера и прочего, но может сработать. Я еще не пробовал. Просто застрял у меня в голове, как еще одна возможность.
Я бы посоветовал не использовать таблицы, а использовать Javascript и CSS.
- Используйте Javascript, чтобы получить ширину фона календаря: например, 800 пикселей.
- Разделите эту ширину, чтобы разместить 30-минутные слоты в течение 24 часов; 800 / (24 * 2) = 16 пиксели
- 24 * 2 (48) это количество 30-минутных слотов за 24 часа.
- 16 пикселей - это то, сколько места у вас есть за 30 минут.
- Для каждого события, которое у вас есть, возьмите время начала в блоках по 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.
Рад слышать, что вы делаете успехи. Таблицы по-прежнему кажутся мне лучшим решением для этого. Подумайте об этом: - вы можете изменить ширину, высоту и т. Д., Чтобы установить их в виде сетки, как вы хотите. - вы точно знаете структуру, поэтому пробег по таблице - это простой код цикла
И решающий аргумент для меня: - таблицы обеспечивают доступность. Поскольку средства чтения с экрана имеют способы осмысленной интерпретации таблиц для зрителей с ослабленным зрением, таблицы особенно полезны когда содержимое становится осмысленным с помощью строк и столбцов, а это именно то, что у вас есть.
Кстати, введите URL-адрес работающей версии для нас, когда закончите.
Йоу. Я рассматривал аналогичную проблему для модуля календаря веб-сайта, который я должен создать. Я собираю его в 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 минут (общее время начала события - время начала события элемента)
Спасибо. КДЖ