Система автоматизации учета учащихся

Обзор требований к разрабатываемой системе автоматизации учета учащихся. Сравнительный анализ и выбор инструментальных средств. Обоснование выбора программных средств реализации. Язык веб-программирования PHP. Система управления базами данных MySQL.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 13.06.2014
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Рисунок 6 - Схема программы для администратора

Рисунок 7 - Схема программы для пользователя

3.3 Проектирование структуры базы данных

В системе автоматизации учета потребуется хранить следующую информацию:

Данные ученика:

Фамилия

Имя

Отчество

Дата рождения

Домашний адрес

Класс

Данные родителей:

Фамилия

Имя

Отчество

Место работы

Данные учителей:

Фамилия

Имя

Отчество

Предмет

Категория

Сведения по успеваемости учащихся: годовые оценки по предметам.

Сведения о занятиях в секциях и кружках.

Сведения об участии в олимпиадах, соревнованиях, конкурсах.

Сведения о составе семьи: полная, неполная, опекунская.

При проектировании реляционной базы данных следует применять нормализацию данных. Нормализация - процесс преобразования отношений базы данных к виду, отвечающему нормальным формам. Основной целью нормализации является уменьшение потенциальной противоречивости хранимой в базе данных информации.

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

Вторая нормальная форма достигается за счет удаление всех неключевых атрибутов, которые зависят только от части первичного ключа. Такие атрибуты называются частично зависимыми. Неключевые атрибуты заключают в себе информацию о данной сущности предметной области, но не идентифицируют ее уникальным образом.

Для построения концептуальной модели базы данных определим основные объекты и связи.

Основными объектами являются:

ученики;

учителя;

классы;

предметы.

Обучение в школе происходит поэтапно (с 1-го по 11-й класс). В каждом классе (году обучение) есть свой набор предметов. Чтобы перейти из класса в класс необходимо проучиться учебный год и получить годовые оценки по предметам, изучаемым в этом классе. Оценки по предметам учитываются в журнале. На каждом этапе классов может быть несколько (например, 1А, 1Б, 1В). Если ученик не справился с учебной программой, то он может остаться на второй учебный год в том же классе. Оценки по предметам учитываются в журнале.

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

Каждый учитель в школе преподает предметы (один или более) в разных классах. Уровень профессиональных навыков учителя характеризуется категорией.

Схема связей объектной области созданной базы данных изображена на рисунке 8.

Рисунок 8 - Схема связей объектной области базы данных

Проектирование базы данных осуществлялась при помощи сервиса dbdsngr (сайт: dbdsngr.appspot.com), который позволяет при помощи визуальных средств создать структуру и сгенерировать SQL-код для формирования базы данных в СУБД MySQL.

Схема базы данных гимназии в виде таблиц со связями изображена на рисунке 9.

Рисунок 9 - Схема базы данных в виде таблиц со связями

4. Реализация системы

4.1 Создание базы данных

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

Реализация системы состоит из четырех этапов:

Создание и наполнение базы данных для тестирования.

Реализация пользовательского интерфейса средствами фрейморка CodeIngres (используя концепцию MVC).

Программирование контроллеров для взаимодействия через интерфейс системы с базой данных.

Тестирование системы.

База данных представлена 16 таблицами. Полное описание каждой таблицы базы данных гимназии отображено в таблицах 1-16.

Следует отметить, что учебный год не совпадает с календарным годом. Учебный год начинается 1 сентября одного календарного года, а завершается 31 мая следующего календарного года. Для удобства представления в базу данных вносится год, который совпадает с началом учебного. Так как учебный год является основным фильтром для поиска, то по нему не проводилось нормализации базы данных. Это позволило упростить программную реализацию системы.

Таблица 1 - Структура таблицы pupil (ученик)

Атрибут

Тип данных

Комментарий

id_pupil

Int

Идентификатор ученика

Первичный ключ

surname

varchar(30)

Фамилия ученика

name

varchar(12)

Имя ученика

last_name

varchar(15)

Отчество ученика

birthday

Data

День рождения

address

varchar(80)

Место жительства

Структура таблицы pupil предназначена для хранения сведений об учениках.

Столбец id_pupil генерируется автоматически при добавлении записи в таблицу и является уникальным идентификатором ученика и является первичным ключом.

SQL-запрос для создания таблицы pupil:

CREATE TABLE 'pupil' (

'id_pupil' INT NOT NULL AUTO_INCREMENT,

PRIMARY KEY ('id_pupil')

'surname' VARCHAR(30),

'name' VARCHAR(12),

'last_name' VARCHAR(15),

'birthday' DATE,

'address' VARCHAR(80)

);

Таблица 2 - Структура таблицы parent (родитель)

Атрибут

Тип данных

Комментарий

id_parent

int

Идентификатор родителя

Первичный ключ

surname

varchar(30)

Фамилия ученика

name

varchar(12)

Имя учителя

last_name

varchar(15)

Отчество учителя

job

varchar(80)

Место работы

Структура таблицы parent предназначена для хранения сведений о родителях.

Столбец id_parent генерируется автоматически при добавлении записи в таблицу и является уникальным идентификатором родителя.

SQL-запрос для создания таблицы parent:

CREATE TABLE 'parent' (

'id_parent' INT NOT NULL AUTO_INCREMENT,

PRIMARY KEY ('id_parent')

'surname' VARCHAR(30),

'name' VARCHAR(12),

'last_name' VARCHAR(15),

'job' VARCHAR(80)

);

Таблица 3 - Структура таблицы family (семья)

Атрибут

Тип данных

Комментарий

id_pupil

int

Внешний ключ

id_parent

int

Внешний ключ

status

varchar(10)

Отец, мать, опекун

Структура таблицы family предназначена для хранения сведений о составе семьи.

SQL-запросы для создания таблицы family:

CREATE TABLE 'family' (

'id_pupil' INT,

'id_parent' INT,

'status' VARCHAR(15)

);

ALTER TABLE 'family' ADD CONSTRAINT 'family_fk1' FOREIGN KEY ('id_pupil') REFERENCES pupil('id_pupil');

ALTER TABLE 'family' ADD CONSTRAINT 'family_fk2' FOREIGN KEY ('id_parent') REFERENCES parent('id_parent');

Таблица 4 - Структура таблицы teacher (учитель)

Атрибут

Тип данных

Комментарий

id_teacher

int

Идентификатор учителя

Первичный ключ

surname

varchar(30)

Фамилия учителя

name

varchar(12)

Имя учителя

last_name

varchar(15)

Отчество учителя

id_category

int

Внешний ключ

Структура таблицы teacher предназначена для хранения данных об учителях.

Столбец id_teacher генерируется автоматически при добавлении записи в таблицу и является уникальным идентификатором учителя.

SQL-запросы для создания таблицы teacher:

CREATE TABLE 'teacher' (

'id_teacher' INT NOT NULL AUTO_INCREMENT,

PRIMARY KEY ('id_teacher')

'surname' VARCHAR(30),

'name' VARCHAR(12),

'last_name' VARCHAR(15),

'id_category' INT

);

ALTER TABLE 'teacher' ADD CONSTRAINT 'teacher_fk1' FOREIGN KEY ('id_category') REFERENCES category('id_category');

Таблица 5 - Структура таблицы category (категория учителя)

id_category

int

Первичный ключ

rank

varchar(30)

Категория учителя

Структура таблицы category предназначена для хранения сведений о категории учителя (эта таблица-справочник).

Столбец id_category генерируется автоматически при добавлении записи в таблицу и является уникальным идентификатором категории учителя.

SQL-запрос для создания таблицы category:

CREATE TABLE 'category' (

'id_category' INT NOT NULL AUTO_INCREMENT,

PRIMARY KEY ('id_category')

'rank' VARCHAR(30)

);

Таблица 6 - Структура таблицы teaching (преподавание)

Атрибут

Тип данных

Комментарий

id_teacher

int

Внешний ключ

year

year

Учебный год

id_subject

int

Внешний ключ

id_class

int

Внешний ключ

Структура таблицы teaching предназначена для хранения данных о работе учителей.

SQL-запросы для создания таблицы teaching:

CREATE TABLE 'teaching' (

'id_teacher' INT,

'year' YEAR,

'id_subject' INT,

'id_class' INT

);

ALTER TABLE 'teaching' ADD CONSTRAINT 'teaching_fk1' FOREIGN KEY ('id_teacher') REFERENCES teacher('id_teacher');

ALTER TABLE 'teaching' ADD CONSTRAINT 'teaching_fk2' FOREIGN KEY ('id_subject') REFERENCES subject('id_subject');

ALTER TABLE 'teaching' ADD CONSTRAINT 'teaching_fk3' FOREIGN KEY ('id_class') REFERENCES class('id_class');

Таблица 7 - Структура таблицы studies (обучение)

Атрибут

Тип данных

Комментарий

id_pupil

int

Внешний ключ

year

year

Учебный год

id_class

int

Внешний ключ

Структура таблицы studies предназначена для хранения данных о родителях.

SQL-запросы для создания базы данных:

CREATE TABLE 'studies' (

'id_pupil' INT,

'year' YEAR,

'id_class' INT

);

ALTER TABLE 'studies' ADD CONSTRAINT 'studies_fk1' FOREIGN KEY ('id_pupil') REFERENCES pupil('id_pupil');

ALTER TABLE 'studies' ADD CONSTRAINT 'studies_fk2' FOREIGN KEY ('id_class') REFERENCES class('id_class');

Таблица 8 - Структура таблицы class (класс)

Атрибут

Тип данных

Комментарий

id_class

int

Идентификатор класса

Первичный ключ

class_level

int

Класс (год обучения)

class_letter

char

Класс (буква)

Структура таблицы class предназначена для хранения данных о классах (таблица-справочник).

Столбец id_class генерируется автоматически при добавлении записи в таблицу и является уникальным идентификатором класс.

SQL-запрос для создания таблицы class:

CREATE TABLE 'class' (

'id_class' INT NOT NULL AUTO_INCREMENT,

PRIMARY KEY ('id_class')

'class_level' INT,

'class_letter' CHAR,

);

Таблица 9 - Структура таблицы subject (секции)

Атрибут

Тип данных

Комментарий

id_subject

int

Первичный ключ

subject_title

varchar(20)

Название предмета

Структура таблицы subject предназначена для хранения данных о школьных предметах (таблица-справочник).

Столбец id_subject генерируется автоматически при добавлении записи в таблицу и является уникальным идентификатором школьного предмета.

SQL-запрос для создания таблицы subject:

CREATE TABLE 'subject' (

'id_subject' INT NOT NULL AUTO_INCREMENT,

PRIMARY KEY ('id_subject')

'subject_title' VARCHAR(20)

);

Таблица 10 - Структура таблицы journal (журнал)

Атрибут

Тип данных

Комментарий

id_pupil

int

Внешний ключ

year

year

Учебный год

id_subject

int

Предмет

point

int

Годовая оценка по предмету

Структура таблицы journal предназначена для хранения данных об годовых оценках по предметам.

SQL-запросы для создания таблицы journal:

CREATE TABLE 'journal' (

'id_pupil' INT,

'year' YEAR,

'id_subject' INT,

'subject_title' VARCHAR(20)

'point' INT

);

ALTER TABLE 'journal' ADD CONSTRAINT 'journal_fk1' FOREIGN KEY ('id_pupil') REFERENCES pupil('id_pupil');

ALTER TABLE 'journal' ADD CONSTRAINT 'journal_fk2' FOREIGN KEY ('id_subject') REFERENCES subject('id_subject');

Таблица 11 - Структура таблицы section (участие в секциях)

Атрибут

Тип данных

Комментарий

id_pupil

Внешний ключ

year

year

Учебный год

id_club

int

Внешний ключ

Структура таблицы section предназначена для хранения данных о секциях и кружках, в которых заняты ученики.

SQL-запросы для создания таблицы section:

CREATE TABLE 'section' (

'id_pupil' INT

'year' YEAR,

'id_club' INT

);

ALTER TABLE 'section' ADD CONSTRAINT 'section_fk1' FOREIGN KEY ('id_pupil') REFERENCES pupil('id_pupil');

ALTER TABLE 'section' ADD CONSTRAINT 'section_fk2' FOREIGN KEY ('id_club') REFERENCES club('id_club');

Таблица 12 - Структура таблицы club (секции)

Атрибут

Тип данных

Комментарий

id_club

int

Идентификатор класс

Первичный ключ

club_title

varchar(20)

Название секции, кружка

Структура таблицы club предназначена для хранения данных о секциях и кружках (таблица-справочник).

SQL-запрос для создания таблицы club:

CREATE TABLE 'club' (

'id_club' INT NOT NULL AUTO_INCREMENT,

PRIMARY KEY ('id_club')

'club_title' VARCHAR(20)

);

Таблица 13 - Структура таблицы olympiad (участие в олимпиадах)

Атрибут

Тип данных

Комментарий

id_pupil

Int

Внешний ключ

year

Year

Учебный год

id_subject

Int

Внешний ключ

id_region

Int

Внешний ключ

id_result

Int

Внешний ключ

Структура таблицы olympiad предназначена для хранения данных об участниках олимпиад.

SQL-запросы для создания таблицы olympiad:

CREATE TABLE 'olympiad' (

'id_pupil' INT

'year' YEAR,

'id_club' INT,

'id_region' INT,

'id_result' INT

);

ALTER TABLE 'olympiad' ADD CONSTRAINT 'olympiad_fk1' FOREIGN KEY ('id_pupil') REFERENCES pupil('id_pupil');

ALTER TABLE 'olympiad' ADD CONSTRAINT 'olympiad_fk2' FOREIGN KEY ('id_subject') REFERENCES subject('id_subject');

ALTER TABLE 'olympiad' ADD CONSTRAINT 'olympiad_fk3' FOREIGN KEY ('id_region') REFERENCES region('id_region');

ALTER TABLE 'olympiad' ADD CONSTRAINT 'olympiad_fk4' FOREIGN KEY ('id_result') REFERENCES result('id_result');

Таблица 14 - Структура таблицы contest (участие в соревнованиях)

Атрибут

Тип данных

Комментарий

id_pupil

Int

Внешний ключ

year

year

Учебный год

id_club

int

Внешний ключ

id_region

int

Внешний ключ

id_result

int

Внешний ключ

Структура таблицы contest предназначена для хранения данных об участниках конкурсов и соревнований.

SQL-запросы для создания таблицы contest:

CREATE TABLE 'contest' (

'id_pupil' INT

'year' YEAR,

'id_club' INT,

'id_region' INT,

'id_result' INT

);

ALTER TABLE 'contest' ADD CONSTRAINT 'contest_fk1' FOREIGN KEY ('id_pupil') REFERENCES pupil('id_pupil');

ALTER TABLE 'contest' ADD CONSTRAINT 'contest_fk2' FOREIGN KEY ('id_club') REFERENCES club('id_club');

ALTER TABLE 'contest' ADD CONSTRAINT 'contest_fk3' FOREIGN KEY ('id_region') REFERENCES region('id_region');

ALTER TABLE 'contest' ADD CONSTRAINT 'contest_fk4' FOREIGN KEY ('id_result') REFERENCES result('id_result');

Таблица 15 - Структура таблицы region (уровень соревнования)

Атрибут

Тип данных

Комментарий

id_region

int

Идентификатор уровня

Первичный ключ

status

varchar(15)

Уровень соревнования

Структура таблицы region предназначена для хранения сведений об уровне олимпиады, соревнования, конкурса (таблица-справочник).

Столбец id_region генерируется автоматически при добавлении записи в таблицу и является уникальным идентификатором уровня олимпиады, соревнования, конкурса.

SQL-запрос для создания таблицы region:

CREATE TABLE 'region' (

'id_region' INT,

'status' VARCHAR(15)

);

Таблица 16 - Структура таблицы result (результаты)

Атрибут

Тип данных

Комментарий

id_result

int

Идентификатор результата

Первичный ключ

position

varchar(20)

Результат выступления

Структура таблицы result предназначена для хранения данных о результатах выступления на олимпиадах, соревнованиях, конкурсах (таблица-справочник).

Столбец id_result генерируется автоматически при добавлении записи в таблицу и является уникальным идентификатором результата выступления на олимпиаде, соревновании, конкурсе.

SQL-запрос для создания таблицы result:

CREATE TABLE 'result' (

'id_result' INT

'position' VARCHAR(20)

);

4.2 Разработка пользовательского интерфейса

Для начала пользователю предлагается ввести логин и пароль для входа в систему, как показано на рисунке 10.

Рисунок 10 - Меню входа в систему

Если логин и/или пароль введены неверно, то выдается сообщение об ошибке и предложение повторить ввод ещё раз (рисунок 11).

Рисунок 11 - Ошибка ввода логина и/или пароля

В зависимости от логина выбирается версия системы. Существует 2 варианта: для администратора (логин: admin) и пользователей. Отличие заключается в наличии меню «Администрирование» для администратора (рисунок 12, 13).

Рисунок 12 - Интерфейс модуля администрирования

Рисунок 13 - Вариант системы для обычного пользователя

В меню «Редактирование» данные представлены по категориям (рисунок 14):

Ученики;

Учителя;

Справочники (Классы, Предметы, Клубы, Уровни, Результаты).

Категории «Ученики и «Учителя» имеют свои подкатегории, «Справочники» заполняются по мере необходимости.

Рисунок 14 - Общий вид меню редактирования

Для примера работы меню «Редактирование» выберем справочник «Предметы». В интерфейсе отображается список предметов и действий, которые можно выполнить (добавить, удалить предмет, редактировать), как показано на рисунке 15.

Рисунок 15 - Меню редактирование словарь предмета

Процесс добавления записи происходит в несколько этапов. Для начала мы выбираем категорию (например, «Ученики»). Среди учеников мы выбираем запись, которую планируем редактировать. Все записи в колонках отсортированы по алфавиту слева сверху вниз и слева направо. Отмечаем конкретного ученика при помощи метки в левой колонке (checkbox), как показано на рисунке 16. Выбираем подкатегорию для ученика (в нашем случае - «Секции»).

Рисунок 16 - Редактирование конкретного ученика

На вкладке редактирования «Секции» для конкретного ученика мы видим записи связанные с учеником и его участием в секциях и кружках (по годам). Мы можем добавить, удалить или редактировать записи, отметив данные о секции в таблице (рисунок 17).

Рисунок 17 - Редактирование данных по секциям, в которых занят ученик

Для примера добавим новую секцию для ученика (рисунок 18). Нам предлагается выбрать учебный год, когда ученик занимался в секции и название секции из списка. Доступно сохранение и отмена операции добавления записи.

Рисунок 18 - Добавление новой информации по занятиям в секции

В меню поиск представлены следующие категории:

Ученики

Учителя

Секции

Олимпиады

Соревнования

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

Результаты поиска можно распечатать или перейти к новому поиску.

Общий вид формы поиска по категории «Учитель» представлен на рисунке 19.

Рисунок 19 - Форма поиска по категории «Учитель»

Выход из системы осуществляется по нажатию кнопки меню «Выход». Система запрашивает подтверждение: Выйти из системы?. Если получен положительный ответ (Да), то осуществляется выход из системы и переход на страницу входа. Если получен отрицательный ответ (Нет), то система возвращается в главное окно приложение (с активной кнопкой «Выход»), как изображено на рисунке 20.

Рисунок 20 - Диалог подтверждения выхода из системы

4.3 Разработка приложения

4.3.1 Принцип работы приложения

Так как система автоматизации учета является типовой задачей, то проектирование системы велось в фрейворке CodeIngres с применением концепции MVC, что позволило минимизировать время разработки и упростило её реализацию.

Авторизация.

На сервере проверяется наличие переменных сессии если они есть или есть cookie для данного пользователя, то авторизация считается успешной. Иначе пользователя перенаправляют на страницу логина, где он вводит пароль, имя пользователя и после подтверждения на сервер отправляется запрос подтверждения данных, если данные имеются в базе пользователю отсылаются cookie об успешной авторизации и перенаправляют на главную страницу системы управления.

Обработка запроса сервером.

Локальный компьютер (или сервер), на котором установлено приложение получает пакет HTTP на порт 80 и передает веб-серверу Apache. Веб-сервер определяет наличие домена в его таблице идет в каталог сайта и читает файл.htaccess, в котором описано как формировать страницу (картинки js скрипты напрямую) и запускаться файл index.php.

Файл index.php подключает в себя файл конфигурации, в котором описаны основные переменные, используемые в системе (подключение к базе данных, названия таблиц, каталоги), а также файл содержащий класс bootstrap. Класс bootstrap занимается разбором URL по которому произошел запрос, сначала определяется контроллер отвечающий за запрос, затем вызываемый метод и выполняется запрос пользователя.

Формирование страницы на сервере

Процесс формирование страницы начинается с контроллера, который определяет, какие данные необходимо представить пользователю, если необходимо обращается к модели и получает данные из базы данных формирует массивы данных для вывода и передает их в вид который используя переданные данные и шаблон формирует вывод страницы.

Управление контентом

В панели управления есть возможность управления контентом :

Добавление, удаление и модификация записей.

Все управление осуществляется с помощью ajax запросов (для уменьшения трафика между сервером и браузером пользователя).

Выход

Для выхода из системы управления сервер удаляет текущую сессию и чистит пользовательские cookie.

4.3.2 Физическая структура приложения

Главный каталог системы состоит из 5 папок и 2 файлов.

Папки:

auth

config

libs

controllers

models

views

Файлы:

.htaccess

index.php

4.4 Тестирование системы

Тестирование системы необходимо для проверки ошибок в коде и взаимодействии модулей системы между собой. На этапе проектирования была выбрана концепция MVC (Model-View-Controller), при которой модификация одного из компонентов оказывает минимальное влияние на другие. Это позволило упростить и сократить этап тестирования кода.

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

Система была протестирована по следующим пунктам:

1. Вход в систему:

корректный ввод логина и пароля;

ситуация ввода логина и/или пароля c ошибкой.

2. Раздел администрирования:

переход в раздел администрирования из разных частей приложения (через главное меню);

корректность отображения данных о пользователях системы (в режиме admin);

добавление нового пользователя, назначение логина и пароля, проверка входа в систему с этими данными;

удаление нового пользователя, отказа в доступе при входе систему удаленного пользователя;

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

3. Раздел редактирования базы данных:

доступность функций раздела редактирования для разных пользователей (admin, guest);

связь полей форм интерфейса с данными в базе;

добавление данных в базу, в том числе и связанных данных;

удаление данных из базы, в том числе удаление всех связанных данных (например, удаление сведений об ученике).

проверена корректность данных после редактирования.

4. Раздел поиска:

доступность функций раздела поиска для разных пользователей (admin, guest);

корректность результатов поиска по полям с использованием фильтров;

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

5. Выход из системы:

проверена корректность работы формы (диалога) на подтверждение выхода из системы: Выйти из системы? (Да/Нет);

протестирована корректность выхода из системы, удаление сессии пользователя после согласия покинуть систему (удаление cookie).

Взаимодействие пользователя с системой осуществляется посредством браузера. Так как выбор браузера остается за пользователем, а у каждого браузера своя специфика в отображении некоторых элементов HTML-кода, потребовалось визуальное тестирование отображения элементов интерфейса.

Тестирование проводилось в браузерах:

Internet Explorer (версии 6 и 7);

Mozilla Firefox (версии 11 и 13);

Google Chrome (версии 35);

Opera (версии 12).

Во всех браузерах интерфейс отображается корректно.

Программный комплекс позволяет запустить систему учета, как на персональном компьютере (эмуляция веб-сервера), так и в локальной (глобальной) сети в режиме клиент-сервер.

Для тестирования работы системы на персональном компьютере применялся набор веб-разработчика Denwer 3 для ОС Windows.

В состав пакета входят следующие дистрибутивы:

Веб-сервер Apache 2.2.22 (SSL, SSI, mod_rewrite, mod_php);

PHP 5.3.13 с поддержкой GD, MySQL, SQLite;

СУБД MySQL 5.5 с поддержкой транзакций;

phpMyAdmin 3.5 - система управления MySQL через Web-интерфейс.

С указанной конфигурацией Denwer система корректно работала и в локальной сети гимназии.

Все выявленные на этапе тестирования ошибки были устранены.

Заключение

Разработанная система автоматизации учета учащихся гимназии предназначена для хранения и анализа первичных данных учащихся.

Система содержит основную информацию об учащихся (фамилия, имя, отчество, дата рождения, домашний адрес, информацию о родителях и т.д.), а также достижения в различных областях учебно-воспитательного процесса (участие в конкурсах, спортивных соревнованиях, их результативность и т.д.).

Она обеспечивает возможность удаления, добавления и редактирования записей как основных, так и подчиненных таблиц данных. Так же предоставляет возможность просмотра полных данных по каждой таблице и по всей базе данных в целом, поддерживать полноту информации.

Работа системы заключается в обслуживании двух встречных потоков новой информации: ввода новой информации и выдачи текущей информации по конкретному запросу. Эти требования обеспечиваются наличием стандартных процедур поиска информации и тем, что данные системы расположены в определенном порядке.

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

Достоинство созданной системы - открытость платформы, переносимость и расширяемость. Это позволяет добавлять к системе новые функции или совершенствовать уже имеющиеся.

При подготовке дипломной работы особое внимание уделялось изучению современных технологий проектирования и реализации. В качестве основы для системы была выбрана архитектура клиент-сервер, где сервер реализован на базе технологии WAMP (Windows-Apache-MySQL-PHP), а клиентом выступает обычный браузер. Для упрощения создания программной части системы использовалась концепция MVC (Model-View-Controller). Проектирование системы выполнялось средствами фреймворка CodeIngres.

В ходе работы над проектом были получены знания по следующим технологиям:

язык гипертекстовой разметки документов HTML;

проектирование реляционных баз данных и язык запросов SQL;

СУБД MySQL;

концепция MVC (Model-View-Controller);

язык программирования PHP и фреймворк CodeIngress.

Список используемых источников

Базы данных: Учебник для высших учебных заведений / Под ред. Проф. А.Д. Хомоненко. - 4-е изд. - СПб.: Корона Принт, 2004. - 736.

Бейли, Л. Изучаем PHP и MySQL / Л. Бейли, М. Моррисон. - Эсмо, 2010. - 800 с.

Гольцман, В. MySQL 5.0. Библиотека программиста / В. Гольцман. - Питер, 2010. - 370 с.

Дейт К.Дж. Введение в системы баз данных / Introduction to Database Systems. - 8-е изд. - М.: Вильямс, 2005. - 1328 с.

Колисниченко, Д.Н. PHP 5/6 и MySQL 6. Разработка Web-приложений / Д.Н. Колисниченко. - БХВ-Петербург, 2011. - 528 с.

Комолова, Н. HTML: самоучитель / Н. Комолова, Е. Яковлева. - СПб.: Питер, 2011. - 288 с.

Кузнецов, М.В. MySQL на примерах / М.В. Кузнецов, И.В. Симдянов. - СПб.: БХВ-Петербург, 2007. - 592 с.

Кузнецов, М.В. PHP 5 на примерах / М.В. Кузнецов, И.В. Симдянов, С.В. Голышев. - СПб.: БХВ-Петербург, 2006. - 576 с.

Прохоренок, Н.А. HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера / Н.А. Прохоренок. - СПб.: БХВ-Петербург, 2010. - 912 с.

Ташков, П. А. Веб-мастеринг. HTML, CSS, JavaScript, PHP, CMS, AJAX, раскрутка / П.А. Ташков. - СПб.: Питер, 2010. - 512 с.

Харрис, Э. PHP/MySQL для начинающих / Э. Харрис. - М.: Кудиц-Образ, 2005. - 384 с.

CodeIgniter User Guide Version 2.1.3 [Электронный ресурс] - Режим доступа: http://cidocs.ru/213e/overview/at_a_glance.html. - Дата доступа: 30.04.2014.

История и традиции ГУО «Гомельская Ирининская гимназия» [Электронный ресурс] / Сайт ГУО «Гомельская Ирининская гимназия». - Гомель, 2014. - Режим доступа: http://www.iringimnaz.gomel.by. - Дата доступа: 27.04.2014.

Описание ШГИС [Электронный ресурс] / Сайт «Школьная Городская Информационная Система». - Гомель, 2013. - Режим доступа: dnevnik.iptv.by. - Дата доступа: 02.05.2014.

Компания «ИНИС-СОФТ». Продукты [Электронный ресурс] / Сайт Компании «ИНИС-СОФТ». - Минск, 2014. - Режим доступа: www.inissoft.by/products.shtml. - Дата доступа: 02.05.2014.

Приложения

Приложение А

Авторизация и конфигурационные файлы

Файл: index.php (корневой каталог)

<?php

require 'config/config.php';

require 'auth/auth.php';

function __autoload($class)

{

require(LIBS. $class. ".php");

}

$app = new bootstrap();

$app->init();

Пака: auth

Файл: auth.php

<?php

class Auth

{

public static function handleLogin()

{

if (session_id() == '')

{

session_start();

}

if (!isset($_SESSION["loggedInadmin"]) && $_COOKIE["auth"] !== "admin")

{

$_SESSION["loggedInadmin"] = TRUE;

}

if ((!isset($_SESSION["loggedInadmin"]) && $_SESSION["loggedInadmin"] != TRUE ) || $_COOKIE["auth"] !== "admin")

{

session_destroy();

header('location: '. URL. 'login');

exit;

}

}

public static function handlen()

{

SetCookie("auth", "admin", time() - 3600);

if (session_id() == '')

session_start();

if (!isset($_SESSION["loggedInadmin"]) && $_SESSION["loggedInadmin"] != true)

{

session_destroy();

header('location: '. URL. 'login');

exit;

}

}

}

Папка: config

Файл: config.php

<?php

define('DB_TYPE', 'mysql');

define('DB_HOST', '127.0.0.1');

define('DB_NAME', 'melsto_teacher');

define('DB_USER', 'melsto_teacher');

define('DB_PASS', '834Hdkjshf24kjsf');

define('URL', 'http://localhost/');

define('HOST_ROOT', $_SERVER['DOCUMENT_ROOT']. '/');

define('SITE', 'localhost');

define('DOMAIN', 'localhost');

define('MAIN_DIR', dirname(__FILE__));

define('LIBS', 'libs/');

define('TABLE_PREF', 'sc_');

/* ADMIN */

define('USERS', TABLE_PREF. 'users');

define('USER_ID', TABLE_PREF. 'id_user');

define('USER_LOGIN', TABLE_PREF. 'login');

define('USER_PASS_H', TABLE_PREF. 'passw');

define('USER_PASS_H', TABLE_PREF. 'user_name');

/* ПРЕДМЕТЫ */

define('SUBJECTS', TABLE_PREF. 'subjects');

define('SUBJECT_ID', TABLE_PREF. 'id_subject');

define('SUBJECT_NAME', TABLE_PREF. 'name_subject');

/* УЧИТЕЛЯ */

define('TEACHERS', TABLE_PREF. 'teachers');

define('TEACHER_ID', TABLE_PREF. 'teacher_id');

define('TEACHER_NAME', TABLE_PREF. 'teacher_name');

define('TEACHER_SURNAME', TABLE_PREF. 'teacher_surname');

define('TEACHER_LASTNAME', TABLE_PREF. 'teacher_lastname');

define('TEACHER_EXPERIENCE', TABLE_PREF. 'teacher_experiense');

define('TEACHER_CATEGORY', TABLE_PREF. 'teacher_category');

define('TEACHER_SUBJECT', TABLE_PREF. 'teacher_subject');

/* УЧЕНИКИ */

define('PUPILS', TABLE_PREF. 'pupils');

define('PUPIL_ID', TABLE_PREF. 'pupil_id'

define('PUPIL_NAME', TABLE_PREF. 'pupil_name');

define('PUPIL_SURNAME', TABLE_PREF. 'pupil_surname');

define('PUPIL_LASTNAME', TABLE_PREF. 'pupil_lastname');

define('PUPIL_BIRTHDAY', TABLE_PREF. 'pupil_birthday'); define('PUPIL_ADRESS', TABLE_PREF. 'pupil_adress');

/* УСПЕВАЕМОСТЬ */

define('STUDY', TABLE_PREF. 'study');

define('STUDY_ID', TABLE_PREF. 'study');

define('STUDY_YEAR', TABLE_PREF. 'study');

define('STUDY_ID_SUBJECT', TABLE_PREF. 'study'); define('STUDY_ID_TEACHER', TABLE_PREF. 'study'); define('STUDY_POINT', TABLE_PREF. 'study');

/* СЕКЦИИ */

define('CLUB', TABLE_PREF. '');

define('CLUB_ID', TABLE_PREF. '');

define('CLUB_YEAR', TABLE_PREF. '');

define('CLUB_ID_PUPIL', TABLE_PREF. '');

define('CLUB_ID_SECTION', TABLE_PREF. '');

define('SECTION', TABLE_PREF. '');

define('SECTION_ID', TABLE_PREF. '');

define('SECTION_NAME', TABLE_PREF. '');

Приложение Б

Model (Модель)

Папка: models

Файлы:

admin_model.php

form_model.php

index_model.php

login_model.php

Файл: admin_model.php

<?php

class admin_model extends model

{

function __construct()

{

parent::__construct();

}

function _select_subjects()

{

$subjects = $this->db->select("SELECT * FROM ". SUBJECTS);

return (count($subjects) === 0) ? array() : $subjects;

}

function _select_teachers()

{

$subjects = $this->db->select("SELECT * FROM ". TEACHERS);

return (count($subjects) === 0) ? array() : $subjects;

}

function _select_pupils()

{

$subjects = $this->db->select("SELECT * FROM ". PUPILS);

return (count($subjects) === 0) ? array() : $subjects;

}

}

Файл: form_model.php

<?php

class form_model extends model

{

function __construct()

{

parent::__construct();

}

function _update_subject($id, $name)

{

$this->db->update(SUBJECTS, array(

SUBJECT_NAME => $name), SUBJECT_ID. '='. $id);

}

function _add_subject($name)

{

echo $this->db->insert(SUBJECTS, array(

SUBJECT_NAME => $name));

}

function _update_teacher($id, $name, $surname, $lastname, $experience, $category, $subject)

{

$this->db->update(TEACHERS, array(

TEACHER_NAME => $name,

TEACHER_SURNAME => $surname,

TEACHER_LASTNAME => $lastname,

TEACHER_EXPERIENCE => $experience,

TEACHER_CATEGORY => $category,

TEACHER_SUBJECT => $subject

), TEACHER_ID. '='. $id);

}

function _add_teacher($name, $surname, $lastname, $experience, $category, $subject)

{

echo $this->db->insert(TEACHERS, array(

TEACHER_NAME => $name,

TEACHER_SURNAME => $surname,

TEACHER_LASTNAME => $lastname,

TEACHER_EXPERIENCE => $experience,

TEACHER_CATEGORY => $category,

TEACHER_SUBJECT => $subject

));

}

function _delete_teacher($id)

{

echo $this->db->delete(TEACHERS, TEACHER_ID. '='. $id);

}

function _update_pupil($id, $name, $surname, $lastname, $birthday, $adress, $mather, $father)

{

$this->db->update(PUPILS, array(

PUPIL_NAME => $name,

PUPIL_SURNAME => $surname,

PUPIL_LASTNAME => $lastname,

PUPIL_BIRTHDAY => $birthday,

PUPIL_ADRESS => $adress,

PUPIL_PARENT_MATHER => $mather,

PUPIL_PARENT_FATHER => $father

), PUPIL_ID. '='. $id);

}

function _add_pupil($name, $surname, $lastname, $birthday, $adress, $mather, $father)

{

echo $this->db->insert(PUPILS, array(

PUPIL_NAME => $name,

PUPIL_SURNAME => $surname,

PUPIL_LASTNAME => $lastname,

PUPIL_BIRTHDAY => $birthday,

PUPIL_ADRESS => $adress,

PUPIL_PARENT_MATHER => $mather,

PUPIL_PARENT_FATHER => $father

));

}

function _delete_pupil($id)

{

echo $this->db->delete(PUPILS, PUPIL_ID. '='. $id);

}

}

Файл: index_model.php

<?php

class index_model extends model

{

function __construct()

{

parent::__construct();

}

}

Файл: login_model.php

<?php

class login_model extends model

{

public function __construct()

parent::__construct();

public function run()

$sth = $this->db->select("SELECT * FROM ". USERS. " WHERE ". USER_LOGIN. " = :". USER_LOGIN. " AND ". USER_PASS_H. " = :". USER_PASS_H. " ", array(

USER_LOGIN => $_POST['login'],

USER_PASS_H => $_POST['password']));

if (count($sth) > 0)

{

setcookie('auth', "admin", (time() + 7770000), '/', DOMAIN, FALSE, TRUE);

session_start();

$_SESSION['role'] = $data['admin'];

$_SESSION['loggedInadmin'] = TRUE;

$_SESSION['userid'] = $data['id'];

header('location: '. URL. 'admin/subjects');

exit();

} else

header('location: '. URL);

exit();

}

}

}

Приложение В

View (Вид)

Папка: vies

Файлы:

pupils.php

search.php

subject.php

study.php

teachers.php

Файл: pupils.php

<div class="col-sm-12" style="padding-top: 60px;">

<h3>Ученики</h3>

<table id="table" class="table table-bordered table-hover table-striped table-user-list">

<thead>

<tr>

<th>Имя ученикав</th>

<th>Фамилия </th>

<th>Отчество</th>

<th>Дата рождения</th>

<th>Адресс</th>

<th>Родители</th>

<th width="196">Действия</th>

</tr>

</thead>

<tbody>

<?php foreach ($this->pupils as $pupil => $pupil_info) : ?>

<tr id="pupil_<?= $pupil_info[PUPIL_ID] ?>">

<td class="name"><?= $pupil_info[PUPIL_NAME] ?></td>

<td class="surname" ><?= $pupil_info[PUPIL_SURNAME] ?></td>

<td class="lastname" ><?= $pupil_info[PUPIL_LASTNAME] ?></td>

<td class="birthday" ><?= $pupil_info[PUPIL_BIRTHDAY] ?></td>

<td class="adress" ><?= $pupil_info[PUPIL_ADRESS] ?></td>

<td>

<span class="mather" ><?= $pupil_info[PUPIL_PARENT_MATHER] ?></span></br>

<span class="father" ><?= $pupil_info[PUPIL_PARENT_FATHER] ?></span>

</td>

<td width="200">

<input type="hidden" class="id" value="<?= $pupil_info[PUPIL_ID] ?>"/>

<button type="button" class="btn btn-primary btn-sm" onclick="edit_pupil(this);" data-toggle="modal" data-target="#addPupil">Редактировать</button>

<button type="button" class="btn btn-primary btn-sm"onclick="to_points(this);">Оценки</button>

<button type="button" class="btn btn-default btn-sm" onclick="remove_puple(this);">Удалить</button>

</td>

</tr>

<?php endforeach; ?>

</tbody>

</table>

<input class="btn btn-primary pull-right" type="button" value="Добавить" data-toggle="modal" data-target="#addPupil">

<!-- MODALL ADD PUPIL -->

<div class="modal fade" id="addPupil" tabindex="-1" role="dialog">

<div class="modal-dialog">

<div class="modal-content">

<div class="modal-header">

<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>

<h4 class="modal-title">Редактирование записи ученика</h4>

</div>

<div class="modal-body">

<form role="form">

<div class="form-group">

<label>Имя ученика</label>

<input id="id_" type="text" class="form-control" id="">

</div>

<div class="form-group">

<label for="exampleInput">Имя ученика</label>

<input id="name_" type="text" name="name" class="form-control" id="1">

</div>

<div class="form-group">

<label for="exampleInput">Фамилия ученика</label>

<input id="surname_" type="text" name="name" class="form-control" id="2">

</div>

<div class="form-group">

<label for="exampleInput">Отчество ученика</label>

<input id="lastname_" type="text" name="name" class="form-control" id="3">

</div>

<div class="form-group">

<label for="exampleInput">дата рождения</label>

<input id="birthday_" type="text" name="experiense" class="form-control" id="4">

</div>

<div class="form-group">

<label for="exampleInput">родители</label>

<label for="exampleInput">мать(ФИО и место работы)</label>

<input id="mather_"type="text" name="category" class="form-control" id="5">

<label for="exampleInput">отец(ФИО и место работы)</label>

<input id="father_" type="text" name="category" class="form-control" id="5">

</div>

</form>

</div>

<div class="modal-footer">

<button type="button" class="btn btn-default" data-dismiss="modal">Отменить</button>

<button type="button" class="btn btn-primary">Добавить</button>

</div>

</div>

<!-- /.modal-content -->

</div>

<!-- /.modal-dialog -->

</div>

<!-- /.modal -->

</div>

<script>

function edit_pupil($this)

{

$('#id_').val($($this).parent().children('.id').val());

$('#name_').val($($this).parent().parent().children('.name').text());

$('#surname_').val($($this).parent().parent().children('.surname').text());

$('#lastname_').val($($this).parent().parent().children('.lastname').text());

$('#birthday_').val($($this).parent().parent().children('.birthday').text());

$('#adress_').val($($this).parent().parent().children('.adress').text());

$('#mather_').val($($this).parent().parent().find('.mather').text());

$('#father_').val($($this).parent().parent().find('.father').text());

}

//

function send_change()

{

$id = $('#id_').val();

$name = $('#name_').val();

$surname = $('#surname_').val();

$lastname = $('#lastname_').val();

$birthday = $('#birthday_').val();

$adress = $('#adress_').val();

$mather = $('#mather_').val();

$father = $('#father_').val();

$.post('<?= URL. 'ajax_admin/save_pupil'; ?>', {'id': $id, 'name': $name, 'surname': $surname, 'lastname': $lastname, 'birthday': $birthday, 'adress': $adress, 'mather': $mather, 'father': $father}, function(data) {

if ($('#id_').val() != -1)

{

$tr = $('#pupil_' + $id);

$tr.children('.name').text($name);

$tr.children('.surname').text($surname);

$tr.children('.lastname').text($lastname);

$tr.children('.birthday').text();

$tr.children('.adress').text();

$tr.find('.mather').text();

$tr.find('.father').text();

} else if ($.isNumeric(data)) {

$('#subjects_cont').append(

$('<tr id="pupil_' + $id + '">' +

'<td class="name">' + $name + '</td>' +

'<td class="surname" >' + $surname + '</td>' +

'<td class="lastname" >' + $lastname + '</td>' +

'<td class="birthday" >' + $birthday + '</td>' +

'<td class="adress" >' + $adress + '</td>' +

'<td>' +

'<span class="mather" >' + $mather + '</span></br>' +

'<span class="father" >' + $father + '</span>' +

'</td>' +

'<td width="200">' +

'<input type="hidden" class="id" value="' + $id + '"/>' +

'<button type="button" class="btn btn-primary btn-sm" onclick="edit_pupil(this);" >Редактировать</button>' +

'<button type="button" class="btn btn-primary btn-sm"onclick="to_points(this);">Оценки</button>' +

'<button type="button" class="btn btn-default btn-sm" onclick="remove_puple(this);">Удалить</button>' +

'</td></tr>'));

}

}

);

$('#addPupil').click();

}

function clean_form() {

$('#id_').val(-1);

$('#name_').val('');

$('#surname_').val('');

$('#lastname_').val('');

$('#birthday_').val('');

$('#adress_').val('');

$('#mather_').val('');

$('#father_').val('');

}

function remove_puple($this) {

$id = $($this).parent().children('.id').val();

$.post('<?= URL. 'ajax_admin/delete_pupil'; ?>', {'id': $id}, function(data) {

$('#teacher_' + $id).remove();

});

}

$(document).ready(function() {

$("#table").tablesorter({

headers: {

3: {

sorter: false

}

}

});

});

</script>

Файл: search.php

<div class="col-sm-12">

<h3>Поиск</h3>

<div class="col-sm-6">

<select class="form-control" name="" id="1">

<option value="1">по имени учителя</option>

<option value="2">по имени ученика</option>

<option value="3">успеваемтось потока за год</option>

</select>

<input class="form-control" type="text" value="123456">

<input type="text" class="btn btn-default" placeholder="Введите запрос">

</div>

</div>

Файл: subject.php

<div class="col-sm-12">

<h3>Предметы </h3>

<table id="table" class="table table-bordered table-hover table-striped table-user-list">

<thead>

<tr>

<th>Предметы</th>

<th width="196">Действия</th>

</tr>

</thead>

<tbody id="subjects_cont" >

<?php foreach ($this->subjects as $subject => $subject_name) : ?>

<tr>

<td class="subj" id="<?= $subject_name[SUBJECT_ID] ?>"><?= $subject_name[SUBJECT_NAME] ?></td>

<td width="200">

<button id="edit" type="button" class="btn btn-primary btn-sm" onclick="edit_subject(this);" data-toggle="modal" data-target="#editSubject">Редактировать</button>

</td>

</tr>

<?php endforeach; ?>

</tbody>

</table>

<input class="btn btn-primary pull-right" type="button" value="Добавить" onclick="clean_form();" data-toggle="modal" data-target="#editSubject">

<!-- MODAL ADD / EDIT TEACHER -->

<div class="modal fade" id="editSubject" tabindex="-1" role="dialog">

<div class="modal-dialog">

<div class="modal-content">

<div class="modal-header">

<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>

<h4 class="modal-title">Редактирование предмета</h4>

</div>

<div class="modal-body">

<form role="form">

<div class="form-group">

<label for="exampleInput">Название предмета</label>

<input id="subject" type="text" name="name" class="form-control">

<input id="subjectid" type="hidden" name="id" >

</div>

</form>

</div>

<div class="modal-footer">

<button type="button" class="btn btn-default" data-dismiss="modal">Отменить</button>

<button id="send_subject" type="button" class="btn btn-primary" onclick="send_change();" >Добавить</button>

</div>

</div>

<!-- /.modal-content -->

</div>

<!-- /.modal-dialog -->

</div>

<!-- /.modal -->

</div>

<script>

function edit_subject($this)

{

$('#subjectid').val($($this).parent().parent().children('.subj').attr('id'));

$('#subject').val($($this).parent().parent().children('.subj').text());

}

function send_change() {

$id = $('#subjectid').val();

$name = $('#subject').val();

$.post('<?= URL. 'ajax_admin/save_subject'; ?>', {'id': $id, 'name': $name}, function(data) {

if ($('#subjectid').val() != -1)

{

$('#' + $('#subjectid').val()).text($('#subject').val());

} else if ($.isNumeric(data)) {

$('#subjects_cont').append($(

'<tr><td class="subj" id= "' + data + '">' + $name + '</td><td width = "200"><button type = "button" class = "btn btn-primary btn-sm" onclick = "edit_subject(this);" data - toggle = "modal" data - target = "#editSubject">Редактировать </button></td></tr>'));

}

});

$('#editSubject').click();

}

function clean_form() {

$('#subjectid').val(-1);

$('#subject').val('');

}

$(document).ready(function() {

$("#table").tablesorter({

headers: {

3: {

sorter: false

}

}

});

}

);

</script>

Файл: study.php

<div class="col-sm-12" style="padding-top: 60px;">

<input class="btn btn-primary pull-right" type="button" value="Сохранить" data-toggle="modal" data-target="#addPupil">

</div>

Файл: teachers.php

<div class="col-sm-12">

<h3>Учителя</h3>

<table id="table" class="table table-bordered table-hover table-striped table-user-list">

<thead>

<tr>

<th>Имя учителя</th>

<th>Фамилия учителя</th>

<th>Отчество учителя</th>

<th>Категория</th>

<th>Предмет</th>

<th width="196">Действия</th>

</tr>

</thead>

<tbody id="subjects_cont">

<?php foreach ($this->teachers as $teacher => $teacher_info) : ?>

<tr id="teacher_<?= $teacher_info[TEACHER_ID] ?>">

<td class="name"><?= $teacher_info[TEACHER_NAME] ?></td>

<td class="surname" ><?= $teacher_info[TEACHER_SURNAME] ?></td>

<td class="lastname" ><?= $teacher_info[TEACHER_LASTNAME] ?></td>

<td class="experience" ><?= $teacher_info[TEACHER_EXPERIENCE] ?></td>

<td class="category" ><?= $teacher_info[TEACHER_CATEGORY] ?></td>

<?php foreach ($this->subjects as $subject => $subject_name) : ?>

<?php if ($teacher_info[TEACHER_SUBJECT] == $subject_name[SUBJECT_ID]): ?>

<td id="<?= $subject_name[SUBJECT_ID] ?>" class="subject" ><?= $subject_name[SUBJECT_NAME] ?></td>

<?php endif; ?>

<?php endforeach; ?>

<td width="200">

<input type="hidden" class="id" value="<?= $teacher_info[TEACHER_ID] ?>"/>

<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#addTeacher" onclick="edit_teacher(this);" > Редактировать </button>

<button type ="button" class="btn btn-default btn-sm" onclick="remove_teacher(this);" >Удалить</button>

</td>

</tr>

<?php endforeach; ?>

</tbody>

</table>

<input class="btn btn-primary pull-right" type="button" value="Добавить" data-toggle="modal" data-target="#addTeacher" onclick="clean_form();" >

<!-- MODAL ADD / EDIT TEACHER -->

<div class="modal fade" id="addTeacher" tabindex="-1" role="dialog">

<div class="modal-dialog">

<div class="modal-content">

<div class="modal-header">

<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>

<h4 class="modal-title">Редактирование записи учителя</h4>

</div>

<div class="modal-body">

<form role="form">

<input type="hidden" id="id_" value=""/>

<div class="form-group">

<label for="exampleInput">Имя учителя</label>

<input id="name_" type="text" name="name" class="form-control" >

</div>

<div class="form-group">

<label for="exampleInput">Фамилия учителя</label>

<input id="surname_" type="text" name="name" class="form-control">

</div>

<div class="form-group">

<label for="exampleInput">Отчество учителя</label>

<input id="lastname_" type="text" name="name" class="form-control" >

</div>

<div class="form-group">

<label for="exampleInput">Стаж</label>

<input id="experience_" type="text" name="experiense" class="form-control">

</div>

<div class="form-group">

<label for="exampleInput">Категория</label>

<input id="category_" type="text" name="category" class="form-control">

</div>

<div class="form-group">

<label for="exampleInput">Предмет</label>

<select id="subject_" name="subject" id="">

<?php foreach ($this->subjects as $subject => $subject_name) : ?>

<option value="<?= $subject_name[SUBJECT_ID] ?>"><?= $subject_name[SUBJECT_NAME] ?></option>

<?php endforeach; ?>

</select>

</div>

</form>

</div>

<div class="modal-footer">

<button type="button" class="btn btn-default" data-dismiss="modal">Отменить</button>

<button type="button" class="btn btn-primary" onclick="send_change();">Добавить</button>

</div>

</div>

<!-- /.modal-content -->

</div>

<!-- /.modal-dialog -->

</div>

<!-- /.modal -->

</div>

<script>

function edit_teacher($this)

{

$('#id_').val($($this).parent().children('.id').val());

$('#name_').val($($this).parent().parent().children('.name').text());

$('#surname_').val($($this).parent().parent().children('.surname').text());

$('#lastname_').val($($this).parent().parent().children('.lastname').text());

$('#experience_').val($($this).parent().parent().children('.experience').text());

$('#category_').val($($this).parent().parent().children('.category').text());

$('#subject_').val($($this).parent().parent().children('.subject').attr('id'));

}

function send_change()

{

$id = $('#id_').val();

$name = $('#name_').val();

$surname = $('#surname_').val();

$lastname = $('#lastname_').val();

$experience = $('#experience_').val();

$category = $('#category_').val();

$subject = $('#subject_').val();

$.post('<?= URL. 'ajax_admin/save_teacher'; ?>', {'id': $id, 'name': $name, 'surname': $surname, 'lastname': $lastname, 'experience': $experience, 'category': $category, 'subject': $subject}, function(data) {


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.