Серверная часть системы создания и управления сайтами

 

Введение


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

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

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

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

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

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



1. Постановка задачи


1.1Анализ существующих систем создания и управления сайтами


1.1.1Выбор систем для анализа

Систем создания и управления сайтами (ССУС) на сегодняшний день существует большое множество. На одном из самых популярных Интернет-ресурсов, посвященном обзору современных ССУС, #"justify">Основываясь на различной статистике и опросах общественного мнения, свободно публикуемых в сети Интернет, [2] а также на личном опыте автора, были выбраны следующие ССУС для анализа:

·Drupal #"justify">·Joomla #"justify">·Wordpress #"justify">·Ucoz #"justify">Стоит обратить внимание на систему Ucoz. Она является представителем особой группы онлайн-ССУС. Среди таких систем сложно выделить наиболее популярную в мировом масштабе, поэтому была выбрана наиболее популярная система в русском Интернете. Wordpress изначально позиционируется как система для создания блогов, но при этом успешно используется для создания сайтов любой направленности. Joomla является представителем универсальных ССУС для подготовленных пользователей. Drupal представляет продвинутую систему для профессиональных пользователей. [3]

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


1.1.2Анализ установщиков выбранных систем

Анализ установщика Wordpress

Для того чтобы установить эту систему на свой хостинг, необходимо проделать следующие шаги:

·Скачать архив с системой с официального сайта

·Распаковать архив на локальной машине

·Перейти в созданную папку

·Открыть файл wp-config-sample.php в текстовом редакторе

·Изменить значения php-переменных на соответствующие конкретному хостингу

·Сохранить изменения

·Переименовать файл wp-config-sample.php в wp-config.php

·Загрузить все файлы на сервер с помощью FTP-клиента

·Открыть в браузере /wp-admin/install.php

·Пройти процедуру первоначальной настройки

Анализ установщика Joomla

Для того чтобы установить эту систему на свой хостинг, необходимо проделать следующие шаги:

·Скачать архив с системой с официального сайта

·Распаковать архив на локальной машине

·Загрузить все файлы на сервер с помощью FTP-клиента

·Открыть в браузере /index.php

·Пройти процедуру предустановки

·Скопировать предложенный текст файла конфигурации в буфер обмена

·Создать файл configuration.php

·Открыть файл

·Вставить текст конфигурации в него

·Сохранить изменения

·Загрузить файл на сервер в директорию установленной системы

·Удалить директорию installation с сервера

Анализ установщика Drupal

Для того чтобы установить эту систему на свой хостинг, необходимо проделать следующие шаги:

·Скачать архив с системой с официального сайта

·Распаковать архив на локальной машине

·Скопировать файл default.settings.php в settings.php

·Загрузить все файлы на сервер с помощью FTP-клиента

·Установить права на запись для файла settings.php

·Установить права на запись для директории sites/default/

·Пройти процедуру первоначальной настройки

·Убрать права на запись для файла settings.php

Анализ установщика Ucoz

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


1.1.3Анализ серверной части выбранных систем

В системе Wordpress данные о структуре и содержимое сайта хранятся в базе данных. В установочной директории находится ядро системы, написанное на языке php. В папке wp-content хранятся шаблоны страниц. Различные опции и настройки сохраняются в базе данных.

При этом страницы сайта генерируются «на лету» при обращении по адресу. Это реализуется с помощью специального модуля http-сервера под названием mod_rewrite. При обращении к физически несуществующей странице #"justify">Кроме текстового содержимого, на сайтах присутствуют и другие типы содержимого: графика, музыка, видео, анимация. Их нецелесообразно хранить в базе данных в силу большой нагрузки на сервер. Поэтому в системе Wordpress они хранятся в директории wp-content/uploads/.

Joomla и Drupal представляют точно такой же подход к управлению системой, различаясь лишь в именах файлов и папок.

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

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

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

В обоих случаях раз в N минут происходит автоматическая генерация статических html страниц сайта. И все последующие обращения к сайту минуют скрипт динамического создания страниц. Это позволяет достичь максимальной скорости работы сайта (в некоторых случаях в стократном размере). При этом могут возникать различные проблемы с динамическим содержимым страниц. К примеру, если автор изменил страницу, то посетители сайта увидят изменения не сразу, а только по прошествии N минут. Для более сложных страниц, содержащих постоянно обновляемое содержимое, управляемое таймерами, задержка может стать катастрофической и привести к неверной работе сайта. Различие в обоих вариантах только в методе хранения кэша. В первом случае запрос идет к базе данных, во втором - к файловой системе. Чтобы произвести запрос в базу данных, необходимо сначала открыть скрипт с файловой системы, поэтому второй вариант оказывается быстрее.

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


1.1.4Выводы на основе проведенного анализа

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

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

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

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


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

управление сайт серверная руководство

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

В системе присутствуют два логических блока: серверная часть и клиентская часть.

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

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

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

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

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

На рисунке 2.1 показана общая схема системы создания и управления сайтами.


Рисунок 2.1 - Общая схема системы создания и управления сайтами


1.3Требования к серверной части системы


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

·Простой установщик системы;

·Полное кэширование в файловую систему;

·Понятная пользователю структура файловой системы;

·Возможность простого и легкого соединения сервера с клиентом в связи с параллельной разработкой;

·Возможность быстрой адаптации системы под различные СУБД.


1.4Средства разработки серверной части системы создания и управления сайтами


В настоящее время стандартом де-факто для создания веб-содержимого является язык разметки HTML. С помощью него создается логическое разделение содержимого страницы. [4]

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

С первого взгляда эти средства не относятся к серверной части. Но стоит понимать, что так или иначе сервер будет иметь дело с содержимым, поставляемым пользователем с клиентской стороны. А это содержимое будет создано именно в связке HTML+CSS.

Теперь рассмотрим непосредственно серверную часть.

Для создания серверной логики сегодня существуют как минимум четыре достойных варианта: PHP, Python, Ruby, ASP.NET.

Выбор одного из них произведем на основе доступности и популярности. В данном случае очевидным вариантом является PHP. [5] Этот язык программирования является самым популярным языком создания веб-приложений. Он также поддерживается на всех современных платформах.

Среди баз данных для веб-разработки наиболее выделяются MySQL и PostgreSQL. Но в отличие от PostgreSQL, MySQL завоевал свою популярность очень давно. Более того, MySQL как и PHP поддерживается всеми современными платформами. [6]

Для того, чтобы все эти средства могли работать, необходим http-сервер. Самым простым и весьма надежным решением является Apache HTTP Server. Он доступен для большинства операционных систем и, вообще говоря, является самым популярным выбором среди разработчиков. Вторым вариантом мог бы стать Internet Information Services (IIS), но, в силу его привязки к операционной системе Windows и, соответсвенно, высокой цены, он исключается из рассмотрения.

Итак, мы получаем связку технологий и средств разработки, необходимых для создания серверной части системы создания и управления сайтами: HTML, CSS, PHP, MySQL, Apache.



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


2.1Структура серверной части


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

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


Рисунок 3.1 - Структура серверной части


Данная структура минимизирует усилия по совмещению серверной и клиентской частей за счет наличия между ними всего лишь одного канала связи. Это связь между блоками «Клиент» и «Координатор». Координатор иначе можно назвать интерфейсом для взаимодействия с клиентом.

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

Так как серверная часть будет иметь дело, как с файловой системой, так и с базой данных, следует ввести некоторые абстракции, чтобы уменьшить сложность разработки и повысить масштабируемость системы. Поэтому был добавлен блок «Менеджер хранилища». Общение с ним происходит в рамках таких понятий как «страница», «шаблон», «ресурс». Это всё термины системы создания и управления сайтами. Введение такой прослойки позволяет значительно уменьшить сложность Координатора.

Менеджер хранилища используется внутри Координатора, т.е. его логика доступна только разработчику серверной части. Если в Координаторе имеется некоторая команда «сохранить страницу», то благодаря Менеджеру Хранилища отпадает необходимость описывать всю логику внутри координатора, достаточно просто вызвать подходящий метод Менеджера Хранилища.

Менеджер хранилища в зависимости от ситуации общается с Менеджером базы данных и Генератором сайта.

При инициализации Менеджера Хранилища происходит автоматическая инициализация Менеджера базы данных в соответствии с настройками системы.

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

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

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

Менеджер хранилища содержит множество методов для «смыслового» общения с системой. Например, метод MccGetTemplates ($project_uid) достает из базы данных список шаблонов, соответствующих проекту $project_uid. Такой подход позволяет понизить сложность разработки системы в целом. По большому счету, менеджер хранилища содержит соответствующий метод для каждого действия координатора. Все доступные методы Менеджера Хранилища представлены в таблице 3.1.


Таблица 3.1 - Методы Менеджера Хранилища

МетодОписаниеAddProject ($project_uid)Добавляет новый проектAddResource ($uid, $isglobal, $path, $type, $project_uid, $usedin_uid = NULL, $usedin_type = NULL)Добавляет новый ресурсAddTemplate ($template_uid, $draft_uid, $creation_time, $modification_time, $object_data, $project_uid)Добавляет новый шаблонAddPage ($page_uid, $draft_uid, $template_uid, $creation_time, $modification_time, $page_url, $object_data, $published, $generated_modification_time, $generated_draft_uid, $project_uid)Добавляет новую страницуAddDraft ($project_uid, $page_uid, $draft_uid, $template_uid, $creation_time, $modification_time, $object_data, $published)Добавляет новый черновик для страницыSaveTemplate ($project_uid, $template_uid, $draft_uid, $modification_time = FALSE, $object_data = FALSE, $new_uid = FALSE)Изменяет шаблонSavePageDraft ($project_uid, $page_uid, $draft_uid, $template_uid = FALSE, $modification_time = FALSE, $page_url = FALSE, $object_data = FALSE, $published = FALSE, $new_draftuid = FALSE, $new_pageuid = FALSE)Изменяет черновик страницыRemoveResource ($project_uid, $uid, $fromdisk = FALSE)Удаляет ресурсRemovePage ($project_uid, $uid, $fromdisk = FALSE)Удаляет страницуRemoveTemplate ($project_uid, $uid)Удаляет шаблонRemoveDraft ($project_uid, $page_uid, $draft_uid, $fromdisk = FALSE)Удаляет черновик страницыGetTemplate ($project_uid, $template_uid, $draft_uid)Возвращает шаблонGetPageDraft ($project_uid, $page_uid, $draft_uid)Возвращает черновик страницыMccGetPages ($project_uid)Возвращает список всех страниц проектаMccGetTemplates ($project_uid)Возвращает список всех шаблонов проектаMccGetStatus ($project_uid)Возвращает общую информацию о проектеGetResources ($project_uid, $usedin_type = FALSE, $usedin_uid = FALSE)Возвращает список ресурсов

Посмотрим, как введение Менеджера Хранилища упрощает логику системы в целом. Возьмем команду Координатора для удаления шаблона.


// Remove template

case «template_remove»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$template_uid = $_POST ['template_uid'];$stm->RemoveTemplate ($project_uid, $template_uid);

};

В данном представлении использован Менеджер Хранилища. Теперь попробуем вставить логику Менеджера прямо в Координатор.


// Remove template«template_remove»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$template_uid = $_POST ['template_uid'];

// Checking if input is correct(! valcheck:isuid ($project_uid) ||! valcheck:isuid($uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

// Removing template

$table_name = $this->db_tables_templates;

$condition = array ('template_uid'=>$uid,

'project_id'=>$project_id);

$this->dbm->RemoveData ($table_name, $condition); «OK»;

};


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

Менеджер базы данных на уровне кода состоит из интерфейса IDbm, который реализуется соответсвующим определенной СУБД классом. В данной версии системы это MysqlDbm, который реализует СУБД MySQL. Интерфейс позволяет в будущем нарастить число поддерживаемых СУБД путем реализации его вторично. При этом уже существующая логика системы не будет нарушена, так как интерфейс гарантирует наличие сходного функционала в производных от него классах.

Рассмотрим этот момент более детально. Ниже представлен данный интерфейс.


interface IDbm

{__construct ($host, $user, $password);__destruct();


// Removes dbRemoveDatabase ($db_name);

// Creates new dbCreateDatabase ($db_name);

// Makes db activeSelectDatabase ($db_name);

// Executes multiple queries from.sql fileExecQueryFromFile ($file_name);

// Adds row of data, $values is an arrayAddData ($table_name, $values);

// Executes sql queryExecQuery($query);

// Upadate dataUpdateData ($table_name, $new_data, $condition = NULL);

// Get one row of data with equality conditionGetData ($what, $from, $condition = NULL);

// Removes data with equality conditionRemoveData ($from, $condition = NULL);

// Get all rows of data with equality conditionGetAllData ($what, $from, $condition = NULL);

// Gets number of rows by equality conditionGetCount ($from, $condition = NULL);

}


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


// Removes template

function RemoveTemplate ($project_uid, $uid)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||! valcheck:isuid($uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

// Removing template

$table_name = $this->db_tables_templates;

$condition = array ('template_uid'=>$uid,

'project_id'=>$project_id);

$this->dbm->RemoveData ($table_name, $condition);

return «OK»;

}


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

Описание методов интерфейса представлено в таблице 3.2.


Таблица 3.2 - Методы интерфейса IDbm

МетодОписание__construct ($host, $user, $password)Подключение к базе данных__destruct()Отключение от базы данныхRemoveDatabase ($db_name)Удаление базы данныхCreateDatabase ($db_name)Создание базы данныхSelectDatabase ($db_name)Выбор рабочей базы данныхExecQueryFromFile ($file_name)Выполнение sql-сценария из файлаAddData ($table_name, $values)Добавление строки данных в таблицуExecQuery($query)Выполнение sql-запросаUpdateData ($table_name, $new_data, $condition = NULL)Обновление существующих данныхGetData ($what, $from, $condition = NULL)Возвращение строки данныхRemoveData ($from, $condition = NULL)Удаление данныхGetAllData ($what, $from, $condition = NULL)Возвращение всех строк данныхGetCount ($from, $condition = NULL)Возвращение числа строк данных

Генератор сайта также позволяет упростить логику систему. Именно он реализует функцию полного кеширования страниц сайта в файловую систему. В таблице 3.3 представлены методы Генератора.


Таблица 3.3 - Методы Генератора сайта

МетодОписаниеGeneratePage ($url_name, $page_data, $template_data, $old_url_name = FALSE)Компанует страницу из содержимого и шаблона и записывает готовую страницу в файловую системуRemovePage ($url_name)Удаляет страницуRemoveResourceFile($path)Удаляет файл ресурса

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

Рассмотрим на примере связь всех этих модулей между собой. Допустим, клиент хочет сохранить черновик страницы. Он обращается к Координатору с командой «page_savedraft». Координатор обрабатывает запрос и вызывает метод Менеджера Хранилища «SavePageDraft». Менеджер Хранилища обрабатывает данные и выбирает базу данных с помощью метода «SelectDatabase» Менеджера базы данных. Далее Менеджер Хранилища обновляет данные с помощью метода «UpdateData» Менеджера базы данных. Далее происходит публикация страницы. Для этого с помощью метода «GetData» Менеджер Хранилища производит выборку шаблона и страницы, и вызывает метод Генератора сайта «GeneratePage», который обновляет страницу в файловой системе. В конце Координатор возвращает статус «ОК», сигнализирующий об успешном выполнении команды. Описанный выше процесс изображен на рисунке 3.2. Пунктирный стрелки обозначают возврат результатов запросов к модулям. На их основе формируется возврат Координатора.


Рисунок 3.2 - Структура серверной части


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


2.2Структура базы данных


База данных была спроектирована на основе существующих в системе логических элементов: страниц (pages), шаблонов (templates), ресурсов (resources) и самого проекта (projects).

При проектировании учитывалась также возможность последующего расширения системы.

После согласования с клиентской частью удалось выделить дополнительные логические единицы: черновики (drafts). Предполагалось наличие черновиков у страниц, а также планировалось внедрение черновиков в шаблоны в будущем. Также планировалась реализация поддержки множества сайтов в рамках одной системы создания и управления сайтами (каждый сайт при этом выделялся в логическую единицу «проект»).

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

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


Рисунок 3.3 - Диаграмма базы данных системы

Описание структуры всех таблиц базы данных представлено в таблицах 3.4 - 3.10.

Во главе структуры находится таблица projects. У каждого проекта есть уникальное имя, которое записывается в текстовое поле project_uid.

В каждом проекте присутствуют страницы. Они представлены таблицей pages. В поле page_uid содержится уникальное имя страницы. Project_id определяет к какому проекту относится данная страница. Поле page_url задает под каким именем будет видна страница в строке браузера. Поля generated_modification_time и generated_draft_uid используются для сохранения времени последней генерации данной страницы и имени последнего сгенерированного черновика. Они позволяют не генерировать данную страницу повторно в случае наличия самой последней версии.

У страницы предполагается наличие нескольких черновиков. Они хранятся в таблице page_drafts. Поле draft_uid представляет уникальное имя черновика. Template_id указывает какой шаблон был использован при создании черновика. Creation_time и modification_time хранят время создания черновика и его последней модификации. Эти данные используются для генерации страниц. А также могут использоваться как справочная информация клиентом. Поле object_data типа TEXT содержит саму страницу.

Шаблоны хранятся в таблице templates. Поле template_uid содержит уникальное имя шаблона. В project_id указывается принадлежность определенному проекту.

Черновики для шаблонов находятся в таблице template_drafts. Где draft_uid содержит уникальное имя черновика. Внешний ключ template_id задает принадлежность черновика определенному шаблону. Creation_time и modification_time хранят время создания черновика и его последней модификации. Они могут использоваться как справочная информация клиентом. Поле object_data типа TEXT содержит сам шаблон.

Ресурсы хранятся в таблице resources. Поле resource_uid содержит уникальное имя ресурса, project_id указывает принадлежность ресурса проекту. В поле path указывается путь до файла ресурса. В поле data_type сохраняется тип ресурса (формат изображения или другая информация). Поле isglobal булевского типа определяет, является ли ресурс глобальным.

С ресурсами связана таблица resource_usedin, с помощью которой определяется, где задействован ресурс. Поле resource_id указывает какой ресурс имеется ввиду. Usedin_type определяет тип содержимого, в котором задействован ресурс: страница или шаблон. Usedin_id является внешним ключом на содержимое, в котором задействован ресурс. Глобальные ресурсы не отмечаются в этой таблице.


Таблица 3.4 - Описание структуры таблицы projects

ПолеСодержаниеТип данныхРазмерidУникальный числовой идентификатор записиINT10project_uidУникальное имя проектаVARCHAR256

Таблица 3.5 - Описание структуры таблицы pages

ПолеСодержаниеТип данныхРазмерidУникальный числовой идентификатор записиINT10page_uidУникальное имя страницыVARCHAR256generated_modification_timeВремя последней генерации страницыINT12generated_draft_uidИмя последнего сгенерированного черновикаVARCHAR256page_urlИмя страницы, видимое в адресной строке браузераVARCHAR256project_idИдентификатор проекта, в котором находится страницаINT10

Таблица 3.6 - Описание структуры таблицы page_drafts

ПолеСодержаниеТип данныхРазмерidУникальный числовой идентификатор записиINT10draft_uidУникальное имя черновика страницыVARCHAR256template_idИдентификатор используемого в черновике щаблонаVARCHAR256creation_timeВремя создания черновикаINT12modification_timeВремя последней модификации черновикаINT12object_dataСодержимое страницы для данного черновикаTEXTpublishedОпубликованность черновикаTINYINT1page_idИдентификатор связанной с черновиком страницыINT10

Таблица 3.7 - Описание структуры таблицы templates

ПолеСодержаниеТип данныхРазмерidУникальный числовой идентификатор записиINT10template_uidУникальное имя шаблонаVARCHAR256project_idИдентификатор проекта, в котором находится страницаINT10

Таблица 3.8 - Описание структуры таблицы template_drafts

ПолеСодержаниеТип данныхРазмерidУникальный числовой идентификатор записиINT10draft_uidУникальное имя черновика шаблонаVARCHAR256creation_timeВремя создания черновикаINT12modification_timeВремя последней модификации черновикаINT12object_dataСодержимое шаблона для данного черновикаTEXT

Таблица 3.9 - Описание структуры таблицы resources

ПолеСодержаниеТип данныхРазмерidУникальный числовой идентификатор записиINT10resource_uidУникальное имя ресурсаVARCHAR256isglobalЯвляется ли черновик глобальным или локальнымTINYINT1pathПуть в файловой системе до файла черновикаTEXTdata_typeТип ресурсаVARCHAR10project_idИдентификатор проекта, в котором находится ресурсINT10

Таблица 3.10 - Описание структуры таблицы resource_usedin

ПолеСодержаниеТип данныхРазмерidУникальный числовой идентификатор записиINT10resource_idИдентификатор ресурсаINT10usedin_idИдентификатор страницы или шаблона, в котором используется ресурсINT10usedin_typeТип содержимого в котором используется ресурс (страница или шаблон)CHAR1

2.3Структура файловой системы


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

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

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

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

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

В результате мы получаем следующие папки.

·clientПапка клиентской части

·server Папка серверной части

·installer Папка установщика системы

·site Папка сайта

·uploads Папка для загрузки файлов

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

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

После этих уточнений представим более полную структуру файловой системы.

·clientПапка клиентской части

·server Папка серверной части

odbm Папка менеджера базы данных

ogenerator Папка генератора сайта

ostm Папка менеджера хранилища

ocoordinator Папка координатора

·installer Папка установщика системы

·site Папка сайта

·uploads Папка для загрузки файлов

·config Файл конфигурации системы


2.4Интерфейс для взаимодействия с клиентом


Интерфейс представляет собой php-скрипт с именем coordinator.php. В структуре серверной части он называется Координатором. Для взаимодействия, клиент должен вызвать данный скрипт, передав ему список параметров (вместе со значениями) с помощью метода POST. Какие именно параметры необходимо передать зависит от решаемой задачи.

Но существует обязательный параметр «cmd». Именно он определяет тип выполняемого действия. Каждый тип может иметь список дополнительных параметров, некоторые из которых можно опускать, а некоторые необходимы для выполнения действия.

Интерфейс оперирует понятиями «страница», «шаблон», «ресурс».

На рисунке 3.4 представлена схема взаимодействия между интерфейсом и клиентом.


Рисунок 3.4 - Схема взаимодействия между интерфейсом и клиентом


В таблице 3.11 перечислены команды Координатора.


Таблица 3.11 - Команды Координатора

КомандаОписаниеproject_addДобавление нового проектаresource_addДобавление нового ресурсаtemplate_addДобавление нового шаблонаpage_addДобавление новой страницыtemplate_saveСохранение изменений в шаблонеpage_savedraftСохранение изменений в черновике страницыpage_adddraftДобавление нового черновика страницыresource_removeУдаление ресурсаpage_removeУдаление страницыpage_removedraftУдаление черновика страницыtemplate_removeУдаление шаблонаtemplate_getВозвращение содержимого шаблонаpage_getdraftВозвращение содержимого черновика страницыmcc_get_pagesВозвращение списка страницmcc_get_templatesВозвращение списка шаблоновmcc_get_statusВозвращение информации о проектеresources_getВозвращение списка ресурсов

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

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

2.5Удаленный установщик


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

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

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

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

·Имя сайта;

·Имя FTP хоста;

·FTP порт;

·FTP логин;

·FTP пароль;

·Корневая директория сайта на FTP;

·Имя хоста СУБД;

·Логин СУБД;

·Пароль СУБД;

·Имя базы данных.

Все эти данные пользователь получает при покупке хостинга.

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

Схема удаленного установщика представлена на рисунке 3.5.

Рисунок 3.5 - Схема удаленного установщика


На уровне реализации весь процесс состоит из нескольких этапов:

1.Пользователь открывает html страницу и вводит в специальные поля формы свои данные.

2.Пользователь нажимает кнопку установки.

.Запускается установочный php-скрипт с параметрами, введенными пользователем.

.Происходит соединение с FTP сервером.

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

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

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

.Файл настроек загружается на сервер пользователя.

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

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

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

.Система готова к работе.

Преимущества удаленного установщика очевидны: минимальное затраченное время и усилия на установку системы.


3Тестирование серверной части


3.1Тестирование интерфейса для взаимодействия с клиентом


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

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

Ниже приводится отчет успешного прохождения автоматической системы тестирования. Исходный код системы тестирования можно найти в приложении В.

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


Таблица 4.1 - Описание шагов автоматической системы тестирования

ШагОписание1Изначальное состояние системы2Добавлен проект по-умолчанию3Добавлен шаблон «Меню, содержимое 1, содежимое 2, копирайт»4Добавлена страница «О кроликах»5Изменен шаблон «Меню, содержимое 1, содежимое 2, копирайт»6Изменена страница «О кроликах»7Добавлен шаблон «Содержимое и копирайт»8Добавлена страница «О кошечках and dogs»9Добавлена страница «Заготовочка о пушистиках»10Добавлен ресурс «01.mid»11Удален ресурс «01.mid»12Добавлен ресурс «02.mid»13Изменен шаблон «Меню, содержимое 1, содежимое 2, копирайт»14Изменен черновик по-умолчанию страницы «О кроликах»15Удалена страница «О кошечках and dogs»16Удален шаблон «О кошечках and dogs»17Добавлен черновик «черновичок my» для страницы «О кроликах…»18Добавлен черновик «черновичок my2» для страницы «О кроликах…»19Удален черновик «черновичок my2» страницы «О кроликах…»20Добавлен ресурс «2009-04-13-1239634885_1024x600_scrot.png»21Добавлен ресурс «aleaf.jpg»22Изменен черновик по-умолчанию страницы «Заготовочка о пушистиках»23Запрошено содержимое шаблона «Меню. Содержимое 1. Содежимое 2. Копирайт.»24Запрошено содержимое черновика «черновичок my» страницы «О кроликах…»25Запрошен список страниц26Запрошен список шаблонов27Запрошен статус проекта28Запрошен глобальный список ресурсов29Запрошен список ресурсов для страницы «Заготовочка о пушистиках»

OK1DraftsDrafts

2DraftsDrafts

3: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайтDrafts: 1, draft_uid: default, temp_id: 1Drafts

4: 1, page_uid: О кроликах, page_url: bunnies: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайтDrafts: 1, draft_uid: default, temp_id: 1Drafts: 1, draft_uid: default, page_id: 1 published: 1

5: 1, page_uid: О кроликах, page_url: bunnies: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайтDrafts: 1, draft_uid: default, temp_id: 1Drafts: 1, draft_uid: default, page_id: 1 published: 1

6: 1, page_uid: О кроликах, page_url: bunniesnew: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайтDrafts: 1, draft_uid: default, temp_id: 1Drafts: 1, draft_uid: default, page_id: 1 published: 1

7: 1, page_uid: О кроликах, page_url: bunniesnew: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайт

id: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: default, page_id: 1 published: 1

8: 1, page_uid: О кроликах, page_url: bunniesnew: 2, page_uid: О кошечках and dogs, page_url: pets: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайт

id: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: default, page_id: 1 published: 1: 2, draft_uid: default, page_id: 2 published: 1

9: 1, page_uid: О кроликах, page_url: bunniesnew: 2, page_uid: О кошечках and dogs, page_url: pets: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайт

id: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: default, page_id: 1 published: 1: 2, draft_uid: default, page_id: 2 published: 1: 3, draft_uid: default, page_id: 3 published: 0

10: 1, page_uid: О кроликах, page_url: bunniesnew: 2, page_uid: О кошечках and dogs, page_url: pets: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайт

id: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: default, page_id: 1 published: 1: 2, draft_uid: default, page_id: 2 published: 1: 3, draft_uid: default, page_id: 3 published: 0: 1, resource_uid: 01.mid, isglobal: 0

11: 1, page_uid: О кроликах, page_url: bunniesnew: 2, page_uid: О кошечках and dogs, page_url: pets: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайт

id: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: default, page_id: 1 published: 1: 2, draft_uid: default, page_id: 2 published: 1: 3, draft_uid: default, page_id: 3 published: 0

12: 1, page_uid: О кроликах, page_url: bunniesnew: 2, page_uid: О кошечках and dogs, page_url: pets: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню, содержимое 1, содежимое 2, копирайт

id: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: default, page_id: 1 published: 1: 2, draft_uid: default, page_id: 2 published: 1: 3, draft_uid: default, page_id: 3 published: 0: 2, resource_uid: 02.mid, isglobal: 0

13: 1, page_uid: О кроликах, page_url: bunniesnew: 2, page_uid: О кошечках and dogs, page_url: pets: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: default, page_id: 1 published: 1: 2, draft_uid: default, page_id: 2 published: 1: 3, draft_uid: default, page_id: 3 published: 0: 2, resource_uid: 02.mid, isglobal: 0

14: 1, page_uid: О кроликах…, page_url: bunniesnew: 2, page_uid: О кошечках and dogs, page_url: pets: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 1: 2, draft_uid: default, page_id: 2 published: 1: 3, draft_uid: default, page_id: 3 published: 0: 2, resource_uid: 02.mid, isglobal: 0

15: 1, page_uid: О кроликах…, page_url: bunniesnew: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 1: 3, draft_uid: default, page_id: 3 published: 0: 2, resource_uid: 02.mid, isglobal: 0

16: 1, page_uid: О кроликах…, page_url: bunniesnew: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 1: 3, draft_uid: default, page_id: 3 published: 0: 2, resource_uid: 02.mid, isglobal: 0

17: 1, page_uid: О кроликах…, page_url: bunniesnew: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 0: 3, draft_uid: default, page_id: 3 published: 0: 4, draft_uid: черновичок my, page_id: 1 published: 1: 2, resource_uid: 02.mid, isglobal: 0

18: 1, page_uid: О кроликах…, page_url: bunniesnew: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 0: 3, draft_uid: default, page_id: 3 published: 0: 4, draft_uid: черновичок my, page_id: 1 published: 1: 5, draft_uid: черновичок my2, page_id: 1 published: 0: 2, resource_uid: 02.mid, isglobal: 0

19: 1, page_uid: О кроликах…, page_url: bunniesnew: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 0: 3, draft_uid: default, page_id: 3 published: 0: 4, draft_uid: черновичок my, page_id: 1 published: 1: 2, resource_uid: 02.mid, isglobal: 0

20: 1, page_uid: О кроликах…, page_url: bunniesnew: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 0: 3, draft_uid: default, page_id: 3 published: 0: 4, draft_uid: черновичок my, page_id: 1 published: 1: 2, resource_uid: 02.mid, isglobal: 0: 3, resource_uid: 2009-04-13-1239634885_1024x600_scrot.png, isglobal: 1

21: 1, page_uid: О кроликах…, page_url: bunniesnew: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 0: 3, draft_uid: default, page_id: 3 published: 0: 4, draft_uid: черновичок my, page_id: 1 published: 1: 2, resource_uid: 02.mid, isglobal: 0: 3, resource_uid: 2009-04-13-1239634885_1024x600_scrot.png, isglobal: 1: 4, resource_uid: aleaf.jpg, isglobal: 1

22: 1, page_uid: О кроликах…, page_url: bunniesnew: 3, page_uid: Заготовочка о пушистиках, page_url: shushpan: 1, template_uid: Меню. Содержимое 1. Содежимое 2. Копирайт.: 2, template_uid: Содержимое и копирайт

Template Drafts: 1, draft_uid: default, temp_id: 1: 2, draft_uid: default, temp_id: 2Drafts: 1, draft_uid: Крольчатина, page_id: 1 published: 0: 3, draft_uid: default, page_id: 3 published: 1: 4, draft_uid: черновичок my, page_id: 1 published: 1: 2, resource_uid: 02.mid, isglobal: 0: 3, resource_uid: 2009-04-13-1239634885_1024x600_scrot.png, isglobal: 1: 4, resource_uid: aleaf.jpg, isglobal: 1


МЕНЮ

Содержимое 1

Содержимое 2

Копирайт обновлённый

23


Кроликииии они такие ccccc….

@|@

Мех и мясо бла-бла

24


О кроликах…@;@bunniesnew@;@Крольчатина@,@0@;@черновичок my@,@1@|@Заготовочка о пушистиках@;@shushpan@;@default@,@125


Меню. Содержимое 1. Содежимое 2. Копирайт.@|@Содержимое и копирайт

Step 26


@|@2@|@327


-04-13-1239634885_1024x600_scrot.png@;@var/uploads/resources/2009-04-13-1239634885_1024x600_scrot.png@;@png@|@aleaf.jpg@;@var/uploads/resources/aleaf.jpg@;@jpg28


.mid@;@var/uploads/resources/02.mid@;@midi

Step 29


3.2Тестирование удаленного установщика


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

В качестве объекта тестирования был выбран Интернет-хостинг. Сам установщик находился на локальном сервере с выходом в Интернет.

На рисунке 4.1 представлена форма, которую заполняет пользователь. Далее он нажимает кнопку «Установить» и ожидает завершения установки.


Рисунок 4.1 - Система устанавливается


На рисунке 4.2 представлено успешное выполнение установки.


Рисунок 4.2 - Система установлена


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

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


Рисунок 4.4 - Содержимое файловой системы после установки


4Руководство пользователя


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


Клиент должен вызвать скрипт coordinator.php, передав ему список необходимых параметров и их значения методом POST. Взаимодействие между клиентом и сервером осуществляется путем передачи команд и считывания результата их выполнения. Поэтому клиент должен всегда дожидаться ответа от сервера. В списке параметров присутствует обязательный параметра типа «команды», который задает необходимое для клиента действие. Все возможные команды описаны ниже.

Формат описания: вначале идет понятное человека название параметра и дополнительное описание, эта части выделена символами « // »; далее идет необходимый список параметров, обрамленный « // ». До знака «=» идет название параметра, после знака «=» - описание его значения. В квадратных скобках может указываться сноска на примечание к конкретному параметру или его обязательность. После списка параметров возможно наличие дополнительного описания и примера использования.


// Добавление шаблона

// Служит для добавления новосозданного шаблона в базу

// =template_add_uid=<uid нового шаблона>_uid=<uid черновика> [1]_data=<html тэги взятые из body>

//


// Добавление страницы

// Служит для добавления новосозданной страницы в базу

// =page_add_uid=<uid новой страницы>_uid=<uid связанного шаблона>_uid=<uid черновика страницы> [можно опустить для uid по-умолчанию]_url=<url-имя страницы для генерации>

object_data=<html тэги взятые из body>

published=<true/false - публиковать ли страницу или нет> [2]

//


// Добавление черновика

// Служит для добавления новосозданного черновика в базу

// =draft_add_uid=<uid страницы>

template_uid=<uid связанного шаблона>_uid=<uid черновика страницы>

object_data=<html тэги взятые из body>

published=<true/false - публиковать ли страницу или нет> [2]

//


// Сохранить шаблон

// Служит для сохранения существующего шаблона

// Присутствуют необязательные параметры

// =template_save_uid=<uid шаблона> [обязательный параметр]_uid=<uid черновика> [1]_data=<html тэги взятые из body>_uid=<новый uid шаблона на смену старому>

//


// Сохранить черновик страницы

// Сохраняет измененный черновик существующей страницы

// Присутствуют необязательные параметры

// =page_savedraft_uid=<uid новой страницы> [обязательный параметр]_uid=<uid связанного шаблона> [для черновика]_uid=<uid черновика страницы> [для черновика обязательный]_url=<url-имя страницы для генерации>_data=<html тэги взятые из body> [для черновика]=<true/false - публиковать ли страницу или нет> [2] [для черновика]_draftuid=<новый uid для черновика> [для черновика]_pageuid=<новый uid для страницы>

//


// Удалить ресурс

// Служит для удаления существующего ресурса

// Удаляется сразу с диска

// =resource_remove_uid=<uid ресурса>

//


// Удалить страницу

// Служит для удаления существующей страницы

// Удаляется сразу с диска а также все ассоциированные черновики

// =page_remove_uid=<uid страницы>

//


// Удалить черновик страницы

// Служит для удаления существующего черновика страницы

// Удаляется сразу с диска

// =page_removedraft_uid=<uid страницы>_uid=<uid черновика>

//


// Удалить шаблон

// Служит для удаления существующего шаблона

// =template_remove_uid=<uid шаблона>

//


// Получить шаблон

// Отдает код шаблона

//

cmd=template_get_uid=<uid шаблона>

//


// Получить черновик страницы

// Отдает код черновика страницы

// =page_getdraft_uid=<uid страницы>

draft_uid=<uid черновика>

//


// Получить данные о страницах для ЦУП

// =mcc_get_pages

// Возвращает:

// Формат:

// page_uid; page_url; draft1, published; draft2, published|page_uid; page_url; draft1, published

// Пример:

// О кроликах…; bunniesnew; Крольчатина, 0; черновичок my, 1; черновичок my2,0|Заготовочка о пушистиках; shushpan; default, 0|

// где | - разделитель нормальный

// ; - подразделитель

// , - подподразделитель

// Разделитель не обязательно имеет указанный вид, поэтому должен быть глобальной переменной!

//


// Получить данные о шаблонах для ЦУП

// =mcc_get_templates

// Возвращает:

// Формат:

// template_uid@|@template_uid@|@template_uid

// Пример:

// Меню. Содержимое 1. Содежимое 2. Копирайт.@|@Содержимое и копирайт

// где @|@ - разделитель нормальный

// Разделитель не обязательно имеет указанный вид, поэтому должен быть глобальной переменной!

//


// Получить общие данные для ЦУП

//

cmd=mcc_get_status

// Возвращает:

// Формат:

// templates_count@|@pages_count@|@resources_count

// Пример:

// 2@|@2@|@3

// где @|@ - разделитель нормальный

// Разделитель не обязательно имеет указанный вид, поэтому должен быть глобальной переменной!

//


// Получить данные о ресурсах для ЦУП или Редактора

// Присутствуют необязательные параметры

// =resources_get_type=<страница или шаблон (p/t)>_uid=<uid страницы или шаблона>

// Два последних параметра необязательны. Если они не указаны, то извлекаются

// все глобальные ресурсы. Если указаны, то только ресурсы специфицированной

// страницы или шаблона.

//

// Возвращает:

// Формат:

// resource_uid@;@path@;@type@|@resource_uid@;@path@;@type

// Пример:

// 2009-04-13-1239634885_1024x600_scrot.png@;@/data/projects/projectx/svn/trunk/var/uploads/resources/2009-04-13-1239634885_1024x600_scrot.png@;@png@|@aleaf.jpg@;@/data/projects/projectx/svn/trunk/var/uploads/resources/aleaf.jpg@;@jpg

// где @|@ - разделитель нормальный

// @;@ - подразделитель

// Разделитель не обязательно имеет указанный вид, поэтому должен быть глобальной переменной!

//


[1] В данной версии шаблон имеет только один черновик с uid=default,

поэтому данный параметр можно опустить.

[2] В случае публикации страница сразу же сгенерируется.

Во всех случаях, если не оговорено иное, при успешном выполнении операции сервер возвращает сообщение «OK». Булевы параметры передаются в текстовом виде строчными латинскими буквами: «true» или «false»

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

<form enctype= «multipart/form-data» action= «resource_uploader.php» method= «post»>

<input type= «hidden» name= «MAX_FILE_SIZE» value= «300000»>

<input type= «hidden» name= «type» value= «midi»>

<input type= «hidden» name= «isglobal» value= «false»>

<input type= «hidden» name= «usedin_type» value= «page»>

<input type= «hidden» name= «usedin_uid» value= «mynewpage01»>this file: <input name= «resource» type= «file»>

<input type= «submit» value= «Send File»>

</form>


4.2Руководство по работе с удаленным установщиком


Удаленный установщик следует разместить в той же папке, где находится система создания и управления сайтами. В папке установщика следует изменить файл files, указав в нем все копируемые на FTP файлы и папки. Пример:

.php

/coordinator.php/resource_uploader.php/install.php

/dbm/dbm/dbm.php


Далее следует отредактировать файл permissions1, в котором выставить специальные права доступа на отдельные файлы или папки, присваиваемые до вызова установщика базы данных, в виде:

.php 0640,


где 0640 - права доступа к файлу в восьмиричном виде.

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

Также убедитесь, что папка tmp доступна для записи php-интерпретатору.

Запуск установщика производится через файл installer.html.



Заключение


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

·реализовано полное кэширование страниц в файловую систему, ускоряя доступ к ним;

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

·создан интерфейс для простого и легкого соединения сервера с клиентом;

·реализована возможность быстрой адаптации системы под различные СУБД.

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

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



Библиография


1The CMS Matrix [Электронный ресурс] / Обзор и сравнение современных CMS. - Режим доступа: #"justify">2GOOGLE [Электронный ресурс] / Мультиязыковой Интернет-поисковик. - Режим доступа: #"justify">Wikipedia, the free encyclopedia [Электронный ресурс]: Cвободная общедоступная многоязычная универсальная энциклопедия. - Режим доступа: #"justify">4HTMLBOOK.RU [Электронный ресурс] / Сайт посвященный языку HTML, CSS, веб-дизайну, графике и процессу создания сайтов. - Режим доступа: #"justify">PHP Manual [Электронный ресурс] / Официальная документация PHP. - Режим доступа: #"justify">6W3Schools [Электронный ресурс] / Портал для веб-разработчиков. - Режим доступа: #"justify">СанПиН 2.2.2/2.4.1340-03 [Электронный ресурс] / Санитарные правила и нормы. Режим доступа: #"justify">Приложение


Исходный код координатора (coordinator.php)


<? php

_once ('../config.php');_once ('stm/stm.php');_once ('lib/strbool.php');


$stm = new StorageManager ($config_storage_type, $config_db_host, $config_db_user,

$config_db_password, $config_db_name);


$cmd = $_POST['cmd'];

($cmd)

{

// Adding absolutely new project«project_add»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];$stm->AddProject ($project_uid);

};


// Adding newly uploaded resource«resource_add»:

{

$uid = $_POST['uid'];

$isglobal = $_POST['isglobal'];

$path = $_POST['path'];

$type = $_POST['type'];

$usedin_type = $_POST ['usedin_type'];

$usedin_uid = $_POST ['usedin_uid'];(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

// If resource is global(strbool:istrue($isglobal))

{$stm->AddResource ($uid, strbool:tobool($isglobal), $path,

$type, $project_uid);

}

{$stm->AddResource ($uid, strbool:tobool($isglobal), $path,

$type, $project_uid, $usedin_uid, $usedin_type);

}

};


// Adding absolutely new template«template_add»:

{

$template_uid = $_POST ['template_uid'];(! isset ($_POST['draft_uid'])) $draft_uid = «default»;$draft_uid = $_POST ['draft_uid'];(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$creation_time = time();

$modification_time = $creation_time;

$object_data = stripslashes ($_POST['object_data']);$stm->AddTemplate ($template_uid, $draft_uid, $creation_time,

$modification_time, $object_data, $project_uid);

};


// Adding absolutely new page«page_add»:

{

$page_uid = $_POST ['page_uid'];(! isset ($_POST['draft_uid'])) $draft_uid = «default»;$draft_uid = $_POST ['draft_uid'];(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$template_uid = $_POST ['template_uid'];

$creation_time = time();

$modification_time = $creation_time;

$page_url = $_POST ['page_url'];

$object_data = stripslashes ($_POST['object_data']);

$published = $_POST['published'];

$generated_modification_time = 0;

$generated_draft_uid = $draft_uid;$stm->AddPage ($page_uid, $draft_uid, $template_uid, $creation_time,

$modification_time, $page_url,

$object_data, $published,

$generated_modification_time, $generated_draft_uid,

$project_uid);

};


// Saving template«template_save»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];(! isset ($_POST['template_uid'])) die («Not valid arguments»);

$template_uid = $_POST ['template_uid'];(! isset ($_POST['draft_uid'])) $draft_uid = «default»;$draft_uid = $_POST ['draft_uid'];


$modification_time = FALSE;

$object_data = FALSE;

$new_uid = FALSE;

$modification_time = time();(isset ($_POST['object_data'])) $object_data = stripslashes ($_POST['object_data']);(isset ($_POST['new_uid'])) $new_uid = $_POST ['new_uid'];$stm->SaveTemplate ($project_uid, $template_uid, $draft_uid,

$modification_time, $object_data, $new_uid);

};


// Saving page draft«page_savedraft»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];(! isset ($_POST['page_uid'])) die («Not valid arguments»);

$page_uid = $_POST ['page_uid'];


$draft_uid = FALSE;(isset ($_POST['draft_uid'])) $draft_uid = $_POST ['draft_uid'];


$template_uid = FALSE;

$page_url = FALSE;

$object_data = FALSE;

$published = FALSE;

$modification_time = time();

$new_draftuid = FALSE;

$new_pageuid = FALSE;(isset ($_POST['template_uid'])) $template_uid = $_POST ['template_uid'];(isset ($_POST['page_url'])) $page_url = $_POST ['page_url'];(isset ($_POST['object_data'])) $object_data = stripslashes ($_POST['object_data']);(isset ($_POST['published'])) $published = $_POST['published'];(isset ($_POST['new_draftuid'])) $new_draftuid = $_POST ['new_draftuid'];(isset ($_POST['new_pageuid'])) $new_pageuid = $_POST ['new_pageuid'];$stm->SavePageDraft ($project_uid, $page_uid, $draft_uid, $template_uid,

$modification_time, $page_url,

$object_data, $published,

$new_draftuid, $new_pageuid);

};


// Adding absolutely new draft«page_adddraft»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$page_uid = $_POST ['page_uid'];

$draft_uid = $_POST ['draft_uid'];

$template_uid = $_POST ['template_uid'];

$creation_time = time();

$modification_time = $creation_time;

//TODO: make defaults for object_data

$object_data = stripslashes ($_POST['object_data']);

$published = $_POST['published'];$stm->AddDraft ($project_uid, $page_uid, $draft_uid, $template_uid,

$creation_time, $modification_time,

$object_data, $published);

};


// Remove resource«resource_remove»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$resource_uid = $_POST ['resource_uid'];$stm->RemoveResource ($project_uid, $resource_uid, TRUE);

};

// Remove page«page_remove»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$page_uid = $_POST ['page_uid'];$stm->RemovePage ($project_uid, $page_uid, TRUE);

};


// Remove page draft«page_removedraft»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$page_uid = $_POST ['page_uid'];

$draft_uid = $_POST ['draft_uid'];$stm->RemoveDraft ($project_uid, $page_uid, $draft_uid, TRUE);

};


// Remove template«template_remove»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$template_uid = $_POST ['template_uid'];$stm->RemoveTemplate ($project_uid, $template_uid);

};

// Get template«template_get»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$template_uid = $_POST ['template_uid'];(! isset ($_POST['draft_uid'])) $draft_uid = «default»;$draft_uid = $_POST ['draft_uid'];$stm->GetTemplate ($project_uid, $template_uid, $draft_uid);

};


// Get page draft«page_getdraft»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];

$page_uid = $_POST ['page_uid'];(! isset ($_POST['draft_uid'])) $draft_uid = «default»;$draft_uid = $_POST ['draft_uid'];$stm->GetPageDraft ($project_uid, $page_uid, $draft_uid);

};


// Get pages info for MCC«mcc_get_pages»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];$stm->MccGetPages ($project_uid);

};


// Get templates info for MCC«mcc_get_templates»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];$stm->MccGetTemplates ($project_uid);

};


// Get common info for MCC«mcc_get_status»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];$stm->MccGetStatus ($project_uid);

};


// Get resources info for MCC or Editor«resources_get»:

{(! isset ($_POST['project_uid'])) $project_uid = «default»;$project_uid = $_POST ['project_uid'];


$usedin_type = FALSE;

$usedin_uid = FALSE;(isset ($_POST['usedin_type'])) $usedin_type = $_POST ['usedin_type'];(isset ($_POST['usedin_uid'])) $usedin_uid = $_POST ['usedin_uid'];$stm->GetResources ($project_uid, $usedin_type, $usedin_uid);

};

:

{«Bad command.»;

}

}

($stm);

$_POST = array();


?>


Приложение В

Исходный код автоматической системы тестирования (dummy.php)


<? php

_once ('install.php');_once ('../config.php');_once ('lib/strbool.php');


$verbose = TRUE;

$step = 1;showdb()

{$verbose;(!$verbose) return;_once ('dbm/dbm.php');$config_db_host, $config_db_user, $config_db_password, $config_db_name;

$dbm = new MysqlDbm ($config_db_host, $config_db_user, $config_db_password);

$dbm->SelectDatabase ($config_db_name);

$step;«<br><b><u><i>Step».$step. «</i></u></b><br>»;

$res = $dbm->GetTable (array('pages'));«<b><u>Pages</u></b><br>»;($row = mysql_fetch_array ($res, MYSQL_NUM))

{(«<b>id:</b>%s, <b>page_uid:</b>%s, <b>page_url:</b>%s<br>», $row[0], $row[1], $row[4]);

}

$res = $dbm->GetTable (array('templates'));«<b><u>Templates</u></b><br>»;($row = mysql_fetch_array ($res, MYSQL_NUM))

{(«<b>id:</b>%s, <b>template_uid:</b>%s<br>», $row[0], $row[1]);

}

$res = $dbm->GetTable (array('template_drafts'));«<b><u>Template Drafts</u></b><br>»;($row = mysql_fetch_array ($res, MYSQL_NUM))

{(«<b>id:</b>%s, <b>draft_uid:</b>%s, <b>temp_id:</b>%s<br>», $row[0], $row[1], $row[2]);

}

$res = $dbm->GetTable (array('page_drafts'));«<b><u>Page Drafts</u></b><br>»;($row = mysql_fetch_array ($res, MYSQL_NUM))

{(«<b>id:</b>%s, <b>draft_uid:</b>%s, <b>page_id:</b>%s <b>published:</b>%s<br>», $row[0], $row[1], $row[7], $row[6]);

}

$res = $dbm->GetTable (array('resources'));«<b><u>Resources</u></b><br>»;($row = mysql_fetch_array ($res, MYSQL_NUM))

{(«<b>id:</b>%s, <b>resource_uid:</b>%s, <b>isglobal:</b>%s<br>», $row[0], $row[1], $row[2]);

}($dbm);«<br>»;

$step += 1;

}

showsteponly()

{$verbose;(!$verbose) return;$step;«<br><b><u><i>Step».$step. «</i></u></b><br>»;«<br>»;

$step += 1;

}

();

$_POST['cmd'] = «project_add»;('coordinator.php');();


$_POST['cmd'] = «template_add»;

$_POST ['template_uid'] = «Меню, содержимое 1, содежимое 2, копирайт»;

$_POST ['draft_uid'] = «default»;

$_POST ['object_data'] = '<div id= «menu»>МЕНЮ</div><div id= «text1» editable= «true»>Содержимое 1</div><div id= «text2» editable= «true»>Содержимое 2</div><div id= «copy»>Копирайт</div>';('coordinator.php');();


$_POST['cmd'] = «page_add»;

$_POST ['page_uid'] = «О кроликах»;

$_POST ['template_uid'] = «Меню, содержимое 1, содежимое 2, копирайт»;

// $_POST ['draft_uid'] = «default»;

$_POST ['page_url'] = «bunnies»;

$_POST ['object_data'] = '<div id= «text1»>Кроликииии они такие….</div>'.$config_delim_normal.'<div id= «text2»>Мех и мясо бла-бла</div>';

$_POST['published'] = strbool:get_true();('coordinator.php');();


$_POST['cmd'] = «template_save»;

$_POST ['template_uid'] = «Меню, содержимое 1, содежимое 2, копирайт»;

$_POST ['object_data'] = '<div id= «menu»>МЕНЮ</div><div id= «text1» editable= «true»>Содержимое 1</div><div id= «text2» editable= «true»>Содержимое 2</div><div id= «copy»>Копирайт обновлённый</div>';

require ('coordinator.php');();


$_POST['cmd'] = «page_savedraft»;

$_POST ['page_uid'] = «О кроликах»;

$_POST ['template_uid'] = «Меню, содержимое 1, содежимое 2, копирайт»;

$_POST ['draft_uid'] = «default»;

$_POST ['page_url'] = «bunniesnew»;

$_POST ['object_data'] = '<div id= «text1»>Кроликииии они такие….</div>'.$config_delim_normal.'<div id= «text2»>Мех и мясо бла-бла, обновлено</div>';

$_POST['published'] = strbool:get_true();('coordinator.php');();


////////////////////////////////////////


$_POST['cmd'] = «template_add»;

$_POST ['template_uid'] = «Содержимое и копирайт»;

$_POST ['object_data'] = '<div id= «text» editable= «true»></div><div id= «copy»>Копирайт</div>';('coordinator.php');();


$_POST['cmd'] = «page_add»;

$_POST ['page_uid'] = «О кошечках and dogs»;

$_POST ['template_uid'] = «Содержимое и копирайт»;

$_POST ['draft_uid'] = «default»;

$_POST ['page_url'] = «pets»;

$_POST ['object_data'] = '<div id= «text»>Some info about blah-blah</div>';

$_POST['published'] = strbool:get_true();('coordinator.php');();


$_POST['cmd'] = «page_add»;

$_POST ['page_uid'] = «Заготовочка о пушистиках»;

$_POST ['template_uid'] = «Содержимое и копирайт»;

$_POST ['draft_uid'] = «default»;

$_POST ['page_url'] = «shushpan»;

$_POST ['object_data'] = '<div id= «text»>Шушпанчики…</div>';

$_POST['published'] = strbool:get_false();('coordinator.php');();


////////////////////////////////////////


$_POST['cmd'] = «resource_add»;

$_POST['uid'] = «01.mid»;

$_POST['isglobal'] = strbool:get_false();

$_POST['path'] = «var/uploads/resources/01.mid»;

$_POST['type'] = «midi»;

$_POST ['usedin_type'] = «page»;

$_POST ['usedin_uid'] = «Заготовочка о пушистиках»;

require ('coordinator.php');();

$_POST['cmd'] = «resource_remove»;

$_POST ['resource_uid'] = «01.mid»;('coordinator.php');();


$_POST['cmd'] = «resource_add»;

$_POST['uid'] = «02.mid»;

$_POST['isglobal'] = strbool:get_false();

$_POST['path'] = «var/uploads/resources/02.mid»;

$_POST['type'] = «midi»;

$_POST ['usedin_type'] = «page»;

$_POST ['usedin_uid'] = «Заготовочка о пушистиках»;

require ('coordinator.php');();


//////////////////////////////////

$_POST['cmd'] = «template_save»;

$_POST ['template_uid'] = «Меню, содержимое 1, содежимое 2, копирайт»;

$_POST ['object_data'] = '<div id= «menu»>МЕНЮ</div><div id= «text1» editable= «true»>Содержимое 1</div><div id= «text2» editable= «true»>Содержимое 2</div><div id= «copy»>Копирайт обновлённый</div>';

$_POST ['new_uid'] = «Меню. Содержимое 1. Содежимое 2. Копирайт.»;('coordinator.php');();


$_POST['cmd'] = «page_savedraft»;

$_POST ['page_uid'] = «О кроликах»;

$_POST ['template_uid'] = «Меню. Содержимое 1. Содежимое 2. Копирайт.»;

$_POST ['draft_uid'] = «default»;

$_POST ['page_url'] = «bunniesnew»;

$_POST ['object_data'] = '<div id= «text1»>Кроликииии они такие….</div>'.$config_delim_normal.'<div id= «text2»>Мех и мясо бла-бла, обновлено</div>';

$_POST['published'] = strbool:get_true();

$_POST ['new_draftuid'] = «Крольчатина»;

$_POST ['new_pageuid'] = «О кроликах…»;('coordinator.php');();


$_POST['cmd'] = «page_remove»;

$_POST ['page_uid'] = «О кошечках and dogs»;('coordinator.php');();


$_POST['cmd'] = «template_remove»;

$_POST ['template_uid'] = «О кошечках and dogs»;('coordinator.php');();


$_POST['cmd'] = «page_adddraft»;

$_POST ['page_uid'] = «О кроликах…»;

$_POST ['template_uid'] = «Меню. Содержимое 1. Содежимое 2. Копирайт.»;

$_POST ['draft_uid'] = «черновичок my»;

$_POST ['object_data'] = '<div id= «text1»>Кроликииии они такие ccccc….</div>'.$config_delim_normal.'<div id= «text2»>Мех и мясо бла-бла</div>';

$_POST['published'] = strbool:get_true();('coordinator.php');();


$_POST['cmd'] = «page_adddraft»;

$_POST ['page_uid'] = «О кроликах…»;

$_POST ['template_uid'] = «Меню. Содержимое 1. Содежимое 2. Копирайт.»;

$_POST ['draft_uid'] = «черновичок my2»;

$_POST ['object_data'] = '<div id= «text1»>Кроликииии они такие бдя….</div>'.$config_delim_normal.'<div id= «text2»>Мех и мясо бла-бла</div>';

$_POST['published'] = strbool:get_false();('coordinator.php');();


$_POST['cmd'] = «page_removedraft»;

$_POST ['page_uid'] = «О кроликах…»;

$_POST ['draft_uid'] = «черновичок my2»;('coordinator.php');();


$_POST['cmd'] = «resource_add»;

$_POST['uid'] = «2009-04-13-1239634885_1024x600_scrot.png»;

$_POST['isglobal'] = strbool:get_true();

$_POST['path'] = «var/uploads/resources/2009-04-13-1239634885_1024x600_scrot.png»;

$_POST['type'] = «png»;('coordinator.php');();

$_POST['cmd'] = «resource_add»;

$_POST['uid'] = «aleaf.jpg»;

$_POST['isglobal'] = strbool:get_true();

$_POST['path'] = «var/uploads/resources/aleaf.jpg»;

$_POST['type'] = «jpg»;('coordinator.php');();


$_POST['cmd'] = «page_savedraft»;

$_POST ['page_uid'] = «Заготовочка о пушистиках»;

$_POST ['draft_uid'] = «default»;

$_POST['published'] = strbool:get_true();('coordinator.php');();



$_POST['cmd'] = «template_get»;

$_POST ['template_uid'] = «Меню. Содержимое 1. Содежимое 2. Копирайт.»;

$_POST ['draft_uid'] = «default»;('coordinator.php');();


$_POST['cmd'] = «page_getdraft»;

$_POST ['page_uid'] = «О кроликах…»;

$_POST ['draft_uid'] = «черновичок my»;('coordinator.php');();


$_POST['cmd'] = «mcc_get_pages»;('coordinator.php');();

«<br>»;

$_POST['cmd'] = «mcc_get_templates»;('coordinator.php');();

«<br>»;

$_POST['cmd'] = «mcc_get_status»;('coordinator.php');();

«<br>»;

$_POST['cmd'] = «resources_get»;('coordinator.php');();

«<br>»;

$_POST['cmd'] = «resources_get»;

$_POST ['usedin_type'] = 'p';

$_POST ['usedin_uid'] = 'Заготовочка о пушистиках';('coordinator.php');();


?>


Приложение


Исходный код менеджера хранилища (stm.php)


<? php

_once ('lib/valcheck.php');_once ('dbm/dbm.php');_once ('generator/generator.php');_once ('../config.php');


// Interface between actual database and coordinator

// AddResource, AddTemplate, AddPage, SaveTemplate, SavePageDraft,StorageManager

{$dbm = NULL;$db_tables_projects = «projects»;$db_tables_resources = «resources»;$db_tables_resource_usedin = «resource_usedin»;$db_tables_templates = «templates»;$db_tables_template_drafts = «template_drafts»;$db_tables_pages = «pages»;$db_tables_page_drafts = «page_drafts»;$db_name = «»;

__construct ($storage_type, $db_host, $db_user, $db_password, $db_name)

{

$this->db_name = $db_name;

// Creating appropriate db connector($storage_type)

{«mysql»:

{

$this->dbm = new MysqlDbm ($db_host, $db_user, $db_password);

};:

{(«Cannot create storage.»);

}

}

}


// Adding new projectAddProject ($project_uid)

{

// Checking if input is correct(! valcheck:isuid ($project_uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

// Adding project

$vals = array ('project_uid'=>$project_uid);

$this->dbm->AddData ($this->db_tables_projects, $vals);«OK»;

}


// Adding new resourceAddResource ($uid, $isglobal, $path, $type, $project_uid,

$usedin_uid = NULL, $usedin_type = NULL)

{

// Checking if input is correct(! valcheck:isuid($uid) ||! is_bool($isglobal) ||

! valcheck:issystempath($path) ||! valcheck:isalpha($type) ||

! valcheck:isuid ($project_uid))

{«Bad input 1»;

}(!$isglobal && (! valcheck:isuid ($usedin_uid) ||

! valcheck:isalpha ($usedin_type)))

{«Bad input 2»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

$vals = array ('resource_uid'=>$uid,

'isglobal'=>$isglobal,

'path'=>$path,

'data_type'=>$type,

'project_id'=>$project_id);

$this->dbm->AddData ($this->db_tables_resources, $vals);(!$isglobal)

{

// Getting resource id from uid

$id = $this->getIdByUidCond ($this->db_tables_resources, 'resource_uid', $uid, 'project_id', $project_id);

// Getting usedin id from uid($usedin_type == «page»)

{

$usedin_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $usedin_uid, 'project_id', $project_id);

}

{

$usedin_id = $this->getIdByUidCond ($this->db_tables_templates, 'template_uid', $usedin_uid, 'project_id', $project_id);

}

// Adding links

$vals = array ('resource_id'=>$id,

'usedin_id'=>$usedin_id,

'usedin_type'=>$usedin_type);

$this->dbm->AddData ($this->db_tables_resource_usedin, $vals);

}«OK»;

}


// Adding new templateAddTemplate ($template_uid, $draft_uid, $creation_time,

$modification_time, $object_data, $project_uid)

{

// Checking if input is correct(! valcheck:isuid ($template_uid) ||! valcheck:isuid ($draft_uid) ||

! valcheck:isunixtime ($creation_time) ||

! valcheck:isunixtime ($modification_time) ||

! valcheck:isobjectdata ($object_data) ||

! valcheck:isuid ($project_uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

// Adding template

$vals = array ('template_uid'=>$template_uid,

'project_id'=>$project_id);

$this->dbm->AddData ($this->db_tables_templates, $vals);

// Getting template id from uid

$template_id = $this->getIdByUidCond ($this->db_tables_templates, 'template_uid', $template_uid, 'project_id', $project_id);

// Adding template draft

$vals = array ('draft_uid'=>$draft_uid,

'template_id'=>$template_id,

'creation_time'=>$creation_time,

'modification_time'=>$modification_time,

'object_data'=>$object_data);

$this->dbm->AddData ($this->db_tables_template_drafts, $vals);«OK»;

}


// Adding new pageAddPage ($page_uid, $draft_uid, $template_uid, $creation_time,

$modification_time, $page_url, $object_data, $published,

$generated_modification_time, $generated_draft_uid,

$project_uid)

{

// Checking if input is correct(! valcheck:isuid ($page_uid) ||! valcheck:isuid ($draft_uid) ||

! valcheck:isuid ($template_uid) ||! valcheck:isurl ($page_url) ||

! valcheck:isunixtime ($creation_time) ||

! valcheck:isunixtime ($modification_time) ||

! valcheck:isobjectdata ($object_data) ||! is_bool (strbool:tobool($published)) ||

! valcheck:isunixtime ($generated_modification_time) ||

! valcheck:isuid ($generated_draft_uid) ||

! valcheck:isuid ($project_uid))

{«Bad input»;

}

// Adding page

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

$vals = array ('page_uid'=>$page_uid,

'generated_modification_time'=>$generated_modification_time,

'generated_draft_uid'=>$generated_draft_uid,

'page_url'=>$page_url,

'project_id'=>$project_id);

$this->dbm->AddData ($this->db_tables_pages, $vals);

// Getting template id from uid

$template_id = $this->getIdByUidCond ($this->db_tables_templates, 'template_uid', $template_uid, 'project_id', $project_id);

// Getting page id from uid

$page_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $page_uid, 'project_id', $project_id);

// Adding page draft

$vals = array ('draft_uid'=>$draft_uid,

'template_id'=>$template_id,

'creation_time'=>$creation_time,

'modification_time'=>$modification_time,

'object_data'=>$object_data,

'published'=>strbool:tobool($published),

'page_id'=>$page_id);

$this->dbm->AddData ($this->db_tables_page_drafts, $vals);


$this->PublishPage ($project_id, $page_uid);«OK»;

}


// Adding new draftAddDraft ($project_uid, $page_uid, $draft_uid, $template_uid,

$creation_time, $modification_time, $object_data, $published)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||

! valcheck:isuid ($page_uid) ||! valcheck:isuid ($draft_uid) ||

! valcheck:isuid ($template_uid) ||

! valcheck:isunixtime ($creation_time) ||

! valcheck:isunixtime ($modification_time) ||

! valcheck:isobjectdata ($object_data) ||

! is_bool (strbool:tobool($published)))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

// Getting template id from uid

$template_id = $this->getIdByUidCond ($this->db_tables_templates, 'template_uid', $template_uid, 'project_id', $project_id);($template_id == 0) return «Bad template uid»;

// Getting page id from uid

$page_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $page_uid, 'project_id', $project_id);($page_id == 0) return «Bad page uid»;(strbool:istrue($published))

{

// Unpublish all drafts

$table_name = $this->db_tables_page_drafts;

$new_data = array ('published'=>FALSE);

$condition = array ('page_id'=>$page_id);

$this->dbm->UpdateData ($table_name, $new_data, $condition);

}

// Adding page draft

$vals = array ('draft_uid'=>$draft_uid,

'template_id'=>$template_id,

'creation_time'=>$creation_time,

'modification_time'=>$modification_time,

'object_data'=>$object_data,

'published'=>strbool:tobool($published),

'page_id'=>$page_id);

$this->dbm->AddData ($this->db_tables_page_drafts, $vals);


$this->PublishPage ($project_id, $page_uid);«OK»;

}


// Save templateSaveTemplate ($project_uid, $template_uid, $draft_uid,

$modification_time = FALSE,

$object_data = FALSE,

$new_uid = FALSE)

{

// Checking if input is correct(! valcheck:isuid ($template_uid) ||! valcheck:isuid ($draft_uid) ||

! valcheck:isuid ($project_uid))

{«Bad input 1»;

}(($modification_time &&! valcheck:isunixtime ($modification_time)) ||

($object_data &&! valcheck:isobjectdata ($object_data)) ||

($new_uid &&! valcheck:isuid ($new_uid)))

{«Bad input 2»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

// Getting template id from uid

$template_id = $this->getIdByUidCond ($this->db_tables_templates, 'template_uid', $template_uid, 'project_id', $project_id);

// Update template draft

$table_name = $this->db_tables_template_drafts;

$new_data = array();($modification_time) $new_data ['modification_time'] = $modification_time;($object_data) $new_data ['object_data'] = $object_data;

$condition = array ('template_id'=>$template_id,

'draft_uid'=>$draft_uid);

$this->dbm->UpdateData ($table_name, $new_data, $condition);

// Change uid of template($new_uid)

{

$table_name = $this->db_tables_templates;

$new_data = array ('template_uid'=>$new_uid);

$condition = array ('id'=>$template_id);

$this->dbm->UpdateData ($table_name, $new_data, $condition);

}«OK»;

}


// Saving page draftSavePageDraft ($project_uid, $page_uid, $draft_uid,

$template_uid = FALSE,

$modification_time = FALSE,

$page_url = FALSE,

$object_data = FALSE,

$published = FALSE,

$new_draftuid = FALSE,

$new_pageuid = FALSE)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||! valcheck:isuid ($page_uid))

{«Bad input 1»;

}(($draft_uid &&! valcheck:isuid ($draft_uid)) ||

($template_uid &&! valcheck:isuid ($template_uid)) ||

($page_url &&! valcheck:isurl ($page_url)) ||

($modification_time &&! valcheck:isunixtime ($modification_time)) ||

($object_data &&! valcheck:isobjectdata ($object_data)) ||

($published &&! is_bool (strbool:tobool($published))) ||

($new_draftuid &&! valcheck:isuid ($new_draftuid)) ||

($new_pageuid &&! valcheck:isuid ($new_pageuid)))

{«Bad input 2»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

// Assume url won't change

$old_page_url = FALSE;($page_url)

{

// Getting old url to delete old data

$what = array ('page_url');

$from = array ($this->db_tables_pages);

$condition = array ('page_uid'=>$page_uid);

$row = $this->dbm->GetData ($what, $from, $condition);

$old_page_url = $row[0];

// Updating url

$table_name = $this->db_tables_pages;

$new_data = array ('page_url'=>$page_url);

$condition = array ('page_uid'=>$page_uid);

$this->dbm->UpdateData ($table_name, $new_data, $condition);

}($draft_uid)

{

$page_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $page_uid, 'project_id', $project_id);

$draft_id = $this->getIdByUidCond ($this->db_tables_page_drafts, 'draft_uid', $draft_uid, 'page_id', $page_id);

// Updating draft

$table_name = $this->db_tables_page_drafts;

$new_data = array();($modification_time) $new_data ['modification_time'] = $modification_time;($object_data) $new_data ['object_data'] = $object_data;($published)

{(strbool:istrue($published))

{

// Unpublish all drafts

$table_name = $this->db_tables_page_drafts;

$new_data = array ('published'=>FALSE);

$condition = array ('page_id'=>$page_id);

$this->dbm->UpdateData ($table_name, $new_data, $condition);

}


$new_data['published'] = strbool:tobool($published);

}($template_uid)

{

$template_id = $this->getIdByUidCond ($this->db_tables_templates, 'template_uid', $template_uid, 'project_id', $project_id);($template_id == 0)«Error. No such template.»;

$new_data ['template_id'] = $template_id;

}($new_draftuid)

{

$new_data ['draft_uid'] = $new_draftuid;

$draft_uid = $new_draftuid;

}

$condition = array ('id'=>$draft_id);

$this->dbm->UpdateData ($table_name, $new_data, $condition);

// Change uid of page($new_pageuid)

{

$table_name = $this->db_tables_pages;

$new_data = array ('page_uid'=>$new_pageuid);

$condition = array ('id'=>$page_id);

$this->dbm->UpdateData ($table_name, $new_data, $condition);

$page_uid = $new_pageuid;

}

}


$this->PublishPage ($project_id, $page_uid, $old_page_url);«OK»;

}


function PublishPage ($project_id, $page_uid, $old_page_url = FALSE)

{

// Getting page id from uid

$page_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $page_uid, 'project_id', $project_id);

// Getting page url

$what = array ('page_url');

$from = array ($this->db_tables_pages);

$condition = array ('id'=>$page_id);

$row = $this->dbm->GetData ($what, $from, $condition);

$page_url = $row[0];


// Getting draft uid

$what = array ('draft_uid');

$from = array ($this->db_tables_page_drafts);

$condition = array ('page_id'=>$page_id,

'published'=>TRUE);

$row = $this->dbm->GetData ($what, $from, $condition);

$draft_uid = $row[0];


// If no drafts to publish, remove previous from disk(empty ($draft_uid))

{

$gen = new Generator();

$gen->RemovePage ($page_url);FALSE;

}


$draft_id = $this->getIdByUidCond ($this->db_tables_page_drafts, 'draft_uid', $draft_uid, 'page_id', $page_id);


// Getting page draft data

$what = array ('object_data', 'template_id', 'modification_time');

$from = array ($this->db_tables_page_drafts);

$condition = array ('id'=>$draft_id);

$row = $this->dbm->GetData ($what, $from, $condition);

$page_data = $row[0];

$template_id = $row[1];

$modification_time = $row[2];

// Getting template data

$what = array ('object_data');

$from = array ($this->db_tables_template_drafts);

$condition = array ('template_id'=>$template_id);

$row = $this->dbm->GetData ($what, $from, $condition);

$template_data = $row[0];


// Generate pae

$gen = new Generator();

$gen->GeneratePage ($page_url, $page_data, $template_data, $old_page_url);


// Update generation time

$generated_modification_time = $modification_time;

$generated_draft_uid = $draft_uid;

$table_name = $this->db_tables_pages;

$new_data = array ('generated_modification_time'=>$generated_modification_time,

'generated_draft_uid'=>$generated_draft_uid);

$condition = array ('page_uid'=>$page_uid);

$this->dbm->UpdateData ($table_name, $new_data, $condition);

}


// Removes resourceRemoveResource ($project_uid, $uid, $fromdisk = FALSE)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||! valcheck:isuid($uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);($fromdisk)

{

// Getting resource path

$what = array('path');

$from = array ($this->db_tables_resources);

$condition = array ('resource_uid'=>$uid,

'project_id'=>$project_id);

$row = $this->dbm->GetData ($what, $from, $condition);

$path = $row[0];

// Removing resource

$gen = new Generator();

$gen->RemoveResourceFile($path);

}

// Removing links to resource

$resource_id = $this->getIdByUidCond ($this->db_tables_resources, 'resource_uid', $uid, 'project_id', $project_id);

$table_name = $this->db_tables_resource_usedin;

$condition = array ('resource_id'=>$resource_id);

$this->dbm->RemoveData ($table_name, $condition);

// Removing resource

$table_name = $this->db_tables_resources;

$condition = array ('resource_uid'=>$uid);

$this->dbm->RemoveData ($table_name, $condition);«OK»;

}


// Removes pageRemovePage ($project_uid, $uid, $fromdisk = FALSE)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||! valcheck:isuid($uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);($fromdisk)

{

// Getting page url

$what = array ('page_url');

$from = array ($this->db_tables_pages);

$condition = array ('page_uid'=>$uid,

'project_id'=>$project_id);

$row = $this->dbm->GetData ($what, $from, $condition);

$url = $row[0];

// Removing page

$gen = new Generator();

$gen->RemovePage($url);

}

// Removing drafts

$page_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $uid, 'project_id', $project_id);

$table_name = $this->db_tables_page_drafts;

$condition = array ('page_id'=>$page_id);

$this->dbm->RemoveData ($table_name, $condition);

// Removing page

$table_name = $this->db_tables_pages;

$condition = array ('page_uid'=>$uid);

$this->dbm->RemoveData ($table_name, $condition);«OK»;

}


// Removes templateRemoveTemplate ($project_uid, $uid)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||! valcheck:isuid($uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

// Removing template

$table_name = $this->db_tables_templates;

$condition = array ('template_uid'=>$uid,

'project_id'=>$project_id);

$this->dbm->RemoveData ($table_name, $condition);«OK»;

}

// Removes pageRemoveDraft ($project_uid, $page_uid, $draft_uid, $fromdisk = FALSE)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||

! valcheck:isuid ($page_uid) ||! valcheck:isuid ($draft_uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

$page_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $page_uid, 'project_id', $project_id);

$draft_id = $this->getIdByUidCond ($this->db_tables_page_drafts, 'draft_uid', $draft_uid, 'page_id', $page_id);($fromdisk)

{

// Getting draft published bool

$what = array('published');

$from = array ($this->db_tables_page_drafts);

$condition = array ('id'=>$draft_id);

$row = $this->dbm->GetData ($what, $from, $condition);

$published = $row[0];($published)

{

// Getting page url

$what = array ('page_url');

$from = array ($this->db_tables_pages);

$condition = array ('id'=>$page_id);

$row = $this->dbm->GetData ($what, $from, $condition);

$url = $row[0];

// Removing page

$gen = new Generator();

$gen->RemovePage($url);

}

}

// Removing draft

$table_name = $this->db_tables_page_drafts;

$condition = array ('id'=>$draft_id);

$this->dbm->RemoveData ($table_name, $condition);«OK»;

}


// Gets id by uidfunction getIdByUid ($table_name, $uid_name, $uid_value)

{

// Getting template id from uid

$what = array('id');

$from = array ($table_name);

$condition = array ($uid_name=>$uid_value);

$row = $this->dbm->GetData ($what, $from, $condition);(int)$row[0];

}


// Gets id by uid with equality conditionfunction getIdByUidCond ($table_name, $uid_name, $uid_value,

$cond_name, $cond_value)

{

// Getting template id from uid

$what = array('id');

$from = array ($table_name);

$condition = array ($uid_name=>$uid_value,

$cond_name=>$cond_value);

$row = $this->dbm->GetData ($what, $from, $condition);(int)$row[0];

}


// Returns template dataGetTemplate ($project_uid, $template_uid, $draft_uid)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||

! valcheck:isuid ($template_uid) ||! valcheck:isuid ($draft_uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

$template_id = $this->getIdByUidCond ($this->db_tables_templates, 'template_uid', $template_uid, 'project_id', $project_id);

$what = array ('object_data');

$from = array ($this->db_tables_template_drafts);

$condition = array ('draft_uid'=>$draft_uid,

'template_id'=>$template_id);

$row = $this->dbm->GetData ($what, $from, $condition);$row[0];

}

// Returns page dataGetPageDraft ($project_uid, $page_uid, $draft_uid)

{

// Checking if input is correct(! valcheck:isuid ($project_uid) ||

! valcheck:isuid ($page_uid) ||! valcheck:isuid ($draft_uid))

{«Bad input»;

}

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

$page_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $page_uid, 'project_id', $project_id);

$what = array ('object_data');

$from = array ($this->db_tables_page_drafts);

$condition = array ('draft_uid'=>$draft_uid,

'page_id'=>$page_id);

$row = $this->dbm->GetData ($what, $from, $condition);$row[0];

}


// Returns all pages infoMccGetPages ($project_uid)

{

// Checking if input is correct(! valcheck:isuid ($project_uid))

{«Bad input»;

}

global $config_delim_normal;$config_delim_sub;$config_delim_subsub;

$res = «»;


// Getting all pages

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

$what = array ('id', 'page_uid', 'page_url');

$from = array ($this->db_tables_pages);

$condition = array ('project_id'=>$project_id);

$rows = $this->dbm->GetAllData ($what, $from, $condition);

//page_uid; page_url; draft1, pub; draft2, pub|page_uid; page_url; draft1, pub

$c = count($rows) - 1;($rows as $row)

{

$res.= $row[1].$config_delim_sub.$row[2];


// Getting all drafts

$page_id = $row[0];

$what = array ('draft_uid', 'published');

$from = array ($this->db_tables_page_drafts);

$condition = array ('page_id'=>$page_id);

$rowsd = $this->dbm->GetAllData ($what, $from, $condition);($rowsd as $rowd)

{

$res.= $config_delim_sub.$rowd[0].$config_delim_subsub.$rowd[1];

}($c!= 0)

{

$res.= $config_delim_normal;

}

$c -= 1;

}$res;

}


// Returns all templates infoMccGetTemplates ($project_uid)

{

// Checking if input is correct(! valcheck:isuid ($project_uid))

{«Bad input»;

}

$config_delim_normal;$config_delim_sub;$config_delim_subsub;

$res = «»;


// Getting all templates

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

$what = array ('id', 'template_uid');

$from = array ($this->db_tables_templates);

$condition = array ('project_id'=>$project_id);

$rows = $this->dbm->GetAllData ($what, $from, $condition);

//template_uid|template_uid|template_uid

$c = count($rows) - 1;($rows as $row)

{

$res.= $row[1];($c!= 0)

{

$res.= $config_delim_normal;

}

$c -= 1;

}$res;

}


// Returns status of projectMccGetStatus ($project_uid)

{$config_delim_normal;$config_delim_sub;$config_delim_subsub;

$res = «»;


$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);

// Getting templates count

$from = array ($this->db_tables_templates);

$condition = array ('project_id'=>$project_id);

$count = $this->dbm->GetCount ($from, $condition);

$res.= $count.$config_delim_normal;

// Getting pages count

$from = array ($this->db_tables_pages);

$condition = array ('project_id'=>$project_id);

$count = $this->dbm->GetCount ($from, $condition);

$res.= $count.$config_delim_normal;

// Getting resources count

$from = array ($this->db_tables_resources);

$condition = array ('project_id'=>$project_id);

$count = $this->dbm->GetCount ($from, $condition);

$res.= $count;

$res;

}


// Returns resources infoGetResources ($project_uid,

$usedin_type = FALSE,

$usedin_uid = FALSE)

{

// Checking if input is correct(! valcheck:isuid ($project_uid))

{«Bad input 1»;

}

//TODO: make better check on type, and standartize it(($usedin_type &&! valcheck:isuid ($usedin_type)) ||

($usedin_uid &&! valcheck:isuid ($usedin_uid)))

{«Bad input 2»;

}

$config_delim_normal;$config_delim_sub;$config_delim_subsub;

$res = «»;


// Getting all resources

$this->dbm->SelectDatabase ($this->db_name);

$project_id = $this->getIdByUid ($this->db_tables_projects, 'project_uid', $project_uid);


// If resource from page or template($usedin_type)

{($usedin_type == «p»)

{

$usedin_id = $this->getIdByUidCond ($this->db_tables_pages, 'page_uid', $usedin_uid, 'project_id', $project_id);

}

{

$usedin_id = $this->getIdByUidCond ($this->db_tables_templates, 'template_uid', $usedin_uid, 'project_id', $project_id);

}

// Getting id's of associated resources

$what = array ('resource_id');

$from = array ($this->db_tables_resource_usedin);

$condition = array ('usedin_type'=>$usedin_type,

'usedin_id'=>$usedin_id);

$rows = $this->dbm->GetAllData ($what, $from, $condition);

$c = count($rows) - 1;($rows as $row)

{

$resource_id = $row[0];

$what = array ('resource_uid', 'path', 'data_type');

$from = array ($this->db_tables_resources);

$condition = array ('id'=>$resource_id);

$rowr = $this->dbm->GetData ($what, $from, $condition);

$res.= $rowr[0].$config_delim_sub.$rowr[1].$config_delim_sub.$rowr[2];($c!= 0)

{

$res.= $config_delim_normal;

}

$c -= 1;

}

}

// If global resource

{

// Getting data straight away

$what = array ('resource_uid', 'path', 'data_type');

$from = array ($this->db_tables_resources);

$condition = array ('project_id'=>$project_id,

'isglobal'=>TRUE);

$rows = $this->dbm->GetAllData ($what, $from, $condition);

$c = count($rows) - 1;($rows as $row)

{

$res.= $row[0].$config_delim_sub.$row[1].$config_delim_sub.$row[2];($c!= 0)

{

$res.= $config_delim_normal;

}

$c -= 1;

}

}

$res;

}

}


?>


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

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ