Построение таблицы записей на прием.

G
На сайте с 24.10.2009
Offline
51
768

Есть такая задача.

Есть несколько докторов.

На одной странице для каждого доктора загружается своя таблица. Все на одной странице.

В таблице время с периодичностью в 15 минут. от 8 часов до 23. Например 8:00 8:15 8:30 и так далее.

Из базы данных вытаскивается доктор, и для него строится таблица. и так в цикле для каждого.

А таблица сама делается двойным вложенным циклом. Один для часов, другой для минут.

Но, когда есть записи на определенное время, как сделать наиболее оптимизированно, чтобы в тех ячейках, где запись есть, она отобразилась?

У меня получилось пока только запрос в цикле запросов.

Все даты хранятся в unixtime.

Вот функция, в которой вывожу таблицу


function Schedule() {
global $db, $db, $prefix, $config, $templ, $users_class, $texts_class;
$this->menu();
$templ->page_title = 'Запись на прием - Таблица приема';
$templ->page_head_title = 'Запись на прием » Таблица приема';
if(isset($_GET["date"]))
{
$year = (int)substr($_GET['date'], 0, 4);
$month = (int)substr($_GET['date'], 4, 2);
$day = (int)substr($_GET['date'], 6, 2);
}
else // иначе выводить текущие месяц и год
{
$day = date('d', mktime(0,0,0,date('m'),date('d'),date('Y')));
$month = date('m', mktime(0,0,0,date('m'),date('d'),date('Y')));
$year = date('Y', mktime(0,0,0,date('m'),date('d'),date('Y')));
}

$result = $db->sql_query("SELECT a.id, a.name, a.surname, b.title FROM ".$prefix."_users a, ".$prefix."_user_posts b WHERE a.post=b.id AND b.doctor=1 AND a.arch!=1 ORDER BY a.surname ASC");
$count = $db->sql_numrows();
echo '<div style="width: 447px;" id="tools_panel">
&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="index.php?mod=appointments&do=Schedule&date='.date("Ymd", mktime(0,0,0,$month,$day-1,$year)).'">«</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="index.php?mod=appointments&do=Schedule">Сегодня</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="index.php?mod=appointments&do=Schedule&date='.date("Ymd", mktime(0,0,0,$month,$day+1,$year)).'">»</a></b>&nbsp;&nbsp;&nbsp;&nbsp;<b>Дата:</b> <u>'.$texts_class->date2rus(date('d F Y', mktime(0,0,0,$month,$day,$year))).'</u>&nbsp;&nbsp;&nbsp;&nbsp;<b>'.$texts_class->day2rus(date('l', mktime(0,0,0,$month,$day,$year))).'</b>
</div>';
while(list($id, $first_name, $second_name, $user_post) = $db->sql_fetchrow($result)) {
$name = $second_name.' '.$texts_class->short_text($first_name, 1).'.';
$result2 = $db->sql_query("SELECT pa.start_time, pa.end_time, pa.status, p.second_name, wt.title FROM ".$prefix."_patients_appointment pa, ".$prefix."_patients p, ".$prefix."_work_types wt, ".$prefix."_work_type_types wtt, ".$prefix."_work_divisions wd WHERE pa.doctor_id=".$id." AND pa.patient_id=p.id AND pa.work_type=wt.id AND wt.div=wd.id AND wt.types=wtt.id AND (pa.start_time BETWEEN ".mktime(1,1,1,$month,$day,$year)." AND ".mktime(0,0,0,$month,$day+1,$year).") ORDER BY pa.start_time ASC");
echo '<table border="0" cellpadding="0" cellspacing="1" style="float: left;" class="schedule_table">
<tr>
<th colspan="2">
'.$name.'<br /><span style="font-weight: normal;font-size: 10px;">'.$user_post.'</span>
</th>
</tr>';
for($h=8; $h<23; $h++) {
for($m=0; $m<=45; ) {
echo '<tr><td align="right" style="padding: 0 6px 0 6px;width: 30px;'.($m==0 ? 'font-weight: bold;background: #C8FFD7;border-top: 1px solid #777777;' : '').'">'.$h.':'.($m==0 ? '00' : $m).'</td><td style="width: 94px;cursor:pointer;padding: 0 3px 0 3px;'.($m==0 ? 'font-weight: bold;background: #C8FFD7;border-top: 1px solid #777777;' : '').'" title="'.date('H:i:s d.m.Y', mktime($h,$m,1,$month,$day,$year)).'" onclick=\'show_dialog_ajax_t("#appoint_block", "mod=appointments&do=add_appoint&doctor='.$id.'&time='.mktime($h,$m,1,$month,$day,$year).'", "Запись на прием '.date('H:i d.m.Y', mktime($h,$m,1,$month,$day,$year)).'")\'>';
while(list($start_time, $end_time, $status, $second_name, $work_type) = $db->sql_fetchrow($result2)) {
$timme = mktime($h,$m,1,$month,$day,$year);
if($timme >= $start_time && $timme <= $end_time) echo $second_name;
}
echo '</td></tr>';
$m += 15;
}
}
echo '</table>';
}
echo '<div class="clear"></div><div id="appoint_block"></div>';
}

А вот вывод таблиц, как он выглядит сейчас.

Может мне необходимо как-то по другому реализовать структуру БД, чтобы это не было как хромая лошадь.

Или как-то по другому вывод сделать.

Как это можно хранить?

Заранее спасибо, уважаемые.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий