Введение
Производственная практика проходила на ЗАО НПП «ЗНАК».
За время прохождении практики были выполнены следующие виды работ:
·ознакомление с деятельностью и задачами предприятия;
·ознакомление с языками программирования web-приложений (HTML, CSS, PHP);
·изучение основ работы с БД в среде MS SQL server management express 2005.
и полученные следующие результаты:
1.Постановка задачи и целей практики
Задание: модернизация сайта. Есть БД в которую записывается время прихода и ухода на работу, а также место работы (офис и производство), необходимо сформировать отчет ( в виде интернет - страницы) в котором отображается календарь с полной информацией о проделанной работе выбранногосотрудника.
Цели:
·Разработать форму представления данных на экране.
·Сформировать данные из БД, пригодные для вывода на экран.
·Изучение основ web-программирования (HTML, CSS, PHP).
·Изучение основ работы с БД в среде MS SQL server management express 2005.
·Реализация технологии всплывающих подсказок (javascript).
2.Реализация поставленных целей
2.1 Разработка формы представления данных на экране
Исходная форма (рисунок 1):
Рисунок 1 -исходная форма представления данных на экране.
Недостатки данного представления:
·Нет возможности посмотреть данные за весь месяц.
·Сложно просматривается соответствие между входом на работу и выходом с нее.
·Сложное представление данных, результатом чего является сложность восприятия информации.
2.2 Разработка новой формы представления
Для возможности просмотра информации о сотруднике за весь месяц предусмотрена возможность просмотра всего рабочего месяца в виде календаря. Для более удобного ориентирования по календарю выходные дни выделены красным, а также выделен текущий день. В каждом дне календаря заносится следующая информация:
·Дата (формат: день.месяц.год).
·Учет обеда (формат: часы:минуты).
·Учет дороги (формат: часы:минуты).
·Количество отработанных часов в текущий день (формат: часы:минуты). Отображается зеленным, если у сотрудника за текущий день не было нарушений и красным, если нарушения были.
·Иконка, при наведении на которую показывается дополнительная информация.
Один день календаря представлен на рисунке 2.
Рисунок 2 - один день из календаря.
В результате разработки вида представления информации была получена следующая форма (рисунок 3).
Рисунок 3 - новая форма представления информации на экране.
2.3 Формирование данных из БД, которые пригодны для вывода на экран
Исходная форма (рисунок 4):
Рисунок 4 - исходная формировка данных.
Для удобства восприятия информации вход и выход объединили в одну строку и, если в данной строке присутствует нарушение, то вся или часть строки выделяется оранжевым цветом. Так же вся дополнительная информация показывается только при наведении на определенный участок формы и скрывается при сдвиге курсора мыши с определенного места на форме. Результатпредставлен на рисунке 5.
Рисунок 5 - новая формировка данных.
2.4 Реализация технологии всплывающих подсказок
Для реализации данного пункта был выбран язык программирования javascript для которого необходимо подключить плагин tiptip:
Для реализации подсказки необходимо прописать следующую функцию:
$(function()
{
$(".someclass").tipTip({maxWidth: '500px'});
});
Далее необходимо присвоить данный класс объекту, при наведении на который будет появляться подсказка. Пример всплывающей подсказки представлен на рисунке 5.
Конечный результат работы представлен на рисунке 4 и рисунке 6. Код программы представлен в приложении А.
Рисунок 6 - итог
Заключение
база данные время сотрудник
В результате прохождения практики были получены следующие результаты:
·Разработана новая форма представления данных на сайте.
·Изучены основы web- программирования (HTML, CSS, PHP).
Изучена работа плагина tiptip, который предназначен для создания всплывающих подсказок.
·Получены навыки работы с БД в среде MSSQL server management express 2005.
Список литературы
1.Джон Коггзол - PHP5 полное руководство.
2.Евгений Попов - Видеоурок (Создание всплывающих подсказок).
.Евгений Попов - Видеокурсы (html,css,php,javascript)
Приложение А - листинг программы
(дополнительное)
detail.php
function actions ($out,$move,$place,$time,$interval)
{($move == 'entry') $move = 0;$move = 1;($place == '(офис)') $place = 1;$place = 0;
$str='';($time=='00:00:00')
{
$str = ' '.$time.' ( Отсутствует выход вконце дня ) ';$str;
}($out)
{0://если человек находится на улице
{($move==0&&$place==1)//вход в офис
{
$str = 'Офис: '.$time.' - ';
$out = 1;$str;
}($move==0&&$place==2) //вход на производство
{
$str = 'Производство: '.$time.' - ';
$out = 2;$str;
}($move==1&&$place==1)//выход из офиса
{
$str = 'Офис: ... - '.$time.'( Отсутствует вход )'; $str;
}($move==1&&$place==2) //выход с производства
{
$str = 'Производство: ... - '.$time.'( Отсутствует вход )';$str;
}
}1://если человек находится в офисе
{($move==1&&$place==1) //выход из офиса
{
$str = $time.' ( '.$interval.' )';
$out = 0;$str;
}($move==0&&$place==1) //вход в офис (двойной)
{
$str = ' ... ( Пропущен выход )Производство: '.$time.' - ';$str;
}($move==0&&$place==2) //вход на производство(пропущен выход из офиса)
{
$str = '... ( Пропущен выход из офиса) Производство: '.$time.' - ';
$out = 2;$str;
}($move==1&&$place==2) //выход с производства(пропущен выход из офиса и вход на производство)
{
$str = ' ... ( Пропущен выход )Производство: ... - '.$time.' ( Пропущен вход )';
$out = 0;$str;
}
}2://если человек находится на производстве
{($move==1&&$place==2) //выход с производства
{
$str = $time.' ( '.$interval.' )';
$out = 0;str;
}($move==0&&$place==2) //вход на производство (двойной)
{
$str = ' ... - '.$time.' ( Пропущен вход ) ';$str;
} ($move==0&&place==1) //пропущен выход с производства
{
$str = ' ... ( Пропущен выход )'.$time.' - ';
$out = 1;
return $str;
}($move=1&&place==0) //пропущен выход с производства и вход в офис
{
$str = '... ( Пропущен выход ) ... - '.$time.'( Пропущен вход )';
};
}
}
}{ (isset($_GET["uid"])){$uid = $_GET['uid'];}(isset($_GET["begin_date"]))
{
$date1 = $_GET['begin_date'];
$begin_date = new DateTime($date1,$timezone);
$month = $begin_date->format('m');
$year = $begin_date->format('Y');
}
{
$month = date("m",mktime(0,0,0,date('m'),1,date('Y')));
$year = date('Y',mktime(0,0,0,date('m'),1,date('Y')));
}(isset($_GET["end_date"]))
{
$date2 = $_GET['end_date'];
$last_date = new DateTime( $date2, $timezone );//конец месяца
}$uid = 1;
$timezone = new \DateTimeZone( 'Europe/Moscow' ); //выбираем временной пояс
$current_date = new DateTime("now",$timezone);
$begin_date->setDate( $begin_date->format('Y'), $begin_date->format('m'), 1 );//формат получения (начало месяца)
$conn = new \sqlsrv\connection( \WTA\SERVER, array( "Database"=>\WTA\DATABASE, "UID"=>"sa", "PWD"=>"1" ) );
$users_query = $conn->query("$uid_u, $name, $name1, $name2$userlist$uid_u = $uid AND $tab_number_filterBY $name");
$user_row = $conn->fetch_assoc_array( $users_query );
$username.= ' '.$user_row[\WTA\NAME].' '.$user_row[\WTA\NAME1].' '.$user_row[\WTA\NAME2]; //формирование строки с ФИО
$skip = date('w',mktime(0,0,0,$month,1,$year)); //узнаем номер для недели
$skip=$skip - 1; ($skip == -1) $skip=6;
$daysInMonth = date('t',mktime(0,0,0,$month,1,$year)); //узнаем количество дней в месяце
$calendar_head = '';
$calendar_body = ''; //обнуляем переменнаые для календаря
$day = 1; //переменная цикла
for($i=0; $i
{
$calendar_body.=''; //открываем тег строки
for($j = 0; $j
{(($skip>0)or($day>$daysInMonth))
{
$calendar_body.='
$skip--;
}
{(($j == 5) OR ($j == 6)) //если воскресение или суббота,то отмечаем выходной
$calendar_body.='
else {//иначе просто выводи день ячейки
$beg_date = new DateTime( $begin_date->format('Y-m-d'), $timezone );
$result = \WTA\get_worktime( $conn, $user_row[\WTA\UID_U], $beg_date ); //необходим формат времени format('Y-m-d')
$info='';
$mistake ='';
$where_event_place='';
$out = 0;
foreach( $result[\WTA\EX] as $ex_info )
$class_warning = '';
$event_class = '';
$event_string = '';( $ex_info[\WTA\MODE] == \WTA\EVENT_ENTRY ) //определяем какое событие произошло (вход или выход)
{
$event_class = 'entry';
$event_string = 'вход';
}if( $ex_info[\WTA\MODE] == \WTA\EVENT_EXIT )
{
$event_class = 'exit';
$event_string = 'выход';
}( $ex_info[\WTA\DOOR] == \WTA\DOOR_OFFICE ) //определяем где произошло событие
{
$where_event_place='(офис)';
$event_string.= " (офис)";
}if( $ex_info[\WTA\DOOR] == \WTA\DOOR_FACTORY ) {
$where_event_place='(пр-во)';
$event_string.= " (пр-во)";
}( $ex_info[\WTA\WARNINGS] )
{
$class_warning = '>
}
//$info.=$ex_info[\WTA\TIME]->format('H:i:s').' - '.$event_string.' '.$ex_info[\WTA\INTERVAL].'';
$info .= actions(&$out,$event_class,$where_event_place,$ex_info[\WTA\TIME]->format('H:i:s'),$ex_info[\WTA\INTERVAL]);( $ex_info[\WTA\WARNINGS] as $warning )
{
$mistake .=$warning.'';
}
}
$dinner = $result[\WTA\DINNER];//учет обеда( $dinner != 0 )
{
$min = (int)(($dinner%3600)/60); $min = $min > 9 ? $min : "0$min";
$hour = (int)($dinner/3600); $hour = $hour > 9 ? $hour : "0$hour";
$dinner = "вычет $hour:$min";
$html_table.= "
}
$road = $result[\WTA\ROAD];//учет дороги( $road != 0 )
{
$min = (int)(($road%3600)/60); $min = $min > 9 ? $min : "0$min";
$hour = (int)($road/3600); $hour = $hour > 9 ? $hour : "0$hour";
$road = "$hour:$min";
$html_table.= "
}((date(j)==$day)&&(date(m)==$month)&&(date(Y)==$year)) //проверяем на текущий день
{
if($mistake=='')
{
$calendar_body.='
'.$begin_date->format('d.m.Y').'
Отработано: '.$result[\WTA\WORKT]->format('%H:%I').'
Обед: '.$dinner.'
Дорога: '.$road.'
';
}
{
$calendar_body.='
'.$begin_date->format('d.m.Y').'
Отработано: '.$result[\WTA\WORKT]->format('%H:%I').'
Обед: '.$dinner.'
Дорога: '.$road.'
';
}
}//если это обычный день(производим разбиение на строки и ячейки)
{($mistake=='')
{
$calendar_body.='
'.$begin_date->format('d.m.Y').'
Отработано: '.$result[\WTA\WORKT]->format('%H:%I').'
Обед: '.$dinner.'
Дорога: '.$road.'
';
}
{
$calendar_body.='
'.$begin_date->format('d.m.Y').'
Отработано: '.$result[\WTA\WORKT]->format('%H:%I').'
Обед: '.$dinner.'
Дорога: '.$road.'
';
}
}
}
$day++;//увеличиваем день на один
$begin_date->modify('+1 DAY');//увеличиваем день на один
}
} //закрытие внутреннего цикла
$calendar_body.=''; //закрываем тег строки
} //закрытие внешнего цикла
//заголовок календаря
$calendar_head = ''.$username.'';
$begin_date->modify('-1 DAY');
$months = array( 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь',
'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' ); //массив с месяцами
$mn = (int)$begin_date->format('m');
$calendar_head.='format('m')-1].' >>';
$calendar_head .= 'Необходимо отработать в этом месяце: '.$need_work[$begin_date->format("Y")][$begin_date->format("n")].'';
$calendar_head .= '
Понедельник
Вторник
Среда
Четверг
Пятница
Суббота
Воскресенье
';"
$month = (int)$begin_date->format('m');
}'Вернуться на главную';"";
} catch( \sqlsrv\exception $e )
{"Ошибка при обращении к SQL серверу: ".$e->getMessage();
// Вывод информации об ошибке.( ($errors = sqlsrv_errors() ) != null)
{( $errors as $error)
{"SQLSTATE: ".$error[ 'SQLSTATE']."";"code: ".$error[ 'code']."";"message: ".$error[ 'message']."";
}
}
}
?>
$(function()
{
$(".someclass").tipTip({maxWidth: '500px'});
});
.css (таблица стилей для оформления календаря)
td /*отображение границ таблицы*/
{
width: 80px;
border: 0px;: solid 3px BLACK; size: 22px;
/*text-align: center;*/
}
.today /*выделениесегодняшнейдаты*/
{color:*#FFFF99; color:#FF531A;
}
.holiday/*выделениевоскресения*/
{ color:#fffff0;color:#FF531A; : 7%;align: center;
}
{:0 auto;:10px;
}
.day
{ color:#f5f5dc; :#000000;size:20px;
}
.none
{:0px;
}
.tdcells
{=" border: solid 1px BLACK;: 0px; : 100%; : 100%; "
}