Система бронирования мест в отелях города

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,88 Мб
  • Опубликовано:
    2012-06-14
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Система бронирования мест в отелях города

Содержание

Перечень сокращений, обозначений, терминов

Введение

1. Анализ задачи создания системы бронирования мест

1.1 Преимущества применения системы управления сайтом

1.2 Основные цели создания и требования, выдвигаемые при разработке системы бронирования мест в отелях города

1.3 Функционал системы управления

1.4 Современные системы управления сайтом

1.4.1 Классификация систем

1.4.2 Список существующих систем

1.4.3 Исследование существующих систем

1.4.4 Вывод о современных системах управления сайтом

2. Определение путей и методов реализации системы управления сайтом и заявками на бронирование номеров

2.1 Выбор операционной системы

2.2 Выбор системы управления базами данных

2.3 Выбор технологии реализации

2.3.1 О достоинствах и недостатках PHP

2.4 Выбор дополнительного программного обеспечения

2.5 Разработка структуры системы

3. Разработка системы управления сайтом и заявками на бронирование номеров

3.1 Разработка базового функционала системы управления сайтом и заявками на бронирование

3.1.1 Разработка системы доступа к административной части

3.1.1.1 Обеспечение повышенной безопасности

3.1.1.2 Разработка структуры пользовательских сеансов

3.1.2 Разработка структуры представления гостиниц

3.1.2.1 Разработка структуры представления адреса гостиниц

3.1.2.2 Разработка структуры представления телефонов гостиниц

3.1.2.3 Разработка структуры представления номеров гостиниц

3.1.3 Разработка структуры представления заявок

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

3.2.1 Разработка структуры фотогалереи

3.2.2 Разработка структуры шаблонов страниц сайта

3.2.3 Разработка структуры отдельных страниц сайта

3.2.3 Разработка структуры голосований и опросов

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

4.1 Система управления сайтом

4.1.1 Работа со списками элементов в системе управления сайтом

4.1.2 Работа с отдельными элементами системы управления сайтом

4.2 Система управления заявками на бронирование номеров в отелях

Заключение

Список литературы

Приложение А - Листинг программы

Перечень сокращений, обозначений, терминов


AJAX (Asynchronous JavaScript and XML) - это подход к построению интерактивных пользовательских интерфейсов веб-приложений. При использовании AJAX веб-страница не перезагружается полностью в ответ на каждое действие пользователя. Вместо этого с веб-сервера догружаются только нужные пользователю данные.

API (Application Programming Interface) - программный интерфейс приложения.(Active Server Pages) - альтернативный CGI метод вызова программ на серверной стороне.(Common Gateway Interface) - стандарт интерфейса, служащего для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия скрипт (сценарий) или CGI-программа. Сам интерфейс разработан таким образом, чтобы можно было использовать любой язык программирования, который может работать со стандартными устройствами ввода/вывода.- семейство программных продуктов в области управления информацией компании IBM.модель (entity-relationship model) - модель данных, позволяющая описывать концептуальные схемы. Она предоставляет графическую нотацию, основанную на блоках и соединяющих их линиях, с помощью которых можно описывать объекты и отношения между ними какой-либо другой модели данных.(File Transfer Protocol) - Протокол передачи файлов, предназначенный для обеспечения передачи и приема файлов между серверами и клиентами.

портал бронирование модуль управление

HTML (Hypertext Markup Language) - язык разметки исходного текста веб-документа, включающий специальные символы (теги), которые позволяют веб-браузеру сконструировать из текста дизайн.предоставляет возможности форматирования и обработки форм, управления шрифтами, отображения информации в табличном виде, гипертекстовые связи и поддержку Java-апплетов.(HyperText Transfer Protocol) - методика передачи веб-страниц по сети интернет(Internet Information Services) - это набор серверов для нескольких служб Интернета от компании Майкрософт.АР (Interactive Mail Access Protocol) - протокол интерактивного доступа к электронной почте- СУБД класса Enterprise (Предприятие), подходящая для управления данными в среднем и крупном бизнесе.(Internet Server Application Programming Interface) - интерфейс прикладного программирования интернет-сервера (интерфейс программирования веб-сервера для вспомогательных прикладных систем)EE (Java Platform, Enterprise Edition) - представляет собой первый стандарт для создания корпоративных распределенных многозвенных приложений.(JavaServer Pages) - интерфейс доступа к базам данных или приложениям на языке Java; позволяет формировать динамические страницы на веб-сервере.

JVM (Java Virtual Machine) - виртуальная машина Java. JVM представляет собой операционную "надстройку", которая служит для адаптации существующих компьютерных систем к Java.(Linux + Apache + MySQL + PHP (Perl или Python)) - представляет собой наиболее популярный набор открытых программных средств, используемых для разработки Web-приложений.- свободная система управления базами данных. MySQL характеризуется большой скоростью, устойчивостью и лёгкостью в использовании, является решением для малых и средних приложений. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.(Network News Transfer Protocol) - сетевой протокол передачи новостей (используется для распределения новостей по серверам NNTP и клиентам NNTP в интернете; обеспечивает распределение, поиск, извлечение и рассылку новостей; протокол NNTP обеспечивает хранение новостей в центральной базе данных сервера, что позволяет выбирать определенные темы для чтения, обеспечивает индексацию, перекрестные ссылки и уничтожение сообщений после истечения определенного срока)- одна из крупнейших американских компаний, разработчик систем управления базами данных, инструментов для разработки баз данных, а также ERP-систем. Самым известным продуктом Oracle Inc. является одноимённая СУБД.(Portable Document Format) - платформонезависимый формат электронных документов, созданный фирмой Adobe Systems с использованием ряда возможностей PostScript. В первую очередь предназначен для представления в электронном виде полиграфической продукции

PERL (Practical Extraction and Report Language) - язык программирования для разработки CGI-скриптов. Программы, написанные на Perl, запускаются на стороне сервера(ранее расшифровывалось как personal home page, а сейчас Hypertext Preprocessor) - система разработки сценариев, включающая:

·        CGI-интерфейс;

·        интерпретатор языка;

·        набор функций для доступа к базам данных и различным объектам WWW.

PostgreSQL - свободная объектно-реляционная система управления базами данных (СУБД).

Является свободной альтернативой коммерческим СУБД (таким как Oracle Database, Microsoft SQL Server, IBM DB2 и СУБД производства Sybase) вместе с другими свободными СУБД (таким как MySQL и Firebird).- компьютер или программная система, предоставляющая удаленный доступ к своим службам или ресурсам с целью обмена информацией.timeout - Время истечения сессии.DB - одна из популярных баз данных.(Visual Basic Scripting) - язык сценариев, разработанный на основе языка Visual Basic- глобальное информационное пространство, основанное на физической инфраструктуре Интернета и протоколе передачи данных HTTP.(eXtensible Markup Language) - Стандарт на представление данных, ориентированный, в частности, на обмен информацией между независимыми участниками. В отличие от HTML, предназначен для представления информации в рафинированном виде, более пригодном для потребления программами, а не восприятия человеком. Формат XML предполагает структурную, а не оформительскую разметку информации.

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

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

Редизайн - создание нового шаблона дизайна сайта вместо имеющегося

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

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

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

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

Теги - элементы HTML, представляющие из себя текст, заключенный в угловые скобки.

МЕТА-теги - теги, расположенные в шапке документа.

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

Введение


Одной из наиболее развивающихся в российской экономике является сфера услуг, в частности туризм и непосредственно гостиничный бизнес. Так, рентабельность малого гостиничного бизнеса может колебаться в пределах 15-80%. Причем туристическая привлекательность ряда городов, например, Санкт-Петербурга - не единственная причина. Сегодня совершается гораздо больше деловых поездок, чем 10-20 лет назад. В связи с этим в Санкт-Петербурге и других городах появилось огромное количество мини-отелей, маленьких гостиниц по 3-7 номеров. И человеку, может оказаться, совсем не просто выбрать наиболее подходящую именно ему и забронировать номер.

Еще совсем недавно, в середине-конце 90-х годов XX века у простого человека, желающего выбрать и забронировать номер в гостинице другого города, практически не было удобного и одновременно с этим доступного способа это сделать. Человек мог обратиться в туристическую фирму за соответствующей услугой, но она бы обошлась ему недешево. Другой вариант - взять справочник, наподобие “Желтых Страниц" и обзвонить несколько гостиниц самостоятельно. Но и тут появляются свои проблемы - обычно у человека нет подобного справочника по интересующему его городу. Но даже, если его удалось достать, впереди несколько междугородних звонков. Стоит отметить, что выбор все равно зачастую оказывался не оптимальным, ведь соответствующие справочники и даже туристические фирмы не всегда имели информацию о вновь открывшихся мини-отелях.

В начале XXI века ситуация положительно изменилась. Во-первых, свою лепту внесло развитие Интернета, который стал доступным для масс, как в техническом, так и в экономическом смысле. Не стояли на месте и поисковые системы, такие как, Google, Yandex и прочие. Поэтому на момент написания работы для очень многих людей является привычным искать информацию именно в Интернете. Во-вторых, изменения коснулись и экономики. Сейчас, обратившемуся к услугам фирмы, занимающейся бронированием номеров в гостиницах, не придется переплачивать - подобные организации работают по системе "партнерских соглашений", т.е. свою долю получают не из кармана клиента, а как процент от сделки между ним и отелем.

Но развитие Интернета сказалось не только на клиенте гостиничной сферы, но и на поставщике соответствующих услуг. На сегодняшней день мало фирм, которые бы не имели своего представительства во всемирной паутине. Более того, большинство из них имеют по несколько сайтов-порталов, а некоторые, вдобавок, создали десятки сайтов посвященных отдельным гостиницам. Стоит отметить, что очень многие мини-отели заводят собственную страничку в Интернете. Информация стала более доступной как для людей, желающих остановится в одной из них, так и для посредников. Теперь посетитель гостиничного портала какой-либо из фирм по бронированию может найти информацию практически о любой гостинице или мини-отеле. Естественно, это огромные объемы информации, требующие постоянного обновления. Как правило, для этих целей используются различные системы управления содержимым (cms - content manager system).

Современные системы управления сайтом представляют собой крупные программные комплексы, позволяющие обеспечивать всестороннюю поддержку Интернет-ресурса. Но именно чрезмерная "развитость" некоторых систем, которую скорее следовало бы назвать перегруженностью или нагроможденностью, является их самым большим недостатком. Проблема заключается в том, что в процессе развития была забыта основная функция этих систем - помощь в обновлении содержания сайта. Кроме того, на сегодняшний день, наверное, нет ни одной достаточно функциональной и надежной cms, предназначенной непосредственно для работы в гостиничной сфере, что делает их еще более неудобными для ведения соответствующего бизнеса.

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

Очень часто бывает, что пользователю системы управления содержимым для получения очередной порции информации требуется обновить лишь малую часть страницы - один элемент, но практически все cms-системы все равно обновляют страницу полностью, загружая тем самым каналы передачи данных и увеличивая трафик, за который многие платят отдельно. Но эта проблема решаема. Современная технологи AJAX, асинхронный JavaScript XML, позволяет устранить эту проблему, но почему-то она еще используется в недостаточной степени.

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

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

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

1. Анализ задачи создания системы бронирования мест


1.1 Преимущества применения системы управления сайтом


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

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

Обычно фирмы по бронированию мест в отелях имеют свои собственные сайты, на которых содержится информация о гостиницах и фирме. Для приема заявок служит электронная почта. Типично этого функционала вполне достаточно. Всю информацию по гостиницам можно получать непосредственно с самого сайта; вопрос с обработкой заявок, пусть и не лучшим образом, но решен. И все хотябы относительно технические тонкости сводятся к обновлению информации об отелях. Таким образом, первоочередной задачей для подобных фирм является обеспечение достаточно быстрого обновления информации.

Этот вопрос решается четыремя способами и их комбинированием: прием сотрудника на ставку или открытие целого IT отдела для поддержки сайтов компании, разовые контакты с разработчиками, самостоятельное освоение Web-технологий и установка CMS.

В первом случае компании придется ежемесячно вкладывать достаточно большие средства для малого бизнеса в проект, независимо от того, насколько часто обновлялся сайт в текущем месяце и обновлялся ли он вообще. Достоинство данного варианта заключается в том, что если на сайте потребуются срочные изменения или обновления, помощь всегда под рукой. Второй случай - оплачивать разовое изменение сайта. В срочных ситуациях вариант ненадежный - поиск разовых работников и введение их в курс дела занимает время. Третий вариант может оказать достаточно хорошим, но здесь встает вопрос качества, а также могут понадобиться достаточно большие сроки на самообучение. Оптимальным же решением для сайтов малой/средней сложности, а именно к таким относится среднестатистический гостиничный портал, видится именно система управления содержанием сайта.

Как правило, CMS устанавливается на сайт после разработки дизайна и нарезки шаблонов. Возможности большинства систем сводятся к следующему:

·        работа с текстом (внесение/изменение текста, его шрифта, начертания, цвета и т.п.);

·        работа с таблицами;

·        установка ссылок;

·        работа с изображениями и другими файлами;

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

Из бесспорных преимуществ CMS можно перечислить следующие:

·        редактору нет необходимости знать Web-технологии и языки программирования:

·        достаточно лишь навыков работы в Microsoft Word;

·        возможность внесения изменений на сайте в любое время суток из любой точки мира, где есть доступ к Интернету;

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

·        снижение стоимости содержания сайта;

·        как правило, CMS не зависит от дизайна: содержимое страниц хранится в базе данных.

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

1.2 Основные цели создания и требования, выдвигаемые при разработке системы бронирования мест в отелях города


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

Главная задача разрабатываемой системы - снабжение административного отдела компании-заказчика необходимым функционалом для обеспечения надежного и удобного процесса обновления гостиничного Интернет-портала и приема и обработки заявок.

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

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

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

Возможность изменения дизайна должна быть реализована путем отделения части содержания от оформления.html-файлы или tpl-файлы шаблонов должны быть вынесены в отдельную папку на сервере.

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

В системе необходимо предусмотреть возможность дальнейшего расширения.

1.3 Функционал системы управления


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

Понятие “Content management” (управление информацией, содержанием) на сегодняшний день включает в себя широкий спектр программного обеспечения, начиная с набора коротких скриптов, позволяющих добавлять новости или пресс-релизы на одной странице сайта, кончая полноценными системами паблишинга, поддерживающих процессы workflow (цепочки Автор-Корректор-Редактор), обеспечивающих различные схемы разграничения доступа, автоматически создающих "связанные" документы и т.п.

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

) Добавление/изменение информации - основное предназначение системы управления контентом.

) Изменение структуры сайта - добавление или изменение расположения, информационной нагрузки или формы сайта

) Изменение дизайна сайта - предоставление возможности доработки или полной переработки всего дизайна или отдельных его частей

) Возможность использования шаблонных типов данных - обеспечивает работу с содержанием и визуальным отображением страниц на основе шаблонов, заранее подготовленных дизайнером

1.4 Современные системы управления сайтом


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

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

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

Особо следует отметить высокий уровень технической поддержки, предоставляемый многими российскими разработчиками клиентам, находящимся в России. Тонкая настройка системы под конкретные нужды предприятия, любые консультации и решение возникающих проблем - такой сервис сложно получить, если покупать систему управления контентом у иностранцев или пытаться воспользоваться open-source-продуктами [2].

1.4.1 Классификация систем

Существует несколько моделей, по которым строятся системы управления.

Модульная модель. Такие CMS представляют собой набор отдельных суб-CMS, каждая из которых управляет своим набором типов данных. Модули независимы и полностью отвечают за работу с документами данного типа. Зачастую такой принцип организации является самым удачным, так как расширять функциональность можно за счет добавления нового модуля, замены или редактирования существующего кода. Системы на основе описываемой модели наиболее популярны благодаря своей простоте. В качестве примера можно упомянуть PHPNuke и XOOPS.

Объектная модель. CMS этого типа работают с классами и объектами. Классы определяют структуру данных и набор атрибутов (свойств). Объект является экземпляром класса, его задача - хранить в себе реальные данные. Объект может наследовать свойства, содержание и поведение объектов, которые в них содержатся.

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

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

Динамические. Страница формируется динамически, как только приходит запрос. Это самый ресурсоемкий вариант, поскольку движок работает постоянно. Если посетителей очень много, то возможно чрезмерное использование ресурсов сервера. Главное преимущество подобной схемы - каждый посетитель получает самый свежий вариант контента. Кроме того, возможна индивидуальная настройка страницы под каждого пользователя.

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

Генерация статических страниц на основе динамических данных. При обновлении CMS перегенерирует все связанные страницы. Поэтому при запросе выдается уже сформированная статическая (возможно, собранная с помощью SSI) страница.

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

Порталы. Используются для информационных ресурсов, основной целью ставят максимальное упрощение публикации статей и новостей. Могут включать в себя нижеперечисленные типы CMS как самостоятельные модули. Наиболее известные представители данного класса: AngelineCMS, Bes-cms, CoolPHP, CPGNuke, Be6ZE, Xaraya, xNuke, XOOPS и др.

"Движки" без SQL. Это ответвление в разработке CMS развито относительно слабо, так как использование в качестве хранилища информации файлов вместо таблиц базы данных сопряжено с множеством труднорешаемых проблем (таких, как одновременная запись в один файл несколькими копиями скрипта) 2. Достоинство этих CMS - в доступности для модификации контента и возможности размещения на бесплатных хостингах. Есть несколько реализаций данной идеи: Cute News, DeeLight CMS, Progressive, SAPID.

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

Форумы. Это инструмент для общения на сайте. Сообщения в форуме в чем-то похожи на почтовые - каждое из них имеет автора, тему и содержание. Но для того, чтобы отправить сообщение в форум, не нужна никакая дополнительная программа - нужно просто заполнить соответствующую форму на сайте. Принципиальное свойство форума заключается в том, что сообщения в нем объединены в треды (от англ, thread - "нить"). Когда вы отвечаете в форуме на чье-то сообщение, ваш ответ будет "привязан" к исходному сообщению. К форумам, достойным внимания, можно причислить FUDforum, openBB, Phorum, phpBB, PunBB, W-gora, XMB, Zorum, ExBB, IPB, vBulletin.

Магазины. К магазинам отнесем любой сайт, с которого можно заказать какой-либо товар. В данном случае в определение "товара" может входить абсолютно все, включая время доступа в Интернет, минуты сотовой связи. Абсолютное большинство Интернет-магазинов являются нелегальными. CMS, позволяющие создать виртуальный магазин: MyMarket, osc2nuke, osCommerce, Zen Cart.

Групповая работа (Groupware) - комплекс программного обеспечения, позволяющий организовать работу предприятия, отношения с клиентами и заказчиками в Интернете. Обычно представляет собой полностью или частично закрытую часть сайта с возможностью отслеживать сроки выполнения поставленных задач, распределение ролей и временных нормативов. Иногда можно выносить вопросы на обсуждения и решения вышестоящего руководства. Как правило, пользуются следующими CMS: dotProject, eGroupWare, MoreGroupware, phpCollab, PHProjekt.

Обучение (e-Learning) - дистанционная форма обучения с использованием Интернета. Онлайновая форма обучения уже не один год является "маяком", на который ориентируются образовательные системы разных стран мира. Главным стратегическим направлением является быстрое обновление знаний и эффективное использование информации. Таких систем немного: ATutor, Caroline, LogiCampus, Moodle, Segue.

Биллинг (Billing). Программное обеспечение, позволяющее провайдерам и реселлерам работать со счетами клиентов. Такие CMS являются неотъемлемой частью крупной системы учета потребления услуг пользователями. Задача же CMS данной категории - в отображении информации о предоставленных услугах, подключении новых услуг, изменении текущих параметров, приеме платежей и т.п. Часто такие системы пишутся своими силами. Для примера можно привести биллинг-панель RuWEB. В ней создано огромное количество тарифных планов, позволяющих платить только за те параметры хостинга (трафик, место на жестком диске, MySQL, PHP, Perl), которые используются в полном объеме.

Администраторская панель хостинга. К этому классу относятся такие продукты, как Direct Admin и Control Panel. Немало хостинг-провайдеров стараются написать панель управления для пользователя хостинга своими силами, однако ни одно подобное решение, насколько мне известно, так и не смогло по возможностям и эргономике хоть немного приблизится к вышеупомянутым системам [3].

1.4.2 Список существующих систем

 

Бесплатные системы управления сайтом

UMI. CMS Free

CuteNews <#"552872.files/image001.gif">

Рис.2.1 - Архитектура системы управления сайтом

Необходимо разработать и реализовать серверную часть системы, которая будет отвечать за хранение данных и обработку пользовательских запросов к СУБД, и клиентскую часть, которая реализует интерфейс общения клиента с системой.

Выделим основные составляющие серверной и клиентской частей системы, определим их назначение и взаимосвязь.

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

Сервер баз данных должен включать в себя СУБД (в нашем случае это MySQL), и соответственно, базу данных, содержащую информацию.

Поскольку было принято решение об использовании Web-интерфейса, то и сервер должен быть настроен в соответствии с требованием обеспечения безопасности подключения. Все ненужные возможности соединения с сервером БД должны быть отключены.

При подключении пользователя к СУБД посредством web-интерфейса используется обычное TCP/IP соединение. Поэтому сервер тоже должен быть настроен соответствующим образом.

Для поддержки работы Web-интерфейса, также необходимо использование Web-сервера.

Основными составляющими Web-сервера являются:

·        cобственно Web-сервер (в нашем случае это Apache);

·        интерпретатор PHP. Он необходим для выполнения PHP-скриптов, реализующих интерфейс пользователя;

·        библиотеки PHP, которые, помимо всего прочего, должны включать набор функций, обеспечивающих доступ к серверу СУБД;

·        PHP-скрипты - реализуют интерфейс пользователя.

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

Рассмотрим теперь структуру программного обеспечения со стороны клиента. Клиенты могут работать посредством Web-интерфейса. Со стороны клиентов находится только Web-браузер. Им может быть Internet Explorer, Opera, Mozilla и т.п.

Рассмотрим основные механизмы взаимодействия описанных компонентов информационной системы.

Удаленный пользователь, работающий посредством Web-интерфейса, взаимодействует с Web-сервером через протокол HTTP.

При этом запрос к базе данных передается Web-серверу, тот в свою очередь, принимает его и обрабатывает в соответствии с кодом, написанным в PHP-скриптах, и соответственно генерирует SQL запрос к серверу СУБД.сервер взаимодействует с сервером СУБД через протоколу TCP/IP.

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

3. Разработка системы управления сайтом и заявками на бронирование номеров


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

·        Основной функционал, затребованный заказчиком в самом начале;

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

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

3.1 Разработка базового функционала системы управления сайтом и заявками на бронирование


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

3.1.1 Разработка системы доступа к административной части

Доступ к административной части системы разработан на основе сеансов, т.е. последовательности HTTP-запросов, сделанных в течение определенного интервала времени одним и тем же пользователем с одного и того же компьютера к одному и тому же Web-приложению.

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

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

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

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

3.1.1.1 Обеспечение повышенной безопасности

С учетом требований заказчика о повышенном внимании к безопасности применяются следующие дополнительные средства защиты:

а) Использование временных интервалов истечения срока:

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

б) Задание максимального срока жизни сессии:

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

в) Проверка пользовательского агента:

При обращении к приложению оно, в свою очередь, считывает информацию о пользовательском агенте для данного сеанса работы в Web. Это строка, определяющая производителя Web-броузера, его имя, версию и платформу. При этом нельзя гарантировать уникальность подобной строки для каждого компьютера. Однако в мире существует так много различных броузеров и их версий, что с высокой вероятностью различные компьютеры сгенерируют различные строки агента пользователя. Проверяя при последующих запросах соответствие данных агента пользователя, обеспечивается дополнительная линия защиты против взломов сеансов. Интересно, что строка агента пользователя генерируемая броузером Internet Explorer, может быть модифицирована в реестре Windows. Системные администраторы могут воспользоваться этим фактом и создать характерные для рабочих станций их сети строки агентов пользователей. Это несколько усилит данный механизм обеспечения безопасности.

3.1.1.2 Разработка структуры пользовательских сеансов

ER-диаграмма устройства пользовательской сессии представлена на рисунке 3.1.

Рисунок 3.1 - ER-диаграмма пользовательской сессии

Основу структуры составляет таблица user_session (таблица 3.1). Она описывает непосредственно саму сессию, в том числе 32-символьный идентификатор, и именно через нее осуществляется доступ ко всей информации, связанной с сессией.

Таблица 3.1 - Описание таблицы user_session базы данных

Название

Тип данных

Описание

id_session

int

Идентификатор сессии. Первичный ключ

id_user

int

Идентификатор пользователя. Указывает непосредственно на зарегистрированного пользователя, к которому относится сессия

ascii_session_id

varchar (32)

32-символьный идентификатор сессии

logged_in

bool

Флаг, говорящий о том, авторизовался ли пользователь под этой сессией

last_impression

datetime

Время и дата последнего запроса к странице в течение сеанса

created

datetime

Время создания сессии

user_agent

varchar (255)

Содержит информацию о пользовательском агенте (броузер и пр.)


Зачастую может понадобиться хранение дополнительных данных в рамках некоторой сессии, например, о посещенных ранее страницах. Для описания и хранения любых подобных переменных используется таблица session_variable (таблица 3.2).

Таблица 3.2 - Описание таблицы session_variable базы данных

Название

Тип данных

Описание

id_session

int

Идентификатор сессии. Указывает на сессию, к которой относится переменная

id_variable

int

Идентификатор переменной. Первичный ключ

variable_name

varchar (70)

Имя переменной

variable_value

text

Значение переменной


Регистрационная информация хранится в таблице user (таблица 3.3). Для обеспечения большей безопасности пароль хранится в базе данных в зашифрованном состоянии (используемый метод шифрования - md5), на тот случай, если злоумышленник получит доступ к этим данным.

Таблица 3.3 - Описание таблицы user базы данных

Название

тип данных

Описание

id_user

int

Идентификатор пользователя. Первичный ключ.

username

varchar (32)

Имя пользователя (логин).

md5_pw

varchar (32)

Пароль


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

Таблица 3.4 - Описание таблицы to_access базы данных

Название

тип данных

Описание

id_user

int

Идентификатор пользователя. Указывает на пользователя, к которому относятся права

to_access

int

Идентификатор раздела, к которому осуществляется доступ. Указывает на раздел, к которому относятся права.

access_level

int

Уровень доступа


Таблица 3.5 - Описание таблицы user базы данных

Название

тип данных

Описание

to_access

int

Идентификатор раздела, которому можно настроить права доступа. Первичный ключ

name

varchar (20)

Имя раздела.


На основе описанной структуры спроектирован класс UserSession (код можно посмотреть в приложении А). Он является модульным компонентом, удобным для повторного использования. Его легко можно включить практически в любой проект, связанный с поддержкой сеансов или аутентификацией зарегистрированных пользователей.

3.1.2 Разработка структуры представления гостиниц

Общую схему представления гостиниц в базе данных можно увидеть на соответствующей ER-диаграмме на рисунке 3.2.

Рисунок 3.2 - ER-диаграмма гостиницы

Центральным элементом в структуре гостиниц является таблица hotel (таблица 3.6).

Таблица 3.6 - Описание таблицы hotel базы данных

Название

тип данных

Описание

id_hotel

int

Идентификатор гостинцы. Первичный ключ.

id_adress

int

Идентификатор адреса. По нему находится адресная информация о гостинице.

id_meta

int

Идентификатор мета-данных. По нему находится информация о мета-тегах гостиницы.

id_created

int

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

id_modify

int

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

id_hotel_type

int

Идентификатор типа гостиницы. По нему находится информация о типе гостиницы (гостиница/отель…).

id_service

int

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

id_reserving

int

Идентификатор бронирования. По нему находится информация об условиях бронирования гостиницы.

id_publish

int

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

name

varchar (70)

Название гостиницы.

stars

int

Категории гостиницы (уровень звездности).

numbers

int

Общее количество номеров в гостинице.

description

text

Описание гостиницы.

sort_num

int

Номер списка. Используется для сортировки гостиниц.


Важными не только для описания гостиниц являются таблицы publish (таблица 3.7), modify (таблица 3.8), created (таблица 3.9), metas (таблица 3.10). Ссылки на них будут встречаться и в дальнейшем.

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

Кроме того, некоторая информация является актуальной только в определенный период времени, поэтому большим преимуществом системы является то, что она способна сама следить за наступлением/истечением времени, когда информация должна быть представлена к общему пользованию. Все эти возможности обеспечиваются с помощью таблицы publish.

Таблица 3.7 - Описание таблицы publish базы данных

Название

тип данных

Описание

id_publish

int

Идентификатор публикования. Первичный ключ.

publish

bool

Флаг публикования. Ноль - не выводить на сайте.

publish_start

datetime

Время с которого можно выводить информацию на сайте (если publish=1).

publish_finish

datetime

Время до которого можно выводить информацию на сайте.


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

Таблица 3.8 - Описание таблицы modify базы данных

Название

тип данных

Описание

id_modify

int

Идентификатор изменений. Первичный ключ.

id_user

bool

Идентификатор пользователя. Указывает на пользователя, внесшего соответствующее изменение.

modify_date

datetime

Время последнего изменения.


Таблица 3.9 - Описание таблицы created базы данных

Название

тип данных

Описание

id_created

int

Идентификатор создания. Первичный ключ.

id_user

bool

Идентификатор пользователя. Указывает на пользователя, внесшего соответствующее изменение.

create_date

datetime

Время создания.


Таблица 3.10 - Описание таблицы metas базы данных

Название

тип данных

Описание

id_meta

int

Идентификатор мета-данных.

title

bool

Заголовок Интернет-страницы.

keywords

datetime

Ключевые слова Интернент-страницы.

description


Описание Интернет страницы.


Дополнительная информация о гостинице хранится в отдельных таблицах. Так, для описания условий бронирования каждой из гостиниц служит таблица reserving (таблица 3.11), а для описания предоставляемых гостиницей услуг - service (таблица 3.12).

Таблица 3.11 - Описание таблицы reserving базы данных

Название

тип данных

Описание

id_reserving

int

Идентификатор условий бронирования. Первичный ключ.

conditions

varchar (255)

Условия бронирования

annulation

varchar (255)

Условия аннуляции.

arrival_time

datetime

Время и дата прибытия (заезда).

departure_time

datetime

Время и дата выезда.


Таблица 3.12 - Описание таблицы service базы данных

Название

тип данных

Описание

id_service

int

Идентификатор списка услуг. Первичный ключ.

excurtion

bool

Заказ экскурсий.

24hour_service

bool

24ч обслуживание в номерах.

car_parking

bool

Автостоянка.

currency_exchange

bool

Обмен валюты.

hairdressing

bool

Парикмахерская.

safe

bool

Сейф у администратора.

ticket_reservation

bool

Заказ авиа и ж/д билетов.

baggage_room

bool

Камера хранения багажа.

smoking

bool

Курение в номере.

dry_cleaner

bool

Химчистка.

shops

bool

Магазины.

guard_station

bool

Пост охраны.

transport_reservatuion

bool

Заказ транспорта.

internet_access

bool

Доступ в Интернет.

jacuzzi

bool

Джакузи.

wash_house

bool

Прачечная.

first_aid_post

bool

Медпункт.

additional

varchar (255)

Дополнительные услуги, которые не входят в заранее определенный список.


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

3.1.2.1 Разработка структуры представления адреса гостиниц

Структура адреса гостиниц (рисунок 3.3) является универсальной, она не привязана непосредственно к гостиницам и может использоваться где угодно.

Рисунок 3.3 - ER-диаграмма адреса гостиницы

Центральным элементом в структуре адреса выступает таблица address (таблица 3.13). Она включает в себя, на первый взгляд, избыточную связь с таблицей city (таблица 3.15), но это сделано специально, т.к. ряд городов просто не имеет районов.

Таблица 3.13 - Описание таблицы adress базы данных

Название

тип данных

Описание

id_adress

int

Идентификатор адреса. Первичный ключ.

Id_region

int

Идентификатор региона.

Id_city

int

Идентификатор города.

Id_street_type

int

Идентификатор типа улицы (улица/проспект/переулок…).

Street_name

varchar (70)

Название улицы.

House

int

Номер дома.

Building

int

Корпус.

Apartment

int

Номер квартиры.

Post_index

int

Почтовый индекс.


Таблицы country (таблица 3.14), city (таблица 3.15) и region (таблица 3.16) служат для описания страны, города и района соответственно.

Таблица 3.14 - Описание таблицы country базы данных

Название

тип данных

Описание

id_country

int

Идентификатор страны. Первичный ключ.

country

varchar (70)

Название страны.


Таблица 3.15 - Описание таблицы city базы данных

Названиетип данныхОписание



id_city

int

Идентификатор города. Первичный ключ.

id_country

int

Идентификатор страны. Указывает на страну, к которой относится город.

city

varchar (70)

Название города.


Таблица 3.16 - Описание таблицы region базы данных

Название

тип данных

Описание

id_region

int

Идентификатор раона. Первичный ключ.

id_city

int

Идентификатор города. Указывает на город, к которому относится район.

region

varchar (70)

Название района.


В таблице street_type (таблица 3.17) хранится информация о типе улицы. Например: улица, проспект, переулок, шоссе и т.д.

Таблица 3.17 - Описание таблицы street_type базы данных

Название

тип данных

Описание

id_street_type

int

Идентификатор типа улицы. Первичный ключ.

name

varchar (70)

Название типа улицы.


На основе описанной структуры созданы соответствующие классы, главным из которых является класс Adress. Его код представлен в приложении.

3.1.2.2 Разработка структуры представления телефонов гостиниц

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

Рисунок 3.4 - ER-диаграмма телефонов гостиницы

Основой структуры выступает таблица phone (таблица 3.18). Важно, что структура предусматривает различные типы телефонов, например: факс, обычный телефон, многоканальный телефон. Соответствующая информация хранится в таблице phone_type (таблица 3.19).

Таблица 3.18 - Описание таблицы street_type базы данных

Название

тип данных

Описание

id_phone

int

Идентификатор телефона. Первичный ключ.

id_phone_type

int

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

code

int

Код телефона.

number

int

Номер телефона

description

varchar (255)

Описание телефона


Таблица 3.19 - Описание таблицы phone_type базы данных

Названиетип данныхОписание



id_phone_type

int

Идентификатор типа телефона. Первичный ключ.

name

varchar (10)

Название типа телефона.


Многие гостиницы имеют несколько телефонов, поэтому для обеспечения связи "многие ко многим" используется дополнительная таблица hotel_phone (таблица 3.20), а для того, чтобы различать телефоны между собой можно хранить описание телефонов в таблице phone.

Таблица 3.20 - Описание таблицы hotel_phone базы данных

Название

тип данных

Описание

id_hotel

int

Идентификатор гостиницы.

id_phone

int

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


Основным классом, использующимся для описания этой структуры, является класс Phone. Его код можно найти в приложениях.

3.1.2.3 Разработка структуры представления номеров гостиниц

По желанию заказчика система предусматривает введение информации о различных номерах гостиницы. Соответствующую этому ER-диаграмму можно увидеть на рисунке 3.5.

Рисунок 3.5 - ER-диаграмма номеров гостиницы

Естественно, здесь главным элементом выступает таблица number (таблица 3.21). Именно в ней заложена связь номеров с соответствующими им гостиницами (поле id_hotel). В структуре присутствуют уже встречавшиеся ранее таблицы publish (таблица 3.7), modify (таблица 3.8) и created (таблица 3.9). Они предназначены для определения необходимости вывода информации о номере, хранения информации о последних изменениях и о создании соответственно.

Таблица 3.21 - Описание таблицы number базы данных

Название

тип данных

Описание

id_number

int

Идентификатор номера. Первичный ключ.

id_hotel

int

Идентификатор гостиницы. Указатель на гостиницу, к которой относится номер.

id_publish

int

Идентификатор публикования. По нему находится информация о необходимости размещения информации о номере в общий доступ.

id_created

int

Идентификатор создания. По нему находится информация о первом внесении информации о номере в базу данных.

id_modify

int

Идентификатор изменений. По нему находится информация о последних изменениях данных о номере.

name

varchar (70)

Название номера.

num_of_numbers

int

Количество номеров соответствующего типа.

description

text

Описание номера.

list_num

int

Сортировочный номер. Требуется для сортировки номеров в списке между собой.


Для хранения информации о стоимости каждого из номеров требуется 2 таблицы: period (таблица 3.22) и price (таблица 3.23). Дело в том, что в различные периоды спрос на гостиницы различен, а значит различны и цены, поэтому за счет таблицы period задается интервал, которому будет соответствовать цена, а за счет таблицы price уже непосредственно сама стоимость проживания.

Таблица 3.22 - Описание таблицы period базы данных

Название

тип данных

Описание

id_period

int

Идентификатор периода. Первичный ключ.

id_hotel

int

Идентификатор гостиницы. Указывает, к какой гостинице относится данный период.

start_date

date

Дата с которой будут вступать в действие соответствующие периоду цены.

finish_date

date

Дата до которой будут действительны соответствующие периоду цены.



Таблица 3.23 - Описание таблицы price базы данных

Название

тип данных

Описание

id_price

int

Идентификатор цен. Первичный ключ.

id_number

int

Идентификатор номера. Указывает, к какому номеру относятся цены.

id_period

int

Идентификатор периода. Указывает на период к которому относятся цены.

price

int

Стоимость одноместного размещения.

price2

int

Стоимость двухместного размещения.


Для обеспечения представленного в структуре функционала разработан ряд классов. Их код можно найти в приложениях. Основным классом среди них является класс Number.

3.1.3 Разработка структуры представления заявок

Важным элементом является система заявок на бронирование номеров в отелях города. Ее структура представлена на рисунке 3.6.

Рисунок 3.6 - ER-диаграмма номеров гостиницы

Центральным элементом в структуре выступает таблица demand (таблица 3.24). Она содержит в себе всю необходимую информацию или ссылки на нее. В частности в ней содержатся идентификаторы бронируемых гостиницы и номера в ней. Это не избыточные связи. Дело в том, что бывают случаи, когда клиент выбрал гостиницу, но не определился с номером в ней.

Таблица 3.24 - Описание таблицы demand базы данных

Название

тип данных

Описание

id_demand

int

Идентификатор заявки. Первичный ключ.

Id_person

int

Идентификатор личности. Указатель на информацию о человеке, сделавшем заказ.

Id_phone

int

Идентификатор телефона. Указатель на информацию о телефоне для связи.

Id_status

int

Идентификатор статуса заявки. Определяет степень обработки заявки (не рассмотрена, в обработке, выполнена и т.д.)

id_price_type

int

Идентификатор типа оплаты. Определяет предпочитаемый клиентом способ оплаты.

Id_transfer

int

Идентификатор трансфера. Определяет требуются ли клиенту трансферные услуги.

Id_hotel

int

Идентификатор гостиницы. Указывает на гостиницу, в которой желает поселиться клиент.

Id_number

int

Идентификатор номера. Указывает на номер, в котором желает поселиться клиент.

Id _connection_type

int

Идентификатор типа связи. Определяет предпочитаемый клиентом способ связи (e-mail, телефон и прочие).

Comments

varchar (255)

Комментарии, которые может оставить к заявке администратор.

Min_price

int

Минимальная цена, которую готов платить клиент за проживание.

Max_price

int

Максимальная цена, которую готов платить клиент за проживание.

Wishes

text

Дополнительные пожелания клиента.


В таблице demand содержится ряд указателей на таблицы, которые помимо идентификатора содержат лишь поле name: transfer (таблица 3.25), status (таблица 3.26), price_type (таблица 3.27), connection_type (таблица 3.28). Все эти таблицы содержат строго определенный заказчиком перечень значений, который представлены в соответствующих таблицах (список значений может быть расширен).

Таблица 3.25 - Описание таблицы demand базы данных

Название

тип данных

Описание

id_transfer

int

Идентификатор трансфера. Первичный ключ.

name

Возможные значения: “Без трансфера”, “От аэропорта до гостиницы”, “От вокзала до гостиницы”.



Таблица 3.26 - Описание таблицы status базы данных

Название

тип данных

Описание

id_status

int

Идентификатор статуса заявки. Первичный ключ.

name

varchar (40)

Возможные значения: “Не рассмотрена”, “Отклонена”, “В обработке”, “Выполнена”.


Таблица 3.27 - Описание таблицы price_type базы данных

Название

тип данных

Описание

id_price_type

int

Идентификатор типа оплаты. Первичный ключ.

name

varchar (70)

Возможные значения: “Наличными”, “Перевод от физического лица”, “Перевод от юридического лица”.


Таблица 3.28 - Описание таблицы connection_type базы данных

Название

тип данных

Описание

id_connection_type

int

Идентификатор типа связи. Первичный ключ.

name

varchar (20)

Возможные значения: “По телефону”, “По электронной почте”, “С помощью icq”.


Также для полного описания заявки используется описанная ранее таблица phone (таблица 3.18) и таблица person (таблица 3.29), содержащая необходимую информацию непосредственно о клиетне.

Таблица 3.29 - Описание таблицы person базы данных

Название

тип данных

Описание

id_person

int

Идентификатор личности. Первичный ключ.

id_city

int

Идентификатор города. Указывает на город, из которого приезжает клиент.

surname

varchar (70)

Фамилия клиента.

name

varchar (70)

Имя клиента.

email

varchar (150)

Электронный адрес клиента.


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

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


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

3.2.1 Разработка структуры фотогалереи

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

Рисунок 3.6 - ER-диаграмма фотогалерей номеров и гостиниц

Любая фотогалерея прежде всего состоит непосредственно из самих фотографий (далее для общности изображений), для описания которых служит таблица image (таблица 3.30).

Таблица 3.30 - Описание таблицы image базы данных

Название

тип данных

Описание

id_image

int

Идентификатор изображения. Первичный ключ.

id_folder

int

Идентификатор папки. Указывает на папку, в которой лежит данная фотография.

id_created

int

Идентификатор создания. По нему находится информация о первом внесении информации об изображении в базу данных.

id_modify

int

Идентификатор создания. По нему находится информация о последних изменениях данных об изображении.

name

varchar (150)

Название фотографии.

alt

varchar (150)

Альтернативный текст для изображения. Выводится, если броузер по каким-либо причинам не может показать изображение, или при наведении на него.

width

int

Ширина изображения в пикселях.

height

int

Высота изображения в пикселях.

size

int

Размер изображения в байтах.


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

Таблица folder (таблица 3.31) содержит информацию о папке, в которую записан соответствующий файл. В данном случае это фотография.

Таблица 3.31 - Описание таблицы folder базы данных

Название

тип данных

Описание

id_folder

int

Идентификатор папки. Первичный ключ.

fol_id_folder

int

Идентификатор папки. Указывает на папку, в которой лежит данная папка.

id_created

int

Идентификатор создания. По нему находится информация о первом внесении информации об изображении в базу данных.

id_meta

int

Идентификатор мета данных. По нему находится информация о мета-данных по умолчанию для страниц, лежащих в данной папке.

name

varchar (150)

Логической название папки.

folder_adress

varchar (150)

Физическое название папки.


За формирований фотогалерей отвечают отдельные таблицы number_galery (таблица 3.32) и hotel_galery (таблица 3.33). По идентификатору номера или гостинцы можно найти те фотографии, которые к ним относятся, а значит и сформировать фотогалерею.

Таблица 3.32 - Описание таблицы number_galery базы данных

Название

тип данных

Описание

id_number

int

Идентификатор номера. Первичный ключ.

id_image

int

Идентификатор изображения. Первичный ключ.

list_num

int

Сортировочный номер. Позволяет сортировать изображения в фотогалерее.


Таблица 3.33 - Описание таблицы hotel_galery базы данных

Название

тип данных

Описание

id_hotel

int

Идентификатор гостиницы. Первичный ключ.

id_image

int

Идентификатор изображения. Первичный ключ.

list_num

int

Сортировочный номер. Позволяет сортировать изображения в фотогалерее.


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

3.2.2 Разработка структуры шаблонов страниц сайта

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

Рисунок 3.7 - ER-диаграмма шаблонов страниц сайта

Центральным элементом в структуре шаблонов является таблица template (таблица 3.34). Он отвечает за сбор частей шаблона воедино.

Таблица 3.34 - Описание таблицы template базы данных

Название

тип данных

Описание

id_template

int

Идентификатор шаблона. Первичный ключ.

id_head

int

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

id_block

int

Идентификатор блока кода. Указывает на основной блок, отвечающий за формирование html-документа.

name

varchar (70)

Название шаблона.


Дополнительно для описания шаблона служат таблицы head (таблица 3.35) и block (таблица 3.36). Таблица head описывает ту часть шаблона, которая находится до тега <body /> в html-документах. Это мета-данные (помимо уже описанных в таблице 3.10); дополнительно подключаемые файлы, к которым относятся Java-скрипты и css-файлы. Таблица block содержит код, который лежит в теге <body />. Причем такой код может включать подблоки. Для вставки подблоков идентификатор подблока записывается в фигурные скобки через символ # (например: {#21}).

Таблица 3.35 - Описание таблицы head базы данных

Название

тип данных

Описание

id_head

int

Идентификатор заголовка. Первичный ключ.

name

varchar (70)

Название заголовка.

head_text

text

Текст заголовка.


Таблица 3.36 - Описание таблицы block базы данных

Название

тип данных

Описание

id_block

int

Идентификатор блока кода. Первичный ключ.

Name

varchar (70)

Название блока кода.

Block_text

text

Текст блока кода.


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

3.2.3 Разработка структуры отдельных страниц сайта

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

Рисунок 3.7 - ER-диаграмма отдельных страниц сайта

Основой в структуре отдельных страниц сайта выступает таблица page (таблица 3.37). Непосредственно же сама информация о страницах представлена в таблицах, на которые она ссылается.

Таблица 3.37 - Описание таблицы page базы данных

Название

тип данных

Описание

id_page

int

Идентификатор страницы. Первичный ключ.

id_template

int

Идентификатор шаблоны. Указывает на шаблон, согласно которому должна отображаться данная страница.

id_meta

int

Идентификатор мета-данных. По нему находится информация о мета-тегах страницы.

id_folder

int

Идентификатор папки. Указывает на папку, в которой расположена данная страница.

id

int

Идентификатор автора. Указывает на информацию о стороннем источники, если такой имеется.

id_publish

int

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

id_created

int

Идентификатор создания. По нему находится информация о первом внесении информации о странице в базу данных.

id_modify

int

Идентификатор изменений. По нему находится информация о последних изменениях страницы.

name

varchar (150)

Название (заголовок) страницы.

file_name

varchar (255)

Название файла, которому соответствует данная страница.


Практически все таблицы, на которые ссылается таблица page, уже рассматривались ранее: publish (таблица 3.7), modify (таблица 3.8), created (таблица 3.9), metas (таблица 3.10), folder (таблица 3.31). Исключение составляет лишь таблица authorship (таблица 3.38). Она предназначена для описания данных, берущихся со сторонних источников с целью сохранения авторских прав их владельцами.

Таблица 3.38 - Описание таблицы authorship базы данных

Названиетип данныхОписание



id

int

Идентификатор автора. Первичный ключ.

authorname

varchar (70)

Имя автора.

source

varchar (255)

Ссылка на источник информации.


Кроме типичного для отдельных страниц функционала система предусматривает и дополнительный. Во-первых, система предусматривает возможность сбора статистики о посещаемости. Для этого предназначены таблица visits (таблица 3.39), которая хранит информацию о посетителях сайта и таблица page_views (таблица 3.40), которая содержит сведения о том кто из посетителей, какие страницы просматривал и когда.

Таблица 3.39 - Описание таблицы visits базы данных

Название

тип данных

Описание

id_visits

int

Идентификатор посетителя. Первичный ключ

id_session

int

Идентификатор сессии. Указывает на сессию, соответствовавшую данному посетителю.

hits

int

Количество хитов посетителя.

first_enter

datetime

Время и дата первого посещения.

last_enter

datetime

Время и дата последнего посещения.

ip

varchar (16)

IP-адрес посетителя.

location_history

varchar (255)

Информация о странице, с которой посетитель пришел на сайт.


Таблица 3.40 - Описание таблицы page_views базы данных

Название

тип данных

Описание

id_page

int

Идентификатор страницы. Первичный ключ.

id_visits

int

Идентификатор посетителя. Первичный ключ.

view_date

datetime

Время и дата последнего просмотра страницы посетителем.


Во-вторых, система предусматривает формирование из группы отдельных страниц новостных разделов, статей по определенной теме и просто меню. Реализация этой задачи основана на таблице special_pages (таблица 3.41), которая отвечает за формирование групп страниц, и таблице page_type (таблица 3.42), которая определяет тип страниц в таких группах (новость, статья и т.д.).

Таблица 3.41 - Описание таблицы special_pages базы данных

Название

тип данных

Описание

id_spec_page

int

Идентификатор специальной страницы. Первичный ключ.

id_page

int

Идентификатор страницы. Указывает на страницу, которая входит в соответствующий блок

id_page_type

int

Идентификатор типа страницы. Указывает к какой группе относится страница (новость, статья и т.д.)

announcement

text

Анонс. Краткое изложение содержания страницы.

date

date

Дата.


Таблица 3.42 - Описание таблицы page_type базы данных

Название

тип данных

Описание

id_page_type

int

Идентификатор типа страницы. Первичный ключ.

name

varchar (20)

Фиксированный набор значений: “Новость”, “Статья”, “Пункт Меню”.


3.2.3 Разработка структуры голосований и опросов

Очередным дополнительным модулем, предусматриваемым системой является модуль голосований и опросов. Его ER-диаграмма представлена на рисунке 3.8.

Рисунок 3.8 - ER-диаграмма голосований и опросов

Для описания тем голосований или вопросов служит таблица voiting (таблица 3.43), а за голоса отвечает таблица answers (таблица 3.44). Также в структуре присутствуют таблицы metas, modify и created, назначение которых очевидно.

Таблица 3.43 - Описание таблицы voiting базы данных

Название

тип данных

Описание

id_voiting

int

Идентификатор голосования (опроса). Первичный ключ.

name

varchar (70)

Название голосования (опроса).

question

varchar (255)

Вопрос.

start_date

datetime

Начало действия голосования.

finish_date

datetime

Конец действия голосования.


Таблица 3.44 - Описание таблицы special_pages базы данных

Название

тип данных

Описание

id_answer

int

Идентификатор ответа. Первичный ключ.

id_voiting

int

Идентификатор голосования (опроса)

id_created

int

Идентификатор создания. По нему находится информация о первом внесении информации об ответе в базу данных.

id_modify

int

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

id_meta

int

Идентификатор мета-данных. По нему находится информация о мета-тегах ответов.

answer

Ответ.

num

int

Количество ответов.



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


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

4.1 Система управления сайтом


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

Рисунок 4.1 - список гостиниц. Сортировка по названию по возрастанию.

4.1.1 Работа со списками элементов в системе управления сайтом

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

Рисунок 4.2 - список гостиниц. Сортировка по дате изменения по возрастанию.

Следует отметить, что сортировка допускается как по возрастанию, так и по убыванию. На рисунках 4.3 и 4.4 представлены соответствующие варианты для сортировки по идентификатору.

Рисунок 4.3 - список гостиниц. Сортировка по идентификатору по возрастанию.

Рисунок 4.4 - список гостиниц. Сортировка по идентификатору по убыванию.

Кроме стандартных полей для сортировки есть еще одно - поле “сорт.”. Если список необходимо отсортировать в строго заданном порядке можно просто внести соответствующую информацию о гостинице (сортировочный номер). Отсортированный по данному полю список можно увидеть на рисунке 4.5.

Рисунок 4.5 - список гостиниц. Сортировка по сортировочному номеру по возрастанию.

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

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

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

Для перехода к редактированию элемента необходимо нажать либо на значок редактирование, либо на название необходимого элемента. Очень важно, что при этом перезагрузится исключительно поле с таблицей, вместо которого загрузится форма для редактирования элемента (рисунок 4.6). Кстати обработка кнопки добавления осуществляется по тому же принципу.

Рисунок 4.6 - редактирование гостиницы. Общая информация.

4.1.2 Работа с отдельными элементами системы управления сайтом

При переходе к редактированию гостиниц открывается форма с набором вкладок:

·        “Общая информация”;

·        “Контакты и адреса”;

·        “Периоды”;

·        “Номера”;

·        “Мета-данные”.

Вкладкой по умолчанию является вкладка “Общая информация” (рисунок 4.6). Их смена осуществляется простым кликом по ним, причем перегружается только непосредственно информация самих вкладок.

Во вкладке “Общая информация” вносятся изменения о необходимости размещения гостиницы в общий доступ и базовая информация о гостинице, такая как название.

Вкладка “Контакты и адреса” (рисунок 4.7) отвечает соответственно за редактирование контактной информации. Для добавления дополнительных телефонов необходимо нажать на кнопку “+”.

Рисунок 4.7 - редактирование гостиницы. Контакты и адреса.

За информацию о номерах гостиницы отвечает сразу две вкладки “Периоды” (рисунок 4.8), в которой формируются интервалы действия стоимостей номеров и непосредственно номера (рисунок 4.9).

Рисунок 4.8 - редактирование гостиницы. Периоды.

Рисунок 4.9 - редактирование гостиницы. Номера.

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

По желанию заказчика была также добавлена вкладка “Мета-данные” (рисунок 4.10).

Рисунок 4.10 - редактирование гостиницы. Мета-данные.

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

4.2 Система управления заявками на бронирование номеров в отелях


Работа с заявками очень похожа на работу с информацией о гостиницах. Тот же интерфейс как при работе со списками (рисунок 4.11), так и при обработке конкретных элементов (рисунок 4.12). Поэтому он не требует дополнительных комментариев.

Рисунок 4.10 - список заявок. Сортировка по фамилии клиента по возрастанию.

Рисунок 4.10 - редактирование заявки. Общая информация.

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

Заключение


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

Разработана система управления сайтом и заявками на бронирование номеров в отелях города.

Представлены возможные варианты дальнейшего расширения системы.

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

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

Список литературы


1.      Эд Леки-Томпсон и др. PHP5 для профессионалов. - М.: Вильямс, 2006. - 608 с.

2.      Сравнительные особенности современных CMS. - “Internet.ru”, 22 декабря 2005 г.

.        А. Моисеев. На том стоим. - Журнал "Компьютерра", №32, 08 сентября 2005 г.

.        “CMSlist.ru”, 2005 г.

.        А. Терехов. Сравниваем контент-менеджеры. - “Cmslist.ru”, 2005 г.

.        Закас Н., Мак-Пик Д., Фосетт Д. Ajax для профессионалов. - СПб: Символ-Плюс, 2006. - 488 с.

7.      http://www.xaker.ru - журнал "Хакер".

8.      http://www.lightnet. obninsk.ru - еженедельник "Свет в internet".

Приложение А - Листинг программы


В целях сокращения объема в приложении приведена лишь наиболее важная часть кода программы.

class. Database. php

<?_once ($cfg ['path'] ['base']. "classes/class. Database. php"); // Подключаем класс по работе с БД

require_once ($cfg ['path'] ['base']. "classes/class. GenericObject. php"); // Подключаем класс по работе с объектами

require_once ($cfg ['path'] ['base']. "classes/class. GenericObjectCollection. php"); // Подключаем класс по работе с коллекциями объектов

require_once ($cfg ['path'] ['base']. "classes/class. Hotel. php"); // Подключаем класс гостиницHotelCollection {$order;$where;$select;$items_per_page = 20;$item_count;$page_count;$objDB; // Класс БД

// конструкторfunction __construct ($objDBlink) {$cfg;

$this->select = "SELECT id_hotel FROM". $cfg ['table'] ['hotel'];

$this->order = "";

$this->where = "";

$this->objDB = $objDBlink; // Запоминаем объект БД

return (true); //

}

// Функция устанавливает количество элементов на странице

public function SetItemsPerPage ($items_per_page) {

$this->items_per_page = $items_per_page;

}

// Функция возвращает количество элементов на странице

public function GetItemsPerPage () {($this->items_per_page);

}

// Функция возвращает количество элементов в коллекции

public function GetItemCount () {($this->item_count);

}

// Функция возвращает количество страницfunction GetPageCount () {($this->page_count);

}

// Функция устанавливает значение переменной select

public function SetSelect ($select) {

$this->select = $select;

}

// Функция устанавливает значение переменной wherefunction SetWhere ($where) {

$this->where = $where;

}

// Функция устанавливает значение переменной order

public function SetOrder ($order) {

$this->order = $order;

}function GetAllHotels ($page_num=1) {$cfg;

$dbc = new GenericObjectCollection ($cfg ['table'] ['hotel'], "id_hotel", "Hotel", $this->objDB);

$stmt = "SELECT id_hotel FROM". $cfg ['table'] ['hotel']; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос($i=0; $i<=sizeof ($arResult) - 1; $i++) {

$dbc->AddTuple ($arResult [$i] ["id_hotel"]);

};

$dbc->SetPageSize ($this->items_per_page);

$dbc->PopulateObjectArray ($page_num);

$objArray = $dbc->RetrievePopulatedObjects ($page_num);

$this->item_count = $dbc->GetItemCount ();

$this->page_count = $dbc->GetNumPages ();($objArray);

}function GetFromClass ($page_num=1) {$cfg;

$dbc = new GenericObjectCollection ($cfg ['table'] ['hotel'], "id_hotel", "Hotel", $this->objDB);

// формируем запрос

$stmt = "";

$stmt. = $this->select;

$stmt. = $this->where;

$stmt. = $this->order;

$arResult = $this->objDB->select ($stmt); // Выполняем запрос($i=0; $i<=sizeof ($arResult) - 1; $i++) { // проходим все элементы

$dbc->AddTuple ($arResult [$i] ["id_hotel"]); // Записываем соответствующие id

};

$dbc->SetPageSize ($this->items_per_page); // Переписали данные о количестве элементов на страницу

$dbc->PopulateObjectArray ($page_num); // Составили список требуемых id

$objArray = $dbc->RetrievePopulatedObjects ($page_num); // получили массив требуемых элементов

$this->item_count = $dbc->GetItemCount (); // запомнили количество элементов

$this->page_count = $dbc->GetNumPages (); // запомнили количество страниц($objArray); // Возвращаем массив значений

}

}

? >

class. UserSession. php

<?_once ($cfg ['path'] ['base']. "classes/class. Database. php"); // Подключаем класс по работе с БД

require_once ($cfg ['path'] ['base']. "classes/class. GenericObject. php"); // Подключаем класс по работе с объектами

require_once ($cfg ['path'] ['base']. "classes/class. GenericObjectCollection. php"); // Подключаем класс по работе с коллекциями объектов

require_once ($cfg ['path'] ['base']. "classes/class. Hotel. php"); // Подключаем класс гостиницHotelCollection {$order;$where;$select;$items_per_page = 20;$item_count;$page_count;$objDB; // Класс БД

// конструкторfunction __construct ($objDBlink) {$cfg;

$this->select = "SELECT id_hotel FROM". $cfg ['table'] ['hotel'];

$this->order = "";

$this->where = "";

$this->objDB = $objDBlink; // Запоминаем объект БД

return (true); //

}

// Функция устанавливает количество элементов на странице

public function SetItemsPerPage ($items_per_page) {

$this->items_per_page = $items_per_page;

}

// Функция возвращает количество элементов на странице

public function GetItemsPerPage () {($this->items_per_page);

}

// Функция возвращает количество элементов в коллекции

public function GetItemCount () {($this->item_count);

}

// Функция возвращает количество страницfunction GetPageCount () {($this->page_count);

}

// Функция устанавливает значение переменной select

public function SetSelect ($select) {

$this->select = $select;

}

// Функция устанавливает значение переменной wherefunction SetWhere ($where) {

$this->where = $where;

}

// Функция устанавливает значение переменной order

public function SetOrder ($order) {

$this->order = $order;

}function GetAllHotels ($page_num=1) {$cfg;

$dbc = new GenericObjectCollection ($cfg ['table'] ['hotel'], "id_hotel", "Hotel", $this->objDB);

$stmt = "SELECT id_hotel FROM". $cfg ['table'] ['hotel']; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос($i=0; $i<=sizeof ($arResult) - 1; $i++) {

$dbc->AddTuple ($arResult [$i] ["id_hotel"]);

};

$dbc->SetPageSize ($this->items_per_page);

$dbc->PopulateObjectArray ($page_num);

$objArray = $dbc->RetrievePopulatedObjects ($page_num);

$this->item_count = $dbc->GetItemCount ();

$this->page_count = $dbc->GetNumPages ();($objArray);

}function GetFromClass ($page_num=1) {$cfg;

$dbc = new GenericObjectCollection ($cfg ['table'] ['hotel'], "id_hotel", "Hotel", $this->objDB);

// формируем запрос

$stmt = "";

$stmt. = $this->select;

$stmt. = $this->where;

$stmt. = $this->order;

$arResult = $this->objDB->select ($stmt); // Выполняем запрос($i=0; $i<=sizeof ($arResult) - 1; $i++) { // проходим все элементы

$dbc->AddTuple ($arResult [$i] ["id_hotel"]); // Записываем соответствующие id

};

$dbc->SetPageSize ($this->items_per_page); // Переписали данные о количестве элементов на страницу

$dbc->PopulateObjectArray ($page_num); // Составили список требуемых id

$objArray = $dbc->RetrievePopulatedObjects ($page_num); // получили массив требуемых элементов

$this->item_count = $dbc->GetItemCount (); // запомнили количество элементов

$this->page_count = $dbc->GetNumPages (); // запомнили количество страниц($objArray); // Возвращаем массив значений

}

}

? >

class. GenericObject. php

<?

// Класс "Объект" - предназначен для сокращения кода его наследников

class GenericObject {

// Члены класса

protected $objDB; // Класс БД

private $id; // id элемента

private $id_name; // Обозначение id элемента$table_name; // Имя таблицы$database_fields; // Ассоциативный массив с ключами, которые являются именами столбцов таблицы и их значениями для данной строки$loaded; // Ноль, если данные не были загружены из таблицы - один, если данные были загружены$modified; // флаг того, что изменения вносились$modified_fields; // Аналогичен database_fields, но содержит 0 или 1 в зависимости от того были ли произведены изменения

// методы

// Функция перезагрузки

// Загружает всю информацию об элементе

public function Reload () {

// $sql = new sql (0);

$id = $this->id; // Запоминаем id

$table_name = $this->table_name; // запоминаем имя таблицы

// $sql->query ("SELECT * FROM \"$table_name\" WHERE id='$id'"); // формируем запрос

$stmt = "SELECT * FROM $table_name WHERE". $this->id_name. "='$id'"; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос(isset ($arResult [0])) {

$result_fields = $arResult [0]; // Копируем первую строку

$this->database_fields = $result_fields; // Переписываем полученный результат в нащ объект

$this->loaded = 1; // Устанавливаем статус загрузки(sizeof ($this->modified_fields) > 0) { // Если есть массив с изменениями

foreach ($this->modified_fields as $key => $value) { // То обнуляем все его элементы

$this->modified_fields [$key] = false;

};

};

}

}

// Функция зарузки

// Загружает всю информацию об элементе

private function Load () {

$this->Reload ();

// $this->loaded = 1;

}

// Функция принудительной загрузкиfunction ForceLoaded () {

$this->loaded = 1;

}

// Функция возвращает значение поля

// Ей передается имя поляfunction GetField ($field) {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};(isset ($this->database_fields [$field]))$this->database_fields [$field];

else return false;

}

// Функция возвращает весь массив значений элементаfunction GetAllFields () {($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};($this->database_fields);

}

// Функция возвращает ассоциативный массив полей, которые были изменены

public function GetModifiedFields () {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};

$escVals = array (); // Выходной массив значений($this->database_fields as $key => $value) {(! is_numeric ($key)) {(isset ($this->modified_fields [$key]))($this->modified_fields [$key] == true) { // Если поле было изменено

$escVals [$key] = $value;

};

};

};($escVals);

}

// Функция возвращает id текущего элементаfunction GetID () {

return $this->id;

}

// Функция инициализации

// задает имя таблицы,

// id

// и id (но не обязательно)

public function Initialize ($table_name, $tuple_id_name, $tuple_id = "") {

$this->table_name = $table_name;

$this->id_name = $tuple_id_name;

$this->id = $tuple_id;

}

// функция Задает значение $value в поле $field

public function SetField ($field, $value) {

if ($this->loaded == 0) { // Если данные еще не были загружены,($this->id) { // и у нас есть конкретный id

$this->Load (); // то мы их загружаем

};

};

$this->database_fields [$field] = $value; // Записываем значение

$this->modified = 1; // Устанавливаем флаг того, что мы вносили изменения

$this->modified_fields [$field] = true; // Устанавливаем флаг того, что поле было изменено

}

// Функция удаления объектаfunction Destroy () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы($id) { // Если id задан

$this->objDB->delete ($table_name, array ($id_name => $id)); // Удаляем элемент из таблицы

// $sql = new sql (0);

// $stmt = "DELETE FROM \"". $table_name. "\" WHERE id='". $id. "'";

// $sql->query ($stmt);

};

}

// Функция сохранения в БД

public function Save () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы

// $sql = new sql (0);

if (! $id) { // Если id не задан

$this->loaded = 0; // То устанавливаем, что элемент не был загружен

};($this->loaded == 0) { // Если элемент новый (не был загружен)

// Добавляем новую запись в таблицу БД

$this->objDB->insert ($table_name, $this->database_fields);

} else { // Если это не новый элемен

$return_code = $this->objDB->update ($table_name, $this->GetModifiedFields (), array ($id_name => $id));

};

// $return_code = $sql->query ($stmt, 1);

if ($this->loaded == 0) { // Если мы вставляли новый элемент

// Получаем последний вставленный id

$stmt = "SELECT MAX (". $this->id_name. ") AS id FROM $table_name WHERE ";($this->database_fields as $key => $value) {(! is_numeric ($key)) {($value) {($this->modified_fields [$key] == true) {

$value = str_replace ("'", "\'", $value);

$stmt. = "$key = '$value' AND ";

};

};

};

};

$stmt = substr ($stmt,0,strlen ($stmt) - 5); // Убираем лишние символы

$arResult = $this->objDB->select ($stmt); // Выполняем запрос

$proposed_id = $arResult [0] ["id"]; // Переписываем полученный id($proposed_id > 0) { // Если получили нормальный id

$this->loaded = 1; // значит все загружено

$this->id = $proposed_id; // Запоминаем id в объект

return true;

} else {false;

};

};($return_code);

}

};

class. GenericObjectCollection. php

<?

// Класс "Объект" - предназначен для сокращения кода его наследников

class GenericObject {

// Члены класса

protected $objDB; // Класс БД

private $id; // id элемента

private $id_name; // Обозначение id элемента$table_name; // Имя таблицы$database_fields; // Ассоциативный массив с ключами, которые являются именами столбцов таблицы и их значениями для данной строки$loaded; // Ноль, если данные не были загружены из таблицы - один, если данные были загружены$modified; // флаг того, что изменения вносились$modified_fields; // Аналогичен database_fields, но содержит 0 или 1 в зависимости от того были ли произведены изменения

// методы

// Функция перезагрузки

// Загружает всю информацию об элементе

public function Reload () {

// $sql = new sql (0);

$id = $this->id; // Запоминаем id

$table_name = $this->table_name; // запоминаем имя таблицы

// $sql->query ("SELECT * FROM \"$table_name\" WHERE id='$id'"); // формируем запрос

$stmt = "SELECT * FROM $table_name WHERE". $this->id_name. "='$id'"; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос(isset ($arResult [0])) {

$result_fields = $arResult [0]; // Копируем первую строку

$this->database_fields = $result_fields; // Переписываем полученный результат в нащ объект

$this->loaded = 1; // Устанавливаем статус загрузки(sizeof ($this->modified_fields) > 0) { // Если есть массив с изменениями

foreach ($this->modified_fields as $key => $value) { // То обнуляем все его элементы

$this->modified_fields [$key] = false;

};

};

}

}

// Функция зарузки

// Загружает всю информацию об элементе

private function Load () {

$this->Reload ();

// $this->loaded = 1;

}

$this->loaded = 1;

}

// Функция возвращает значение поля

// Ей передается имя поляfunction GetField ($field) {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};(isset ($this->database_fields [$field]))$this->database_fields [$field];

else return false;

}

// Функция возвращает весь массив значений элементаfunction GetAllFields () {($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};($this->database_fields);

}

// Функция возвращает ассоциативный массив полей, которые были изменены

public function GetModifiedFields () {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};

$escVals = array (); // Выходной массив значений($this->database_fields as $key => $value) {(! is_numeric ($key)) {(isset ($this->modified_fields [$key]))($this->modified_fields [$key] == true) { // Если поле было изменено

$escVals [$key] = $value;

};

};

};($escVals);

}

// Функция возвращает id текущего элементаfunction GetID () {

return $this->id;

}

// Функция инициализации

// задает имя таблицы,

// id

// и id (но не обязательно)

public function Initialize ($table_name, $tuple_id_name, $tuple_id = "") {

$this->table_name = $table_name;

$this->id_name = $tuple_id_name;

$this->id = $tuple_id;

}

// функция Задает значение $value в поле $field

public function SetField ($field, $value) {

if ($this->loaded == 0) { // Если данные еще не были загружены,($this->id) { // и у нас есть конкретный id

$this->Load (); // то мы их загружаем

};

};

$this->database_fields [$field] = $value; // Записываем значение

$this->modified = 1; // Устанавливаем флаг того, что мы вносили изменения

$this->modified_fields [$field] = true; // Устанавливаем флаг того, что поле было изменено

}

// Функция удаления объектаfunction Destroy () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы($id) { // Если id задан

$this->objDB->delete ($table_name, array ($id_name => $id)); // Удаляем элемент из таблицы

// $sql = new sql (0);

// $stmt = "DELETE FROM \"". $table_name. "\" WHERE id='". $id. "'";

// $sql->query ($stmt);

};

}

// Функция сохранения в БДfunction Save () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы

// $sql = new sql (0);

if (! $id) { // Если id не задан

$this->loaded = 0; // То устанавливаем, что элемент не был загружен

};($this->loaded == 0) { // Если элемент новый (не был загружен)

// Добавляем новую запись в таблицу БД

$this->objDB->insert ($table_name, $this->database_fields);

} else { // Если это не новый элемен

$return_code = $this->objDB->update ($table_name, $this->GetModifiedFields (), array ($id_name => $id));

};

// $return_code = $sql->query ($stmt, 1);

if ($this->loaded == 0) { // Если мы вставляли новый элемент

// Получаем последний вставленный id

$stmt = "SELECT MAX (". $this->id_name. ") AS id FROM $table_name WHERE ";($this->database_fields as $key => $value) {(! is_numeric ($key)) {($value) {($this->modified_fields [$key] == true) {

$value = str_replace ("'", "\'", $value);

$stmt. = "$key = '$value' AND ";

};

};

};

};

$stmt = substr ($stmt,0,strlen ($stmt) - 5); // Убираем лишние символы

$arResult = $this->objDB->select ($stmt); // Выполняем запрос

$proposed_id = $arResult [0] ["id"]; // Переписываем полученный id($proposed_id > 0) { // Если получили нормальный id

$this->loaded = 1; // значит все загружено

$this->id = $proposed_id; // Запоминаем id в объект

return true;

} else {false;

};

};($return_code);

}

};

class. Hotel. php

<?

// Класс "Объект" - предназначен для сокращения кода его наследников

class GenericObject {

// Члены класса

protected $objDB; // Класс БД

private $id; // id элемента

private $id_name; // Обозначение id элемента$table_name; // Имя таблицы$database_fields; // Ассоциативный массив с ключами, которые являются именами столбцов таблицы и их значениями для данной строки$loaded; // Ноль, если данные не были загружены из таблицы - один, если данные были загружены$modified; // флаг того, что изменения вносились$modified_fields; // Аналогичен database_fields, но содержит 0 или 1 в зависимости от того были ли произведены изменения

// методы

// Функция перезагрузки

// Загружает всю информацию об элементе

public function Reload () {

// $sql = new sql (0);

$id = $this->id; // Запоминаем id

$table_name = $this->table_name; // запоминаем имя таблицы

// $sql->query ("SELECT * FROM \"$table_name\" WHERE id='$id'"); // формируем запрос

$stmt = "SELECT * FROM $table_name WHERE". $this->id_name. "='$id'"; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос(isset ($arResult [0])) {

$result_fields = $arResult [0]; // Копируем первую строку

$this->database_fields = $result_fields; // Переписываем полученный результат в нащ объект

$this->loaded = 1; // Устанавливаем статус загрузки(sizeof ($this->modified_fields) > 0) { // Если есть массив с изменениями

foreach ($this->modified_fields as $key => $value) { // То обнуляем все его элементы

$this->modified_fields [$key] = false;

};

};

}

}

// Функция зарузки

// Загружает всю информацию об элементе

private function Load () {

$this->Reload ();

// $this->loaded = 1;

}

// Функция принудительной загрузкиfunction ForceLoaded () {

$this->loaded = 1;

}

// Функция возвращает значение поля

// Ей передается имя поляfunction GetField ($field) {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};(isset ($this->database_fields [$field]))$this->database_fields [$field];

else return false;

}

// Функция возвращает весь массив значений элементаfunction GetAllFields () {($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};($this->database_fields);

}

// Функция возвращает ассоциативный массив полей, которые были изменены

public function GetModifiedFields () {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};

$escVals = array (); // Выходной массив значений($this->database_fields as $key => $value) {(! is_numeric ($key)) {(isset ($this->modified_fields [$key]))($this->modified_fields [$key] == true) { // Если поле было изменено

$escVals [$key] = $value;

};

};

};($escVals);

}

// Функция возвращает id текущего элементаfunction GetID () {

return $this->id;

}

// Функция инициализации

// задает имя таблицы,

// id

// и id (но не обязательно)

public function Initialize ($table_name, $tuple_id_name, $tuple_id = "") {

$this->table_name = $table_name;

$this->id_name = $tuple_id_name;

$this->id = $tuple_id;

}

// функция Задает значение $value в поле $field

public function SetField ($field, $value) {

if ($this->loaded == 0) { // Если данные еще не были загружены,($this->id) { // и у нас есть конкретный id

$this->Load (); // то мы их загружаем

};

};

$this->database_fields [$field] = $value; // Записываем значение

$this->modified = 1; // Устанавливаем флаг того, что мы вносили изменения

$this->modified_fields [$field] = true; // Устанавливаем флаг того, что поле было изменено

}

// Функция удаления объектаfunction Destroy () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы($id) { // Если id задан

$this->objDB->delete ($table_name, array ($id_name => $id)); // Удаляем элемент из таблицы

// $sql = new sql (0);

// $stmt = "DELETE FROM \"". $table_name. "\" WHERE id='". $id. "'";

// $sql->query ($stmt);

};

}

// Функция сохранения в БД

public function Save () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы

// $sql = new sql (0);

if (! $id) { // Если id не задан

$this->loaded = 0; // То устанавливаем, что элемент не был загружен

};($this->loaded == 0) { // Если элемент новый (не был загружен)

// Добавляем новую запись в таблицу БД

$this->objDB->insert ($table_name, $this->database_fields);

} else { // Если это не новый элемен

$return_code = $this->objDB->update ($table_name, $this->GetModifiedFields (), array ($id_name => $id));

};

// $return_code = $sql->query ($stmt, 1);

if ($this->loaded == 0) { // Если мы вставляли новый элемент

// Получаем последний вставленный id

$stmt = "SELECT MAX (". $this->id_name. ") AS id FROM $table_name WHERE ";($this->database_fields as $key => $value) {(! is_numeric ($key)) {($value) {($this->modified_fields [$key] == true) {

$value = str_replace ("'", "\'", $value);

$stmt. = "$key = '$value' AND ";

};

};

};

};

$stmt = substr ($stmt,0,strlen ($stmt) - 5); // Убираем лишние символы

$arResult = $this->objDB->select ($stmt); // Выполняем запрос

$proposed_id = $arResult [0] ["id"]; // Переписываем полученный id($proposed_id > 0) { // Если получили нормальный id

$this->loaded = 1; // значит все загружено

$this->id = $proposed_id; // Запоминаем id в объект

return true;

} else {false;

};

};($return_code);

}

};

class. HotelCollection. php

<?

// Класс "Объект" - предназначен для сокращения кода его наследников

class GenericObject {

// Члены класса

protected $objDB; // Класс БД

private $id; // id элемента

private $id_name; // Обозначение id элемента$table_name; // Имя таблицы$database_fields; // Ассоциативный массив с ключами, которые являются именами столбцов таблицы и их значениями для данной строки$loaded; // Ноль, если данные не были загружены из таблицы - один, если данные были загружены$modified; // флаг того, что изменения вносились$modified_fields; // Аналогичен database_fields, но содержит 0 или 1 в зависимости от того были ли произведены изменения

// методы

// Функция перезагрузки

// Загружает всю информацию об элементе

public function Reload () {

// $sql = new sql (0);

$id = $this->id; // Запоминаем id

$table_name = $this->table_name; // запоминаем имя таблицы

// $sql->query ("SELECT * FROM \"$table_name\" WHERE id='$id'"); // формируем запрос

$stmt = "SELECT * FROM $table_name WHERE". $this->id_name. "='$id'"; // формируем запрос

$arResult = $this->objDB->select ($stmt); // Выполняем запрос(isset ($arResult [0])) {

$result_fields = $arResult [0]; // Копируем первую строку

$this->database_fields = $result_fields; // Переписываем полученный результат в нащ объект

$this->loaded = 1; // Устанавливаем статус загрузки(sizeof ($this->modified_fields) > 0) { // Если есть массив с изменениями

foreach ($this->modified_fields as $key => $value) { // То обнуляем все его элементы

$this->modified_fields [$key] = false;

};

};

}

}

// Функция зарузки

// Загружает всю информацию об элементе

private function Load () {

$this->Reload ();

// $this->loaded = 1;

}

// Функция принудительной загрузкиfunction ForceLoaded () {

$this->loaded = 1;

}

// Функция возвращает значение поля

// Ей передается имя поляfunction GetField ($field) {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};(isset ($this->database_fields [$field]))$this->database_fields [$field];

else return false;

}

// Функция возвращает весь массив значений элементаfunction GetAllFields () {($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};($this->database_fields);

}

// Функция возвращает ассоциативный массив полей, которые были изменены

public function GetModifiedFields () {

if ($this->loaded == 0) { // Если данные еще не были загружены,

$this->Load (); // то мы их загружаем

};

$escVals = array (); // Выходной массив значений($this->database_fields as $key => $value) {(! is_numeric ($key)) {(isset ($this->modified_fields [$key]))($this->modified_fields [$key] == true) { // Если поле было изменено

$escVals [$key] = $value;

};

};

};($escVals);

}

// Функция возвращает id текущего элементаfunction GetID () {

return $this->id;

}

// Функция инициализации

// задает имя таблицы,

// id

// и id (но не обязательно)

public function Initialize ($table_name, $tuple_id_name, $tuple_id = "") {

$this->table_name = $table_name;

$this->id_name = $tuple_id_name;

$this->id = $tuple_id;

}

// функция Задает значение $value в поле $field

public function SetField ($field, $value) {

if ($this->loaded == 0) { // Если данные еще не были загружены,($this->id) { // и у нас есть конкретный id

$this->Load (); // то мы их загружаем

};

};

$this->database_fields [$field] = $value; // Записываем значение

$this->modified = 1; // Устанавливаем флаг того, что мы вносили изменения

$this->modified_fields [$field] = true; // Устанавливаем флаг того, что поле было изменено

}

// Функция удаления объекта

public function Destroy () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы($id) { // Если id задан

$this->objDB->delete ($table_name, array ($id_name => $id)); // Удаляем элемент из таблицы

// $sql = new sql (0);

// $stmt = "DELETE FROM \"". $table_name. "\" WHERE id='". $id. "'";

// $sql->query ($stmt);

};

}

// Функция сохранения в БД

public function Save () {

$id = $this->id; // Запоминаем id

$id_name = $this->id_name; // Запоминаем id_name

$table_name = $this->table_name; // Запоминаем имя таблицы

// $sql = new sql (0);

if (! $id) { // Если id не задан

$this->loaded = 0; // То устанавливаем, что элемент не был загружен

};($this->loaded == 0) { // Если элемент новый (не был загружен)

// Добавляем новую запись в таблицу БД

$this->objDB->insert ($table_name, $this->database_fields);

} else { // Если это не новый элемен

$return_code = $this->objDB->update ($table_name, $this->GetModifiedFields (), array ($id_name => $id));

};

// $return_code = $sql->query ($stmt, 1);

if ($this->loaded == 0) { // Если мы вставляли новый элемент

// Получаем последний вставленный id

$stmt = "SELECT MAX (". $this->id_name. ") AS id FROM $table_name WHERE ";($this->database_fields as $key => $value) {(! is_numeric ($key)) {($value) {($this->modified_fields [$key] == true) {

$value = str_replace ("'", "\'", $value);

$stmt. = "$key = '$value' AND ";

};

};

};

};

$stmt = substr ($stmt,0,strlen ($stmt) - 5); // Убираем лишние символы

$arResult = $this->objDB->select ($stmt); // Выполняем запрос

$proposed_id = $arResult [0] ["id"]; // Переписываем полученный id($proposed_id > 0) { // Если получили нормальный id

$this->loaded = 1; // значит все загружено

$this->id = $proposed_id; // Запоминаем id в объект

return true;

} else {false;

};

};($return_code);

}

};

Похожие работы на - Система бронирования мест в отелях города

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!