Введение
Одной из важнейших проблем качественной организации учебного процесса в высшем учебном заведении является задача создания отптимального учебного расписания. Правильно и точно составленное расписание обеспечивает равномерную загрузку студенческих групп и профессорско-преподавательского состава.
Автоматизированная система призвана облегчить процесс составления расписания. На выходе такая система позволит значительно сократить время на создание всевозможных отчетов по занятости аудиторий, преподавателей и планомерному выполнению учебного плана по всем дисциплинам.
В настоящее время использование информационных систем в высших образовательных учреждениях не является редкостью. Спектр их применения широк и варьируется от автоматизации отдельно взятых рабочих мест до полной автоматизации деятельности ВУЗа.
Вне зависимости от объекта автоматизации, будь то преподавательский состав или администрация университета, в образовательном учреждении такие системы внедряют, преследуя конечную цель - повышение качества образования.
В связи с функционированием вузов в рамках единого информационного пространства, использование сторонних программных продуктов делается невозможным ввиду специфики работы имеющихся систем или же по причине дороговизны внедрения, влекущего значительную доработку как имеющихся, так и приобретаемых информационных систем.
С целью автоматизации планирования было разработано решение, упрощающее процесс создания электронного расписания интерактивными методами.
Для создания системы использовались языки программирования PHP, HTML5, CSS3 и JQuery, в качестве системы управления базами данных использовалась СУБД MySQL.
Глава 1 Теоретические основы автоматизированной системы расписания занятий
1.1 Понятие автоматизации
Следует начать с определения понятия «автоматизация». Под автоматизацией обычно понимают применение технических и программных средств, частично или полностью освобождающих человека от непосредственного участия в процессах получения, преобразования, передачи и использования материалов или информации.
Преимущества автоматизации очевидны - это ускорение выполнения операций и снижение ошибок при их выполнении, снижение издержек на реализацию операций и повышение качества.
Выделяют следующие этапы процесса автоматизации, применяемые в целом к деятельности того или иного учреждения. Каждый из этапов требует осмысленного и последовательного выполнения.
Этап 1: постановка проблемы, оценка необходимости автоматизации и возможностей предприятия;
Этап 2: формирование требований к программно-аппаратному комплексу, выбор или реализация программного продукта и технического обеспечения;
Этап 3: внедрение программного продукта;
Этап 4: послегарантийное обслуживание программно-аппаратного комплекса.
Прежде чем начать автоматизацию необходимо ясно и четко сформулировать свои требования к ней. Требуется определить какие именно функции необходимо автоматизировать.
Выбор программного продукта или среды его разработки не следует отделять от выбора технического обеспечения, на котором предстоит в дальнейшем работать. Не следует забывать и об имеющейся информационной системе ВУЗа. Объединение в единое информационное пространство позволяет использовать ранее реализованные компоненты и единую базу данных, что повышает гибкость информационной системы в целом и снижает дублирование уже имеющейся информации.
После построения модели учреждения и определения требований к программному продукту, необходимо определиться с выбором программы. Функциональная полнота (достаточность) будущей программы является базовым требованием к выбору программного продукта.
ГЛАВА 2 Разработка сайта
2.1 Постановка задачи
В рамках сайта необходимо разработать систему позволяющую облегчить возможность составления расписания. В качествене инструментов для разработки будем пользоваться такими языками программирования как: PHP, HTML5, CSS3, JQuery и MySQL.
2.2 Дизайн
В качестве основного принципа дизайна, было решено выбрать Material design от корпорации Google.
Material Design (рус. Материальный дизайн) — дизайн программного обеспечения и приложений операционной системы Android от компании Google. Впервые представлен на конференции Google I/O 25 июня 2014 года. Идея дизайна заключается в приложениях, которые открываются и сворачиваются как карточки, используя эффекты теней. По идее дизайнеров Google у приложений не должно быть острых углов, карточки должны переключаться между собой плавно и практически незаметно.
Material Design – это новый фреймворк, который, как верит Google, и создаст эту интуитивную модель. Это такой же революционный продукт, как, например, iPhone от Apple. В нем сочетаются гибкость и простота, которые помогут разобраться с новыми технологиями. И если Google выполнит свое обещание, и сможет привнести данную технологию во все свои продукты, включая web, Chrome OS и Android, она, действительно, поможет нам понять технологии, и избавит нас от необходимости подстраиваться под различные модели.
Примеры «Материального дизайна»:
Рисунок 1.1 –Отображение календаря на различных устройствах
В настоящее время существует многожество CSS фреймворков посвященных этому дизайну, одним из которых является materialize.css. Данная библиотека разработана студентами университета Карнеги-Меллона и является open-source продуктом (ссылка проекта на GitHub : https://github.com/dogfalo/materialize/) .
Преимущеста этого фреймворка перед остальными заключается в простоте пользования и хорошо написанной, наглядной документации.
В итоге был получен адаптивый веб-дизайн динамически подстраивающийся под заданные размеры окна браузера.
Рисунок 1.2 –Вид сайта на устройствах более чем 992 пикселя в ширину
Рисунок 1.3 –Вид сайта на устройствах не более чем 992 пикселя в ширину
2.3 Структура базы данных
В этом разделе представлена схема базы данных. Для каждой таблицы указываются: ее название, структура, описание и назначения.
Burden
Таблица для хранения нагрузки преподавателя.
Структура таблицы burden:
b_id – ключевое поле, идентификатор
b_teacher_id – ссылка на идентификатор из таблицы teachers
b_subject_id – ссылка на идентификатор из таблицы subjects
b_quater – количество часов в неделю
b_half – количество часов в неделю
b_full – количество часов в неделю
b_course – курс
b_group – группа
b_faculty – факультет
Schedule
Таблица для хранения расписания.
Структура таблицы schedule:
sc_id – ключевое поле, идентификатор
sc_teacher_id – ссылка на идентификатор из таблицы teachers
sc_subject_id – ссылка на идентификатор из таблицы subjects
sc_position – характеристики пары
sc_row – строка в таблице расписания (номер пары)
sc_weekday – день недели
sc_course – курс
sc_group – группа
sc_faculty – факультет
Speciality
Таблица для хранения специальностей.
Структура таблицы speciality:
sp_id – ключевое поле, идентификатор
sp_titile – название специальности
sp_course – курс
sp_group – группа
sp_faculty – факультет
Teachers
Таблица для хранения преподавателей.
Структура таблицы teachers:
t_id – ключевое поле, идентификатор
t_title – инициалы преподавателя
Subjects
Таблица для хранения дисциплин.
Структура таблицы subjects:
sb_id – ключевое поле, идентификатор
sb_title – название специальности
Users
Таблица для хранения пользователей.
Структура таблицы users:
user_id – ключевое поле, идентификатор
name – имя
surname – фамилия
login – логин пользователя
password – пароль пользователя (хеш md5)
Рисунок 1.4 –Схема базы данных
2.4 Программная реализация
Физически сайт содержит корневую папку (www), внутри которой находятся файлы -index.php,adm.php,inf.php и папки –css,img,php,js.
www/
|--css/
| |--materialize.css
| |--main.css
|
|--img/
| |--penrose.png
|
|--php/
| |--changesession.php
| |--db_connect.php
| |--engagedcell.php
| |--exit.php
| |--footer.php
| |--insert.php
| |--login.php
| |--main.php
| |--nav.php
| |--reg.php
| |--remove.php
| |--select.php
| |--start.php
| |--tablecell.php
| |--updatecell.php
|
|--js/
| |--materialize.js
| |--main.js
|
|--index.php
|--adm.php
|--inf.php
Файл index.php является главным файлом сайта, а также благодаря ему страница динамически изменяется. Например, в случае если условие ниже верно – будет получена форма с авторизацией / регистрацией пользователя.
if(!$_SESSION["user"]){
// файл содержащий форму для входа/регистации
include("php/start.php");
}
В случае, если пользователь удачно вошел в систему, то условие пойдет по ветке «иначе» и будет получена страница другого вида.
else {
if(!$_GET["faculty"] || !$_GET["course"] || !$_GET["weekday"]){
echo "<script>location =
'index.php?faculty=1&course=1&weekday=1'</script>";
}
// введем обозначение
$faculty = $_GET["faculty"];
$course = $_GET["course"];
$weekday = $_GET["weekday"];
include("php/db_connect.php");
// забираем группы выбранным факультета и курсом
$sql = "
SELECT sp_title
FROM speciality
WHERE sp_course = ".$course."
AND sp_faculty = ".$faculty."
";
$query = mysql_query($sql) or die(mysql_error());
$g = 0;
while($row = mysql_fetch_array($query)){
$a[$g] = $row['sp_title'];
$g++;
}
// количество групп
$col = $g;
// забираем часы и предметы выбранного преподавателя
$sql = "
SELECT b_quater, b_half, b_full, t_name, t_id, sb_title, sb_id
FROM burden, teachers, subjects
WHERE burden.b_teacher_id = teachers.t_id
AND burden.b_subject_id = subjects.sb_id
AND b_course = ".$course."
AND b_faculty = ".$faculty."
";
$query = mysql_query($sql) or die(mysql_error());
$t_name = array();
$list = array();
$list_q = array();
$list_h = array();
$list_f = array();
$teachers_id = array();
$subjects_id = array();
while($row = mysql_fetch_array($query)){
$s = $row['t_name'];
if(!$list[$s]){
array_push($t_name, $s);
array_push($teachers_id, $row['t_id']);
$list[$s] = array();
$list_q[$s] = array();
$list_h[$s] = array();
$list_f[$s] = array();
$subjects_id[$s] = array();
}
array_push($list[$s], $row['sb_title']);
array_push($list_q[$s], $row['b_quater']);
array_push($list_h[$s], $row['b_half']);
array_push($list_f[$s], $row['b_full']);
array_push($subjects_id[$s], $row['sb_id']);
}
// Навигация/header-сайта
include("php/nav.php");
echo '
<div id="temp"></div>
<div class="row" id="sheet">
';
// Основное содержание страницы
include("php/main.php");
echo'
</div>
';
// Подвал/footer-сайта
include("php/footer.php");
}
Содержание файла start.php:
<?php
echo'
<div class="container">
<div class="row" >
<div class="col s12" id="sign-in">
<legend>Авторизация</legend>
<form action="/php/login.php" method="POST">
<input type="text" name="login"
placeholder="Введите логин пользователя">
<input type="password" name="password"
placeholder="Введите пароль пользователя">
<button type="submit" name="submit"
class="btn">Вход</button>
<button id="btn-reg" class="btn">Регистрация</button>
</form>
</div>
<div class="col s12" id="registration">
<legend>Регистрация</legend>
<form method="POST">
<input id="name" type="text" class="span4"
placeholder="Имя">
<input id="surname" type="text" class="span4"
placeholder="Фамилия" required>
<input id="login" type="text" class="span4" name="login"
placeholder="Логин" required>
<input id="pass" type="password" class="span4"
name="password" placeholder="Пароль" required>
<button id="reg" type="submit" name="submit"
class="btn" >Зарегистрироваться</button>
<button id="back-to-future" type="submit"
name="submit" class="btn" >Назад</button>
</form>
</div>
</div>
</div>
';
?>
Содержание файла nav.php:
<?php
echo '
<div class="navbar-fixed">
<nav>
<div class="nav-wrapper">
<a href="/" class="brand-logo center"
style="height:inherit">
<img src="img/penrose.png" alt="Logo" height="100%">
</a>
<a href="#" data-activates="mobile-demo"
class="button-collapse">
<i class="material-icons">menu</i></a>
<ul class="hide-on-med-and-down">
<li><a href="inf.php">Информация</a></li>
<li><a href="adm.php">Администрирование</a></li>
<li><a href="#" class="exit">Выход</a></li>
</ul>
<ul class="side-nav" id="mobile-demo">
<li><a href="inf.php">Информация</a></li>
<li><a href="adm.php">Администрирование</a></li>
<li><a href="#" class="exit">Выход</a></li>
</ul>
</div>
</nav>
</div>
';
?>
Содержание файла footer.php:
<?php
echo '
<footer class="page-footer">
<div class="footer-copyright">
<div class="container">
© 2015 Y. Pekkinen
</div>
</div>
</footer>
';
?>
Содержание файла main.php:
<?php
$w = array('Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота');
$c = array('I курс', 'II курс', 'III курс', 'IV курс' , 'V курс');
$f = array(
'Физико-математический факультет',
'Биологический факультет',
'Инжинерно-педагогический факультет',
'Факультет физической культуры',
'Факультет технологии',
'Филологический факультет'
);
echo '
<!-- Скрытые элементы -->
<div class="modal" id="modal1">
<div class="modal-content">
<h4>Предупреждение</h4>
<p>Сделать пару поточной?</p>
</div>
<div class="modal-footer">
<a href="#!" id="inside" class="modal-action modal-close
waves-effect waves-green btn-flat">Подтвердить</a>
<a href="#!" class="modal-action modal-close
waves-effect waves-green btn-flat">Отменить</a>
</div>
</div>
<div class="progress myLoader">
<div class="indeterminate"></div>
</div>
<!-- Интерфейс -->
<div class="col s12 m12 l4 ">
<div style="padding:10px" class="z-depth-1">
<select name="faculty" id="faculty" class="select">
';
// список факультетов
for($i=1;$i<=6;$i++)
if($faculty == $i)
echo '<option value="'.$i.'" selected>
'.$f[$i-1].'</option>';
else
echo '<option value="'.$i.'">'.$f[$i-1].'</option>';
echo'
</select>
<select name="course" id="course" class="select">
';
// список курсов
for($i=1;$i<=5;$i++)
if($course == $i)
echo '<option value="'.$i.'" selected>
'.$c[$i-1].'</option>';
else
echo '<option value="'.$i.'">'.$c[$i-1].'</option>';
echo'
</select>
<select name="day" id="weekday" class="select">
';
// список дней недели
for($i=1;$i<=6;$i++)
if($weekday == $i)
echo '<option value="'.$i.'" selected>
'.$w[$i-1].'</option>';
else
echo '<option value="'.$i.'">'.$w[$i-1].'</option>';
echo'
</select>
</div>
<li class="divider"></li>
<!-- Список с преподователями и их нагрузкой -->
<div id="tt" style="margin:10px; padding:10px"
class="z-depth-1">
<ul class="collapsible popout" data-collapsible="accordion">
';
for($i=0; $i<count($t_name); $i++){
echo '
<li>
<div class="collapsible-header" tab="'.$i.'">
<i class="small material-icons">perm_identity</i>
'.$t_name[$i].'
<div class="right"><a class="disabled"
href="#">отчет</a></div>
</div>
<div class="collapsible-body">
';
$s = $t_name[$i];
for($j=0; $j<count($list[$s]); $j++) {
echo '
<div class="row burden-list"
t_id="'.$teachers_id[$i].'"
sb_id="'.$subjects_id[$s][$j].'">
<div class="left">
'.$list[$s][$j].'
</div>
<div class="right">
<div class="chip tooltipped waves-effect
waves-red" val="quater_c" data-position="top"
data-delay="100" data-tooltip="Четверть от
пары">
'.$list_q[$s][$j].'</div>
<div class="chip tooltipped waves-effect
waves-red"
val="half_c" data-position="top"
data-delay="100" data-tooltip="Половина от
пары">
'.$list_h[$s][$j].'</div>
<div class="chip tooltipped waves-effect
waves-red" val="full_c" data-position="top"
data-delay="100" data-tooltip="Целая
пара">'.$list_f[$s][$j].'</div>
</div>
</div>
';
}
echo '
</div>
</li>
';
}
echo'
</ul>
</div>
</div>
<!-- таблица с расписанием -->
<div class="col s12 m12 l8 z-depth-1" style="padding:10px;">
<table class="table">
<thead>
<tr>
</th>
</tr>
<tr>
<th></th>
';
// специальности
for($i=0; $i<$col; $i++)
echo "<th>".$a[$i]."</th>";
echo'
</tr>
</thead>
<tbody>
';
for($j=0; $j<6; $j++){
$s = "";
for($k=0; $k<$col; $k++)
$s = $s."<td row='".$j."' col='".$k."'></td>";
echo "<tr><td>".($j+1)."</td>".$s."</tr>";
}
echo'
</tbody>
</table>
</div>
';
?>
За интерактивность, взаимодействие сайта с пользователем отвечает файл main.js.
$(function(){
var b_w = 0; // ширина столбцов в таблице
var col_g = 0 // количество групп/столбцов на курсе
var obj; // перетаскиваемый объект
var row , col;
var position;
var b_size = 0;
var flow_couple = false;
var leet = 1337;
var step = [[0,0],[0,1],[1,0],[1,1]];
// массив "занятости" ячеек
var n = 12, m = 14;
var map = [];
for(var i=0; i<n; i++){
map[i] = [];
for(var j=0; j<m; j++)
map[i][j] = 0;
}
// дополняет строку str длины len "ведущими" нулями
function format_bin(str, len){
var l = len - str.length;
for(var i=0; i<l; i++)
str = "0" + str;
return str;
}
// нормирмализация стилей
function resize(){
var temp_row = $('.table tbody tr:eq(1)')[0];
if(!temp_row) return 0;
col_g = temp_row.childElementCount-1;
b_w =
(temp_row.clientWidth - temp_row.childNodes[0].clientWidth) /col_g;
$('.table tbody td:not(:nth-of-type(1))').css('width', b_w);
$('tbody td:not(:nth-of-type('+(col_g+1)+ 'n+1))').css({
padding:0,
margin:0
});
}
// событие возникающее при изменении размера браузера
window.onresize = resize;
resize();
// инициализация меню для телефонов
$(".button-collapse").sideNav();
// инициализация для модальных окон
$('.modal-trigger').leanModal();
// инициализация выпадающих списков
$('select').material_select();
// коллапс эффект
$('.collapsible').collapsible({
accordion : false
});
// забираем из кукес выбранного преподавателя
$('.collapsible .collapsible-header').eq(
parseInt($.cookie('asd82eash28d28na')) || 0
).addClass('active');
$('.collapsible .collapsible-header').click(function(){
$('.collapsible .collapsible-header').removeClass('active');
$(this).addClass('active');
// заносим выбранного преподователя в кукес
$.cookie('asd82eash28d28na',$(this).attr('tab'),{expires:7});
});
// создает перетаскиваемый блок около курсора,
// а также отмечает клетки, на которые нельзя
// или можно поставить условно (поточная) пару
$('.burden-list .chip').click(function(){
if(parseInt($(this).text()) < 1) return;
$('.myLoader').show();
var temp = $(this).parent().parent();
var div = document.createElement('div');
var block = $(div);
var w, h;
block.addClass($(this).attr('val'));
block.addClass('block');
if(block.hasClass('full_c'))
{w = b_w; h = 60;}
else if(block.hasClass('half_c'))
{w = b_w; h = 30;}
else
{w = b_w/2; h = 30};
var el1 = event;
var el2 = $('#temp')[0].getBoundingClientRect();
var dx = el1.clientX - el2.left - w/2;
var dy = el1.clientY - el2.top - h/2;
block.css({
width: w,
height: h,
lineHeight: h+'px',
left: dx,
top: dy
});
block.attr({
t_id : temp.attr('t_id'),
sb_id : temp.attr('sb_id')
});
block.draggable({
drag: function(event, ui){
obj = $(this);
}
});
$('#temp').empty();
$('#temp').attr('style', 'margin-top: -70px !important;')
$('#temp').append(block);
// обращение к базе данных
$.post('/php/engagedcell.php',{
teacher_id: temp.attr('t_id'),
weekday : $('#weekday option:selected').attr('value')
})
.done(function(data){
$('.engaged').remove();
$('.flow').remove();
for(var i=0; i<n; i++){
for(var j=0; j<m; j++)
if(map[i][j] == leet || map[i][j] == -1)
map[i][j] = 0;
}
$('.myLoader').fadeOut(200);
data = JSON.parse(data);
if(!data) {
$('.myLoader').hide();
return;
}
for(var i=0; i<data.length; i++){
var r = parseInt(data[i].sc_row);
var pos = parseInt(data[i].sc_position, 2);
var row = (r-1)*2;
var div = $('tbody td:not(:nth-of-type('+(col_g+1)+ 'n+1))');
var ll = 0, rr = 0;
switch(pos){
case 15: ll = 0; rr = 4; break;
case 12: ll = 0; rr = 2; break;
case 3: ll = 2; rr = 4; break;
case 8: ll = 0; rr = 1; break;
case 4: ll = 1; rr = 2; break;
case 2: ll = 2; rr = 3; break;
case 1: ll = 3; rr = 4; break;
}
for(var c=1; c<col_g+1; c++){
if(c == data[i].sc_group) continue;
col = (c-1)*2;
for(var jk=ll; jk<rr; jk++){
if(map[row + step[jk][0]][col + step[jk][1]] == 0){
var block = document.createElement('div');
$(block).addClass('h_couple');
if(parseInt(data[i].sc_subject_id) ==
parseInt(temp.attr('sb_id'))){
$(block).addClass('flow');
map[row + step[jk][0]][col + step[jk][1]] = -1;
}
else{
$(block).addClass('engaged');
map[row + step[jk][0]][col + step[jk][1]] = leet;
}
if (jk % 2 == 0) $(block).css({
top: 30*Math.floor(jk / 2),
left: 0
});
else $(block).css({
top: 30*Math.floor(jk / 2),
right: 0
});
$(div[((r-1)*col_g+(c-1))]).append(block);
}
}
}
}
$('.myLoader').hide();
})
});
// забирает из базы данных пары,
// выгружает результат запроса на таблицу
function updataTable(){
$('.myLoader').show();
$.post('/php/tablecell.php',{
faculty: $('#faculty option:selected').attr('value'),
course : $('#course option:selected').attr('value'),
weekday: $('#weekday option:selected').attr('value')
})
.done(function(data){
data = JSON.parse(data);
if(!data) {
$('.myLoader').hide();
return;
}
for(var i=0; i<data.length; i++){
var r = parseInt(data[i].sc_row);
var c = parseInt(data[i].sc_group);
var pos = parseInt(data[i].sc_position, 2);
var row = (r-1)*2, col = (c-1)*2;
var block = document.createElement('div');
$(block).addClass('couple');
$(block).attr({
pos_x : data[i].sc_row,
pos_y : data[i].sc_group,
position : data[i].sc_position
});
switch(pos){
case 15:
$(block).addClass('d_couple');
$(block).css({top: 0, left:0});
// for(var k=0; k<4; k++)
map[row][col] = map[row+1][col] = map[row][col+1] =
map[row+1][col+1] = 4;
break;
case 12:
$(block).addClass('f_couple');
$(block).css({top: 0, left:0});
map[row][col] = map[row][col+1] = 2;
break;
case 3:
$(block).addClass('f_couple');
$(block).css({top: 30, left:0});
map[row+1][col] = map[row+1][col+1] = 2;
break;
case 8:
$(block).addClass('h_couple');
$(block).css({top: 0, left:0});
map[row][col] = 1;
break;
case 4:
$(block).addClass('h_couple');
$(block).css({top: 0, right:0});
map[row][col+1] = 1;
break;
case 2:
$(block).addClass('h_couple');
$(block).css({top: 30, left:0});
map[row+1][col] = 1;
break;
case 1:
$(block).addClass('h_couple');
$(block).css({top: 30, right:0});
map[row+1][col+1] = 1;
break;
}
$(block).addClass('tooltipped');
$(block).attr({
'data-position' : 'top',
'data-tooltip': data[i].sb_title
});
$(block).append(data[i].t_name
+ '<i class="tiny top right material-icons">clear</i>');
var div = $('tbody td:not(:nth-of-type('+(col_g+1)+'n+1))');
$(div[((r-1)*col_g+(c-1))]).append(block);
}
$('.tooltipped').tooltip();
// удаление пары
$('.couple i').click(function(){
$('.myLoader').show();
var couple = $(this).parent();
var position = couple.attr('position');
var row = couple.attr('pos_x');
var group = couple.attr('pos_y');
var faculty = $('#faculty option:selected').attr('value');
var b_size = 0;
if(couple.hasClass('d_couple'))
b_size = 2;
else if(couple.hasClass('f_couple'))
b_size = 1;
$.post('/php/remove.php',{
faculty: faculty,
position: position,
group: group,
row: row,
b_size: b_size
})
.done(function(data){
location.reload();
})
});
$('.myLoader').hide();
});
}
updataTable();
// добавление пары в базу данных
function includeIntoTable(obj, col, row, position, b_size){
var faculty = $('#faculty option:selected').attr('value');
var weekday = $('#weekday option:selected').attr('value');
var course = $('#course option:selected').attr('value');
var t_id = $(obj).attr('t_id');
var sbj_id = $(obj).attr('sb_id');
$('.myLoader').show();
$.post("/php/insert.php", {
faculty: faculty,
group: col,
row : row,
position: position,
teacher_id: t_id,
weekday: weekday,
course: course,
subject_id: sbj_id,
b_size: b_size
})
.done(function(data){
location.reload();
})
}
// событие при "бросании" перетаскиваемого блока
// на таблицу расписания
function insertToSchedule(event){
var el1 = $(obj)[0].getBoundingClientRect();
var el2 = $(this)[0].getBoundingClientRect();
var dx = (el1.top - el2.top < 30) ? 0 : 1;
var dy = (el1.left - el2.left < b_w/2) ? 0 : 1;
var flag = false;
var r = parseInt($(this).attr('row')) * 2;
var c = parseInt($(this).attr('col')) * 2;
if($(obj).hasClass('quater_c')){
var x = r+dx, y = c+dy;
if (map[x][y] <= 0){
row = (x>>1)+1;
col = (y>>1)+1;
position = format_bin( (8>>(dy+2*dx)).toString(2), 4 );
b_size = 0;
if(map[x][y]) {
$('#modal1 p').text('Сделать пару поточной?');
}
else {
$('#modal1 p').text('Добавить в расписание?');
}
$('#modal1').openModal();
}
}
else if($(obj).hasClass('half_c')){
var x = r+dx, y = c;
if(map[x][y]<=0 && map[x][y+1] <= 0){
row = (x>>1)+1;
col = (y>>1)+1;
position = format_bin( ( dx ? 3 : 12 ).toString(2), 4 );
b_size = 1;
if(map[x][y] || map[x][y+1]) {
$('#modal1 p').text('Сделать пару поточной?');
}
else {
$('#modal1 p').text('Добавить в расписание?');
}
$('#modal1').openModal();
}
}
else if(map[r][c]<=0 && map[r+1][c]<=0 && map[r][c+1]<=0
&& map[r+1][c+1]<=0){
var x = r, y = c;
row = (x>>1)+1;
col = (y>>1)+1;
position = format_bin( (15).toString(2), 4 );
b_size = 2;
if(map[x][y] || map[x+1][y] || map[x][y+1] || map[x+1][y+1]) {
$('#modal1 p').text('Сделать пару поточной?');
}
else {
$('#modal1 p').text('Добавить в расписание?');
}
$('#modal1').openModal();
}
}
// добавляем ячейкам таблицы обработчик события drop
var div = $('tbody td:not(:nth-of-type(' + (col_g+1) + 'n+1))');
div.droppable({
drop: insertToSchedule
});
// переход от формы для входа, к форме для регистрации
$('#btn-reg').click(function(e){
$('#sign-in').hide('slow', function(){
$('#registration').show('slow');
});
return false;
});
// переход от формы для регистрации, к форме для входа
$('#back-to-future').click(function(){
$('#registration').hide('slow', function(){
$('#sign-in').show('slow');
});
return false;
});
// (возможно вы сейчас наблюдаете мертвый код)
function alertErr(jq, text){
$(jq).after(
'<div class="alert alert-error"><a class="close" href="#"
data-dismiss="alert">×</a>'+text+'</div>'
);
}
// регистрация
$('#reg').click(function(){
var str;
var nEx = /^.{2,20}$/g;
var sEx = /^.{2,20}$/g;
var lEx = /^[a-zA-Z0-9_-]{4,16}$/g;
var pEx = /^[a-zA-Z0-9_-]{8,20}$/g;
$('.alert').remove();
var name = $("#name").val();
str = nEx.exec(name);
if(str == null || (str[0].length < name.length)){
alertErr('#registration legend', 'Неверно введено имя');
return false;
}
var surname = $("#surname").val();
str = sEx.exec(surname);
if(str == null || (str[0].length < surname.length)){
alertErr('#registration legend', 'Неверно введено фамилия');
return false;
}
var login = $("#login").val();
str = lEx.exec(login);
if(str == null || (str[0].length < login.length)){
alertErr('#registration legend', 'Неверный логин. <br> Логин
должен содержать от 4 до 16 символов (латински буквы,
нижнее подчеркивание, дефис).'
);
return false;
}
var pass = $("#pass").val();
str = pEx.exec(pass);
if(str == null || (str[0].length < pass.length)){
alertErr('#registration legend', 'Неверный пароль.<br>Пароль
должен содержать от 8 до 20 символов (латински буквы,
нижнее подчеркивание, дефис).'
);
return false;
}
$.post("/php/reg.php",{
name: name,
surname: surname,
login: login,
pass: pass
})
.done(function(data){
if(data){
location = '/';
}
else{
alertErr('#registration legend', 'Такой логин уже занят.');
}
})
.fail(function(){
alert('ajax ошибка');
});
return false;
});
// конец сессии
$('.exit').click(function(){
$.post("/php/exit.php").done(function(){location='/';});
});
// (возможно вы сейчас наблюдаете мертвый код)
$('.select').change(function(){
var faculty = $('#faculty option:selected').attr('value');
var course = $('#course option:selected').attr('value');
var weekday = $('#weekday option:selected').attr('value');
location = "/index.php?faculty="+faculty+
"&course="+course+"&weekday="+weekday;
});
$('#inside').click(function(){
includeIntoTable(obj, col, row, position, b_size);
})
});
Содержание файла engagedcell.php
<?php
include('db_connect.php');
$sql = "
SELECT sc_row, sc_group, sc_position, sc_subject_id
FROM schedule
WHERE sc_weekday = ".$_POST['weekday']."
AND sc_teacher_id = ".$_POST['teacher_id']."
";
$query = mysql_query($sql);
$i=0;
while($row = mysql_fetch_array($query)){
$global[$i] = $row;
$i++;
}
echo json_encode($global);
?>
Содержание файла tablecell.php
<?php
include('db_connect.php');
$sql = "
SELECT sc_row, sc_group, sc_position, sc_subject_id
FROM schedule
WHERE sc_weekday = ".$_POST['weekday']."
AND sc_teacher_id = ".$_POST['teacher_id']."
";
$query = mysql_query($sql);
$i=0;
while($row = mysql_fetch_array($query)){
$global[$i] = $row;
$i++;
}
echo json_encode($global);
?>