[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как организовать календарь
utabaldiev
Уважаемые знатоки!

Я надеюсь что вы мне поможете... Собираюсь написать прогу по учету времени, т.е. табель учета времени, каждый месяц должен открыватся календарь по выбранному месяцу и здесь я должен сравнивать даты выбранного месяца с датами командировки... Даты могут быть такие:
Командировка: с 05-09-2009 по 15-10-2009
Выбранный месяц: Любой

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

Заранее благодарен!



Спустя 14 минут, 42 секунды (12.10.2009 - 10:16) glock18 написал(а):
Я почти ничего не понял. Можно это же самое, только более формальным языком?

Непонятны следующие моменты:
1.
Цитата
каждый месяц должен открыватся календарь по выбранному месяцу


2.
Цитата
и здесь я должен сравнивать даты выбранного месяца с датами командировки

сравнение даты и интервала дат не однозначно. нужно более точно описать критерии сравнения.

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


Что за таинственная буква "к"? какие данные конкретно нужно сохранить?

ЗЫ: сейчас будет дубль два. Потрудитесь и распишите все конкретней на этот раз.

Спустя 27 минут, 7 секунд (12.10.2009 - 10:44) utabaldiev написал(а):
1. Выбираю месяц и год, н-р, месяц - сентябрь, год 2009 затем нажимаю кнопку "ОК"
2. Проверка должна быть с table1 (таблица для командировок), н-р, дата начала 2009-09-05, дата окончание 2009-10-15
3. После нажатия "ОК" я должен получить календарь выбранного месяца
4. В случае совпадения даты н-р, 2009-09-05=2009-09-05, 2009-09-06=2009-09-06, ... , 2009-09-30=2009-09-30 в ячейке календаря далжны заполняться буквы "к" (буква "к" - это означает каомандировка, буква "о" - отпуск и т.д.), а дальше при нажатии "сохранить" эти данные сохраняются в талице table2

Спустя 1 час, 17 минут, 42 секунды (12.10.2009 - 12:01) glock18 написал(а):
Цитата
1. Выбираю месяц и год, н-р, месяц - сентябрь, год 2009 затем нажимаю кнопку "ОК"
2. Проверка должна быть с table1 (таблица для командировок), н-р, дата начала 2009-09-05, дата окончание 2009-10-15


1. смотри класс Date для определения каледаря (день месяца - день недели). или функции по работе с датой: http://ru.php.net/manual/en/function.date.php
2. выбираешь все строки из таблицы, такие, что выбранный месяц содержит как минимум один день из указанного в строке интервала. Либо выбираешь вообще все строки, если интересует не только те, у кого стоит командировка на этот период.

3. строишь таблицу со столбцами-днями месяца, строками-сотрудниками. при выводе ячеек смотришь входит ли число из ячейки в диапазон командировки, ставишь "к" или что угодно.

4. сохранять. возможно два варианта:
а) если нужна возможность редактирования после вывода результатов, то нужно завести форму с большой кучей скрытых input'ов (для каждой ячейки). можно поиграться с именами, чтобы получить их на стороне сервера в виде массивов (name="somename[]"). кнопочка должна отправлять форму. на стороне сервера делаешь разбор каждой строки. формируешь insert, и вставлешь в table2.

б) если редактировать не нужно, то никакой формы не нужно. по нажатию кнопки запускается скрипт, который выполняет что-то типа:

1. а выбрал все то же, что прежде.
2. разобрал все так же.
3. вставил в базу.

вероятно, есть возможность выполнить все это при помощи одного запроса типа insert into () select, но я не вижу такой возможности.

Спустя 1 час, 53 минуты, 16 секунд (12.10.2009 - 13:54) utabaldiev написал(а):
Я не могу найти достаточно хороший календарь по инету, вы можете мне помочь найти его или у вас готовый есть?

Спустя 43 минуты, 59 секунд (12.10.2009 - 14:38) glock18 написал(а):
календарей огромное количество разных. я не понимаю формулировку "достаточно хороший". насколько я вижу, у вас сейчас нет особых требований к функционалу самого календаря.

Спустя 13 минут, 12 секунд (12.10.2009 - 14:52) utabaldiev написал(а):
<?php
//Индивидуальные настройки скрипта
$ac_font_size = "14"; //Размер шрифта (только число)
$ac_font_color = "black"; //Цвет шрифта (в любом представлении: название, RGB, etc. [html-формат])
$ac_main_color = "white"; //Основной цвет календаря (Обычные дни) (аналогично цвету шрифта)
$ac_second_color = "white"; //Второстепенный цвет календаря (аналогично цвету шрифта) #FFA500
//(Текущий день, заголовок календаря)
//Массив продолжительностей месяцев
$nod = array (31,28,31,30,31,30,31,31,30,31,30,31);
//Определение месяца и года для календаря
if (!isset($ot_month))
{
$ac_month = date("n");
$ac_year = date("Y");
$ac_j_dom = date("j");
$ac_j_dow = date("w");
}
else
{
list ($ac_month,$ac_year) = explode ("-",$ot_month);
if ($ac_year<1980) $ac_year = 1980;
if ($ac_year>2030) $ac_year = 2030;
if ($ac_month != date("n") or $ac_year != date("Y"))
{
$ac_j_dom = 1;
$ac_j_dow = date("w",mktime(0,0,0,$ot_month,1,$ot_year));
}
else
{
$ac_j_dom = date("j");
$ac_j_dow = date("w");
}
}
echo "<input type=hidden name=ac_month value=$ot_month>"; echo "<input type=hidden name=ac_year value=$ot_year>";

//Корректировка продолжительности февраля в высокосном году
if ($ac_year%4==0) {$nod[2]=29;}

//Корректировка номера дня недели из западно-европейской в русскую
if ($ac_j_dow == 0) $ac_j_dow = 7;

//Определение дня недели первого дня месяца
$ac_1_dow = $ac_j_dow - ($ac_j_dom%7 - 1);

if ($ac_1_dow < 1) $ac_1_dow+=7;
if ($ac_1_dow > 7) $ac_1_dow-=7;

//Определение числа дней месяца
$ac_nod = $nod[$ac_month-1];

//Определение количества недель в месяце
$ac_now=5;
if ($ac_1_dow-1+$ac_nod<29) {$ac_now=4;}
else if ($ac_1_dow-1+$ac_nod>35) {$ac_now=6;}

//Предотвращение вывода текущего дня для нетекущего месяца
if ($ac_month != date("n") or $ac_year != date("Y")) $ac_j_dom = -10;

//Вывод шапки календаря
echo "
<table border=0 cellspacing=1 cellpadding=1 width=100% bgcolor=black style=\"font-size: $ac_font_size pt; color: $ac_font_color; font-family: verdana\">
<tr bgcolor=$ac_second_color><td colspan=14 align=center>$ot_mstr $ot_year</td></tr>
<tr bgcolor=$ac_second_color>
<td colspan=2 align=center>Понедельник</td><td colspan=2 align=center>Вторник</td><td colspan=2 align=center>Среда</td><td colspan=2 align=center>Четверг</td><td colspan=2 align=center>Пятница</td><td colspan=2 align=center bgcolor=#FFA500>Суббота</td><td colspan=2 align=center bgcolor=#FFA500>Воскресенье</td>
";

/*Начало*/
$myres1=mysql_query("SELECT * FROM business_trip WHERE id_card='$idcard'");
$myrow1=mysql_fetch_array($myres1);
$mbdk=$myrow1['begin_date'];
$gkb_date=substr($mbdk,0,4); $mkb_date=substr($mbdk,5,2); $dkb_date=substr($mbdk,8,2);

$medk=$myrow1['end_date'];
$gke_date=substr($medk,0,4); $mke_date=substr($medk,5,2); $dke_date=substr($medk,8,2);

//echo "Начальная дата командировки: ".$mbdk."<br>";
//echo "Конечная дата командировки: ".$medk."<br>";

$myres2=mysql_query("SELECT * FROM $holiday WHERE id_card='$idcard'");
$myrow2=mysql_fetch_array($myres2);
$mbdo=$myrow2['begin_date'];
$gob_date=substr($mbdo,0,4); $mob_date=substr($mbdo,5,2); $dob_date=substr($mbdo,8,2);

$medo=$myrow2['end_date'];
$goe_date=substr($medo,0,4); $moe_date=substr($medo,5,2); $doe_date=substr($medo,8,2);

//echo "Начальная дата отпуска: ".$mbdo."<br>";
//echo "Конечная дата отпуска: ".$medo."<br>";
/*Конец*/

//Вывод содержимого календаря
for ($i=0;$i<$ac_now*7;$i++)
{
if ($i%7==0) {echo "</tr>\n<tr align=center bgcolor=$ac_main_color>\n\t";}
if ($i-$ac_1_dow+2!=$ac_j_dom) {echo "<td>";} else echo "<td bgcolor=$ac_second_color>";
if (($i<$ac_1_dow-1)||($i>$ac_nod+$ac_1_dow-2)) {echo ""; echo "</td>\n\t"; echo "<td></td>";}
else
{
echo $i-$ac_1_dow+2;
$kolt=$i-$ac_1_dow+2;
$kolname="kol".$kolt;
echo "</td>\n\t";
$std="".$i-$ac_1_dow+2;
$std2="d".$std;

//Вывод данных из таблицы
$myres5=mysql_query("SELECT * FROM $mt where id_card=$idcard and t_month=$ot_month and t_year=$ot_year");
$myrow5=mysql_fetch_array($myres5);
$myday=$myrow5['d'.$kolt];

$dat1 = $ot_year."-".$ot_month."-".$i;
$dat2 = $gkb_date."-".$mkb_date."-".$dkb_date;
$dat3 = $gke_date."-".$mke_date."-".$dke_date;

//echo "dat1 : ".$dat1."<br>"; //дни выбранного месяца
//echo "dat2 : ".$dat2."<br>"; //Дата начала командировки
//echo "dat3 : ".$dat3."<br>"; //Дата окончания командировки

//d1 - дата начала месяца, d2- дата окончания месяца
//d_beg - дата начала командировки, d_end - дата окончания командировки
$d_beg=$myrow1['begin_date'];
$d_end=$myrow1['end_date'];
$d1=$ot_year."-".$ot_month."-"."01";
$d2=$ot_year."-".$ot_month."-".$ac_nod;

if ((($d1>$d_beg) & ($d1<=$d_end) & ($d2>=$d_end)) ||
(($d1<=$d_beg) & ($d2>=$d_end)) ||
(($d1<=$d_beg) & ($d2>=$d_beg) & ($d2<$d_end)) ||
(($d1>$d_beg) & ($d2<$d_end)))

//Итого 4 случая:
//1. С начала месяца до day(d_end)
//2. C day(d_beg) до day(d_end), может включать как первый , так и последний день.
//3. С C day(d_beg) до конца месяца.
//4. Включает полностью весь месяц


//if ($i>=$dkb_date & $i<=$dke_date & $mkb_date<=$ot_month & $gkb_date==$ot_year)
{echo "<td><input type=text name=$kolname size=1 value='к'></td>";}
// if (($dat2>=$dat1)&($dat1<=$dat3)){echo "<td><input type=text name=$kolname size=1 value='к'></td>";}
//if (($dat2<=$dat1)||($dat1<=$dat3)){echo "<td><input type=text name=$kolname size=1 value='к'></td>";}
else{echo "<td><input type=text name=$kolname size=1 value='".$myday."'></td>";}
}
}
echo "</tr></table>";
?>

Спустя 3 минуты, 10 секунд (12.10.2009 - 14:55) utabaldiev написал(а):
$ot_month - выбранный месяц
$ot_year - выбранный год

когда делаю echo $i мне дает 3,4,...,33

Спустя 33 секунды (12.10.2009 - 14:55) utabaldiev написал(а):
где у меня ошибка сам не могу найти
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.