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

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

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

Введение


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

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

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

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

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

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


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

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

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

Систем создания и управления сайтами (ССУС) на сегодняшний день существует большое множество. На одном из самых популярных Интернет-ресурсов, посвященном обзору современных ССУС, #"552854.files/image001.gif">

Рисунок 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

Уникальный числовой идентификатор записи

INT

10

project_uid

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

VARCHAR

256


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

Поле

Содержание

Тип данных

Размер

id

Уникальный числовой идентификатор записи

INT

10

page_uid

Уникальное имя страницы

VARCHAR

256

generated_modification_time

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

INT

12

generated_draft_uid

Имя последнего сгенерированного черновика

VARCHAR

256

page_url

Имя страницы, видимое в адресной строке браузера

VARCHAR

256

project_id

Идентификатор проекта, в котором находится страница

INT

10


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

Поле

Содержание

Тип данных

Размер

id

Уникальный числовой идентификатор записи

INT

10

draft_uid

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

VARCHAR

256

template_id

Идентификатор используемого в черновике щаблона

VARCHAR

256

creation_time

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

INT

12

modification_time

Время последней модификации черновика

INT

12

object_data

Содержимое страницы для данного черновика

TEXT


published

Опубликованность черновика

TINYINT

1

page_id

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

INT

10


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

Поле

Содержание

Тип данных

Размер

id

Уникальный числовой идентификатор записи

INT

10

template_uid

Уникальное имя шаблона

VARCHAR

256

project_id

Идентификатор проекта, в котором находится страница

INT

10


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

Поле

Содержание

Тип данных

Размер

id

Уникальный числовой идентификатор записи

INT

10

draft_uid

Уникальное имя черновика шаблона

VARCHAR

256

creation_time

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

INT

12

modification_time

Время последней модификации черновика

INT

12

object_data

Содержимое шаблона для данного черновика

TEXT



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

Поле

Содержание

Тип данных

Размер

id

Уникальный числовой идентификатор записи

INT

10

resource_uid

Уникальное имя ресурса

VARCHAR

256

isglobal

Является ли черновик глобальным или локальным

TINYINT

1

path

Путь в файловой системе до файла черновика

TEXT


data_type

Тип ресурса

VARCHAR

10

project_id

Идентификатор проекта, в котором находится ресурс

INT

10


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

Поле

Содержание

Тип данных

Размер

id

Уникальный числовой идентификатор записи

INT

10

resource_id

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

INT

10

usedin_id

INT

10

usedin_type

Тип содержимого в котором используется ресурс (страница или шаблон)

CHAR

1


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

o   coordinator                   Папка координатора

·        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 и выставлять права доступа к ним.

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


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

1    The CMS Matrix [Электронный ресурс] / Обзор и сравнение современных CMS. - Режим доступа: http://www.cmsmatrix.org/. - Загл. с экрана. - яз. англ.

2       GOOGLE [Электронный ресурс] / Мультиязыковой Интернет-поисковик. - Режим доступа: http://google.ru/. - Загл. с экрана. - яз. рус., англ.

         Wikipedia, the free encyclopedia [Электронный ресурс]: Cвободная общедоступная многоязычная универсальная энциклопедия. - Режим доступа: http://en.wikipedia.org/wiki/Main_Page. - Загл. с экрана. - яз. англ.

4       HTMLBOOK.RU [Электронный ресурс] / Сайт посвященный языку HTML, CSS, веб-дизайну, графике и процессу создания сайтов. - Режим доступа: http://htmlbook.ru/. - Загл. с экрана. - яз. рус.

         PHP Manual [Электронный ресурс] / Официальная документация PHP. - Режим доступа: http://www.php.net/manual/en/. - Загл. с экрана. - яз. англ.

6       W3Schools [Электронный ресурс] / Портал для веб-разработчиков. - Режим доступа: http://www.w3schools.com/. - Загл. с экрана. - яз. англ.

         СанПиН 2.2.2/2.4.1340-03 [Электронный ресурс] / Санитарные правила и нормы. Режим доступа: http://www.niiot.ru/doc/doc055/doc_00.htm. - Загл. с экрана. - яз. рус.


Приложение

Исходный код координатора (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;

}

}

?>

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!