2 Структура системи управління сайтом (cms|)
CMS| структурно розділяється на декілька блоків:
- база даних—| набір таблиць, в яких зберігається вся конструктивна інформація сайту;
- система адміністрування — блок, що дозволяє здійснювати редагування бази даних;
- система уявлення — набір програмних блоків, з якими має справу відвідувач: інформація витягується і поміщається в базу даних;
- конфігураційні (настроювальні) файли — директорія config|, в якій розташовуватимуться конфігураційні файли: config|.php для установки з'єднання з СУБД MYSQL| class.config.php для зберігання шляхів до класів блоку уявлення і class|.config.dmn.php – шляхів для блоку адміністрування;
- FrameWork| – набір загальних класів, які використовуються при побудові системи адміністрування і уявлення.
Рисунок 2.1 – Схема відношення блоків CMS|
Кожен з блоків CMS| розташовуються в окремій директорії, при цьому файли блоку уявлення знаходяться в корені сайту, а решта всіх блоків – в піддиректоріях:
/ - блок уявлення
/class| – загальні класи FrameWork|
/config| – конфігураційні файли
/dmn| – система адміністрування
Таблиці бази даних починатимуться з префікса system_|, при цьому в коді, вони позначаються змінною з префіксом $tbl_. Список всіх таблиць розміщений у файлі config/config.php, який відповідатиме за з'єднання з СУБД MYSQL|.
Якщо необхідно ввести нову таблицю, то у файл config/config.php додається нова змінна, наприклад $tbl_files з назвою нової таблиці «system_files|». Така система іменувань дозволяє уникнути конфліктів, що викликаються зберіганням в одній базі даних таблиць з однаковими іменами. Якщо в базу даних потрібно буде додати таблицю з ім'ям, співпадаючим з ім'ям вже існуючої таблиці, допускається перейменування таблиці з конфліктним ім'ям. Зміни, вироблені у файлі config/config.php, відіб'ються на всій системі.
Система адміністрування є найбільш розвиненим блоком даної CMS| і має власну структуру. Для кожного блоку виділяється окремий каталог:
/
/dmn| – система адміністрування
/system_accounts| – управління акаунтами|
/article| – управління статтями
/news| – управління новинами
/utils| – загальні файли і авторизація
/index|.php – індексний файл
Індексний файл здійснює переадресацію на один з блоків системи адміністрування.
У даній CMS| реалізований метод автоматичного підключення блоків. Створення або видалення піддиректорії в директорії /dmn приводить до автоматичної інтеграції або виключення блоку з системи адміністрування.
Для реалізації цього підходу, кожен блок, поміщений в окремий каталог, сам себе описує за допомогою файлу .htdir. Даний контейнер призначений для захисту вмісту конфігураційних файлів .htaccess і .htpasswd. Файл .htdir містить два рядки: перша з назвою блоку, друга з його коротким описом. Дана інформація використовується в меню системи адміністрування.
Таким чином, кожен блок уявляє інформацію про себе; якщо така інформація відсутня, система намагається назвати його самостійно. Видалення піддиректорії приводить приводить до його автоматичного виключення з системи адміністрування.
2.1 Загальні файли системи адміністрування
Розглянемо систему адміністрування CMS|, вірніше, на директорії загальних файлів /dmn/utils. У даній директорії зосереджені службові файли, такі як шапка і завершення сторінки, стильові таблиці, системи авторизації, пошуку модулів, формування меню і інші допоміжні файли. Список основних файлів:
- bottom|.php – завершення сторінки
- cms|.css – каскадні таблиці стилів
- menu|.php – блок формування меню (пошук блоків, читання їх .htdir файлів);
- security_mod|.php – блок безпеки, що здійснює авторизацію адміністраторів
- top|.php – шапка сторінки
2.2 Обмеження доступу до системи адміністрування
Система адміністрування є центральним пультом управління сайтом, де можна додавати, редагувати і видаляти інформацію. Зрозуміло, доступ до неї повинен бути обмежений і захищений паролем. Для захисту застосування, кожен його файл включає скрипт security_mod|.php, який здійснює аутентифікацію і авторизацію адміністратора. Реалізувати авторизацію зручно за допомогою базової HTTP-аутентифікації|.
Для реалізації даного виду авторизації необхідно послати браузеру| клієнта HTTP-заголовки|
WWW-Authenticate|: Basic| realm=”Admin| Page|”
HTTP/1.0 401 Unauthorized|
Які відобразять форму для введення імені користувача і пароля (Мал. 2.2). Ім'я користувача буде поміщено браузером| в змінну суперглобального масиву $_SERVER[‘PHP_AUTH_USER|’], а пароль – в $_SERVER[‘PHP_AUTH_PW|’].
Рисунок 2.2 – Базова HTTP-аутентифікація|
Імена користувачів і їх паролі зберігаються в таблиці system_accounts|, яка в скриптах носить ім'я $tbl_accounts.
Модуль захисту security_mod|.php включається на початку сторінок, що захищаються, за допомогою директиви require_once|()
Для додавання, редагування і видалення нових користувачів системи адміністрування був розроблений блок управління користувачами, який розташований в піддиректорії system_accounts|.
Система управління є таблицею з іменами зареєстрованих користувачів, напроти кожного з яких є посилання для його видалення. Останнього користувача видалити не можна (інакше, не можна буде увійти до системи). За допомогою посилання, що управляє, «Додати акаунт|» можна створити нового користувача.
Блок «управління акаунтами|», крім файлу з описом, містить три наступні файли:
- index|.php – головна сторінка блоку управління акаунтами|
- addaccount|.php – HTML-форма| для додавання нового користувача
- delaccount|.php – видалення користувача.
Якщо при введенні даних не виникає ніяких помилок (введено незареєстроване раніше ім'я користувача, паролі, причому паролі не співпадають один з одним), користувач додається в СУБД MySQL| за допомогою INSERT-запиту|. При цьому пароль необоротно шифрується по аглоритму| MD5|, що дозволяє значно понизити ризик підбору пароля, навіть у разі крадіжки зловмисником бази даних.
Крім елементів управління, під паролем і його повтором виводиться параграф з прикладом пароля, який важко підібрати. Пароль генерується за допомогою спеціальної функції generate_password|() з файлу utils/utils.password.php. Функція приймає як параметр кількість символів, яку повинен містити пароль.
<?php
error_reporting|(E_ALL| & ~E_NOTICE);
function| generate_password|($number)
{
$arr = array|('a','b','c','d','e','f|'
'g','h','i','j','k','l|'
'm','n','o','q','p','r','s|'
't','u','v','w','x','y','z|'
'A','B','C','D','E','F|'
'G','H','I','J','K','L|'
'M','N','O','Q','P','R','S|'
'T','U','V','W','X','Y','Z|'
'1','2','3','4','5','6',
'7','8','9','0','_');
// Генеруємо пароль
$pass = "";
for|($i = 0; $i < $number; $i++)
{
// Обчислюємо випадковий індекс масиву
$index = rand|(0, count|($arr) - 1);
$pass .= $arr[$index];
}
return| $pass;
}
?>
Видалення користувачів з бази даних здійснюється за допомогою файлу delaccount|.php.
<?php
error_reporting|(E_ALL| & ~E_NOTICE);
// Встановлюємо з'єднання з базою даних
require_once|("../../config/config.php");
// Подлкючаєм блок авторизації
require_once|("../utils/security_mod.php");
// Підключаємо SoftTime| FrameWork|
require_once|("../../config/class.config.dmn.php");
// Перевіряємо GET-параметр|, запобігаючи SQL-инъекцию|
$_GET['id_account|'] = intval|($_GET['id_account|']);
try|
{
// Перевіряємо чи не віддаляється останній аккаунт| -
// якщо він буде видалений в систему не можна буде увійти
$query = "SELECT| COUNT|(*) FROM| $tbl_accounts";
$acc = mysql_query|($query);
if|(!$acc)
{
throw| new| ExceptionMySQL|(mysql_error|(),
$query,
"Помилка видалення
користувача");
}
if|(mysql_result|($acc, 0)> 1)
{
$query = "DELETE| FROM| $tbl_accounts
WHERE| id_account=|".$_GET['id_account|'];
if|(mysql_query|($query))
{
header|("Location|: index|.php?page=".$_GET['page|']);
}
else|
{
throw| new| ExceptionMySQL|(mysql_error|(),
$query,
"Помилка видалення
користувача");
}
}
else|
{
throw| new| Exception|("Не можна видалити
єдиний аккаунт|");
}
}
catch|(ExceptionMySQL| $exc)
{
require|("../utils/exception_mysql.php");
}
catch|(Exception| $exc)
{
require|("../utils/exception.php");
}
?>
При виникненні помилки користувача генерується виключення класу Exception| з єдиним параметром – текстовим повідомленням. Для обробки таких виключень вводиться спеціальний скрипт utils/exception.php.
2.3 Блок новин
Блок новин є першим блоком даної системи управління вмістом сайту (CMS|), що включає як систему адміністрування, так і блок уявлення.
2.3.1 База даних
Таблиця system_news| складається з восьми стовпців:
- id_news| – первинний ключ таблиці, забезпечений атрибутом AUTO_INCREMENT|, який забезпечує автоматичне формування унікального номера запису
- name| – назва новинного повідомлення
- body| – текст новини
- putdate| – дата розміщення новини у форматі «YYYY-MM-DD| hh:mm:ss|»;
- url| – посилання
- urltext| – текст посилання
- urlpict| – шлях до зображення, супроводжуючого новину
- hide| – службове поле типу ENUM|, що приймає тільки два значення: hide|, якщо новина прихована і недоступна для перегляду із сторінок сайту, і show|, якщо новину слід відображати на сторінках сайту.
2.3.2 Система адміністрування
Система адміністрування блоку новин, що дозволяє додавати, редагувати і видаляти новинні повідомлення, складається з шести файлів:
- index|.php – головна сторінка, що відображає список новинних повідомлень і посилання, що управляють
- addnews|.php – HTML-форма|, що дозволяє додавати новинні повідомлення
- editnews|.php – HTML-форма|, що дозволяє редагувати новинні повідомлення
- delnews|.php – скрипт для видалення новинного повідомлення
- hide|.php – скрипт, що приховує новинне повідомлення
- show|.php – скрипт, що відображає новинне повідомлення
Головний файл index|.php відображає список доступних новинних повідомлень, а також посилання, що управляють, дозволяють додавати новинні блоки і піддавати їх редагуванню і видаленню.
На головній сторінці блоку новин (Рис. 2.3) розташовується посилання, що управляє, Додати новинний блок, а також таблиця, кожен рядок якої відповідає одному новинному повідомленню. Таблиця містить чотири стовпці:
- дату розміщення новини
- вміст новини (включаючи назву, текст і посилання)
- зображення (якщо воно присутнє)
- стовпець з посиланнями, що управляють, що дозволяє редагувати, видаляти, скрывать/отображать новинне повідомлення.
Рисунок 2.3 – Головна сторінка блоку новин
Виведення новинних блоків з таблиці system_news|($tbl_news) здійснюється за допомогою об'єкту класу pager_mysql|, який забезпечує посторінкове представлення результату SELECT-запиту|. Можливі помилки MySQL-сервера| обробляються за допомогою виключення типу ExceptionMySQL|.
Текст новини може містити теги| bbCode|, що представляють користувачеві можливість форматування тексту без використання потенційно небезпечного HTML-коду|:
- [b].[/b] – текст, ув'язнений, в ці теги| виділяється жирним шрифтом; їх використання еквівалентне <b>|.</b>;
- [i].[/i] – текст, ув'язнений, в ці теги| виділяється курсивом (похилим шрифтом); їх використання еквівалентне <i>|.</i>;
-[url|]http://www.site.ru[/url] – посилання, що перетворюється до вигляду <а href=http://www.site.ru>
- http://www.site.ru]текст[/url] – посилання, що перетворюється до вигляду <а href=http://www.site.ru>текст</a>
Для їх автоматичної обробки перед виводом у вікно браузера| використовується функція print_page|() з файлу utils/utils.print_page.php.
<?php
error_reporting|(E_ALL| & ~E_NOTICE);
function| print_page|($postbody)
{
// Розрізаємо дуже довгі слова
$postbody = preg_replace_callback|(
"|([a-zа-я\d|!]{35})|i",
"split_text",$postbody|);
// Запобігаємо XSS-инъекции|
$postbody = htmlspecialchars|($postbody, ENT_QUOTES|);
// Теги
$pattern = "#\|[b\|](.+)\[\/b\|]#isU|";
$postbody = preg_replace|($pattern, '<b>\1</b>' $postbody);
$pattern = "#\|[i\|](.+)\[\/i\|]#isU|";
$postbody = preg_replace|($pattern,
'<i>\1</i>',$postbody);
$pattern="#\[url\|][\s]*((?=(http:|mailto|:))[\S]*)[\s]*\[\/url\|]#si|";
$postbody = preg_replace|($pattern,'<a href="\1|" target=_blank>\1</a>',$postbody);
$pattern = "#\|[url|[\s]*=[\s]*((?=(http:|mailto|:))[\S]+)[\s]*\][\s]*([^\[]*)\[/url\|]#isU|";
$postbody = preg_replace|($pattern,'<a href="\1|" target=_blank>\3</a>'
$postbody);
return| $postbody;
}
function| split_text|($matches)
{
return| wordwrap|($matches[1], 35 ' ',1|);
}
?>
Дана функція print_page|() приймає текст і перетворить все bbCode| в їх HTML-евківаленти|, заздалегідь перетворивши текст за допомогою функції htmlspecialchars|() і розбивши дуже довгі слова за допомогою функції preg_replace_callback|() і функції зворотного виклику split_text|().
Додавання новинного блоку (Рис. 2.4) здійснюється за допомогою скрипта addnews|.php
Рисунок 2.4 – Додавання новинного блоку
HTML-форма| для додавання новинного повідомлення містить три текстові поля для назви name,лінку| url| і тексту посилання urltext|. Крім цього, текстова область body| для тексту новини, блок дати і часу для вибору часу розміщення новини (| підставляється поточний час), прапорець hide| для вибору статусу новинного повідомлення (приховане або доступне для перегляду) і поле для завантаження зображення на сервер urlpict|. Крім цього, через приховане поле page| передається номер сторінки в системі посторінкової навігації для коректного повернення на сторінку, з якою відвідувач здійснює додавання новинного повідомлення.
Загальний механізм додавання новому запису в базу даних співпадає з раніше розглянутими HTML-формами|. Для зберігання файлів в корені сайті виділяється окрема директорія /files, при цьому для кожного блоку в директорії виділяється окрема піддиректорія:
/files|
/news|
/article|
/catalog|
Кожен з блоків зберігає свої файли в окремій піддиректорії, проте рівень вкладення блоку уявлення і системи адміністрування не співпадають, і при операції в системі адміністрування шлях до файлу передує префіксом «../../». У базу даних при цьому шлях поміщається без префікса – це дозволяє оперувати шляхами до файлів з системи уявлення, не додаючи ніяких префіксів.
Редагування новинного блоку здійснюється за допомогою скрипту| editnews|.php. Скрипту передається як GET-параметра| id_news| первинний ключ редагованого повідомлення. Крім цього, скрипт може приймати необов'язковий GET-параметр| page|, що забезпечує повернення на поточну сторінку в рамках посторінкової навігації.
Скрипт редагування новинного блоку крім елементів, розглянутих при описі HTML-форми| додавання новині, містить прихований елемент управління id_news|. Крім того, якщо новинний блок містить зображення, то в HTML-форму| вбудовується прапорець delimg|, що дозволяє видалити і його. Крім того, старе зображення віддаляється і у тому випадку, коли проводиться завантаження нового зображення. Зрештою, формується UPDATE-запит|, який дозволяє відновити дані в таблиці system_news| ($tbl_news). За видалення новинного повідомлення несе відповідальність скрипт delnews|.php, який точно так, як і скрипт editnews|.php, може приймати два GET-параметра|: id_news| – первинний ключ запису, що видаляється, і page| – номер сторінки в посторінковій навігації.
Перш ніж видаляти запис, відповідний первинному ключу $_GET[‘id_news|’] з таблиці system_news| ($tbl_news), скрипт delnews|.php перевіряє, чи не містить новинний блок зображення. Якщо зображення є, воно віддаляється за допомогою функції unlink|(). Лише після цього новинний блок віддаляється з бази даних за допомогою DELETE-запиту|.
Якщо новинний блок є прихованим| від перегляду відвідувачами (поле hide| приймає значення hide|), напроти нього виводиться посилання, що управляє, Відобразити, яка указує на файл show|.php. Якщо новинний блок доступний для перегляду (поле hide| приймає значення show|), напроти нього виводиться посилання, що управляє, Приховати, яка указує на файл hide|.php. Обидва файли приймають як GET-параметрів| первинний ключ новинного повідомлення id_news| і номер сторінки в посторінковій навігації page| для коректного повернення.
2.3.3 Система уявлення
Для новинного блоку готують два скрипти: перший виводить вказану кількість останніх новин в короткому вигляді (Рис. 2.6), другий скрипт здійснює виведення списку новин (Рис. 2.5).
Для того, щоб вибрати n останніх новинних блоку, в SQL-запиту| здійснюється зворотне сортування (ORDER| BY| . DESC|) по календарному полю putdate| при одночасному обмеженні кількості вибираних записів за допомогою конструкції LIMIT|.
Текст новини може бути достатнє об'ємним, тому має сенс в скороченому варіанті обмежити його сотнею символів за допомогою функції substr|(). Оскільки функція може розрізати текст на частини таким чином, що для того, що відкриває тега| bbCode| не опиниться парного закриваючого тега|, з короткого варіанту новинної позиції віддаляються всі bbCode-теги|. Прості теги|,[i], [/i], [b], [/b], віддаляються за допомогою функції str_replace|(), тоді як для складних тегів| [url=|] і [/url|] створюється регулярний вираз і використовується функція preg_replace|(). Перед виводом у вікно браузера| текст новинної позиції обробляється функцією print_page|() з файлу dmn/utils/utils.print_page.php.
Рисунок 2.5 – Виведення списку новин
Рисунок 2.6 – Новини в короткому вигляді
UML|. Діаграма послідовностей. Робота з новинами
2.4 Управління статтями і меню
Серцем будь-якою інформаційно-новинний CMS| є система розділів і статей, що дозволяють створювати нескінченно-вкладену структуру сайту, забезпечуючи кожен з рівнів статтями. Самі статті складаються з параграфів, кожен з яких може бути проілюстрований одним або кількома| зображеннями. Структура блоку традиційно ділиться на систему адміністрування і систему управління.
2.4.1 База даних
Для повноцінного представлення результатів буде потрібно як мінімум чотири таблиці:
- system_menu_catalog| – таблиця для зберігання розділів, які можуть містити в своєму складі як підрозділи, так і статті ($tbl_catalog);
- system_menu_position| – таблиця для зберігання статей, які складаються з параграфів ($tbl_position);
- system_menu_paragraph| – таблиця для зберігання параграфів, кожен з яких може бути проілюстрований декількома зображеннями ($tbl_paragraph);
- system_menu_paragraph_image| – таблиця для зберігання зображень ($tbl_paragraph_image);
Таблиця system_menu_catalog|, призначена для зберігання розділів сайту, складається з наступних восьми полів:
- id_catalog| – первинний ключ таблиці, призначений для ідентифікації розділу і забезпечений атрибутом AUTO_INCREMENT|, що дозволяє автоматично генерувати для нових записів унікальний ідентифікатор;
- name| – назва розділу
- description| – опис розділу
- keywords| – ключові слова, що поміщаються в META-тег| keywords| і що повідомляють пошуковим роботам основний зміст сторінки;
- modrewrite| – текстове поле, призначене для формування URL| за допомогою модуля Web-сервера| Apache| mod_rewrite|, який дозволяє перетворити GET-параметри| виду index|.php?year=2006&month=10&day=26 у компактніший і читаний URL| виду /2006/10/26. На жаль, такий підхід вимагає прив'язки додатку до Корню сайту (що не завжди зручно) і декілька збільшує навантаження на Web-сервер| Apache|;
- pos| – позиція розділу щодо інших розділів: дане поле призначене для сортування розділів; розділи можна сортувати по назві, але це не завжди зручно, оскільки часто вони повинні бути розташовані в логічному, а не в алфавітному порядку;
- hide| – службове поле типу ENUM|, що приймає тільки два значення: hide|, якщо розділ прихований і недоступний для перегляду із сторінок сайту, і show|, якщо розділ відображається на сторінках сайту;
- id_parent| – зовнішній ключ таблиці, що містить значення id_catalog| батьківського розділу; для кореневого розділу приймає значення 0. Дане поле забезпечує можливість створення нескінченно вкладеної структури сайту.
Кожен з розділів, за винятком кореневого, може містити статті і посилання на сторінки (можливо, навіть іншого сайту). Для зберігання службової інформації про ці елементи призначена таблиця system_menu_position|, яка містить вісім полів:
- id_position| – первинний ключ таблиці, призначений для ідентифікації позиції і забезпечений атрибутом AUTO_INCREMENT|, що дозволяє автоматично генерувати для нових записів унікальний ідентифікатор;
- name| – назва статті або посилання;
- url| – поле призначене для зберігання URL|, якщо поточний елемент є посиланням; якщо ж він є статтею, дане поле приймає значення article|;
- keywords| – ключові слова, що поміщаються в META-тег| keywords| і що повідомляють пошуковим роботам основний зміст сторінки;
- modrewrite| – текстове поле, призначене для формування URL| за допомогою модуля Web-сервера| Apache| mod_rewrite|, який дозволяє перетворити GET-параметри| виду index|.php?year=2006&month=10&day=26 у компактніший і читаний URL| виду /2006/10/26. На жаль, такий підхід вимагає прив'язки додатку до Корню сайту (що не завжди зручно) і декілька збільшує навантаження на Web-сервер| Apache|;
- pos| – позиція розділу щодо інших розділів: дане поле призначене для сортування розділів; розділи можна сортувати по назві, але це не завжди зручно, оскільки часто вони повинні бути розташовані в логічному, а не в алфавітному порядку;
- hide| – службове поле типу ENUM|, що приймає тільки два значення: hide|, якщо розділ прихований і недоступний для перегляду із сторінок сайту, і show|, якщо розділ відображається на сторінках сайту;
- id_catalog| – зовнішній ключ для таблиці system_menu_catalog|, що дозволяє прив'язати статтю до конкретного розділу. Поле id_catalog| дозволяє зв'язати таблиці system_menu_catalog| і system_menu_position| зв'язком «один-до-многих|».
Якщо позиція є посиланням, то розглянуті вище таблиць system_menu_catalog| і system_menu_position| достатньо для зберігання даних. Проте якщо таблиця є статтею, необхідно передбачити ще одну таблицю system_menu_paragraph|, яка б зберігала параграфи, що належать поточній статті. Таблиця system_menu_paragraph| містить вісім полів:
- id_paragraph| – первинний ключ таблиці, призначений для ідентифікації параграфа і забезпечений атрибутом AUTO_INCREMENT|, що дозволяє автоматично генерувати унікальний ідентифікатор для нових записів;
- name| – вміст параграфа;
- type| – поле типу ENUM|, яке може приймати одне з семи значень: text| – для звичайного текстового параграфа і шість (від title_h1| до title_h6|) – для HTML-заголовков| від <H1|> до <H6|>;
- align| – поле типу ENUM|, що визначає вирівнювання параграфа; може приймати одне з трьох значень: left| – вирівнювання по лівому краю, center| – вырівнювання| по центру і right| – вирівнювання по правому краю;
- hide| – службове поле типу ENUM|, що приймає тільки одне з двох значень: hide|, якщо параграф прихований і недоступний для перегляду із сторінок сайту, і show|, якщо параграф відображається на сторінках сайту;
- pos| – позиція параграфа щодо інших параграфів; дане поле призначене для їх сортування;
- id_position| – зовнішній ключ для таблиці system_menu_position|, що дозволяє прив'язати параграф до конкретної статті;
- id_catalog| – зовнішній ключ для таблиці system_menu_catalog|, вказуючий, до якого розділу належить стаття і поточний параграф.
Для додавання повноцінних статей необхідно передбачити додавання зображень, причому кожен з параграфів може містити довільну кількість зображень (формуючи своєрідну фотогалерею). Зберігати фотографії в базі даних MYSQL| не раціонально, оскільки швидкість доступу до них виявиться набагато нижчою, ніж якби вони зберігалися на жорсткому диску. MYSQL|, як і будь-яка інша СУБД, з великою швидкістю оперує короткими текстовими рядками, проте, при зростанні об'єму даних і таблиць швидкість звернення різко падає. Приймаючи це до уваги, зображення зберігатимуться в спеціальній директорії, а в таблицю бази даних поміщатиметься лише шлях до них. Для зберігання шляхів до зображень розроблена таблиця system_menu_paragraph_image|, яка містить десять полів:
- id_image| – первинний ключ таблиці, призначений для ідентифікації зображення і забезпечений атрибутом AUTO_INCREMENT|, що дозволяє автоматично генерувати унікальний ідентифікатор для нових записів;
- name| – назва зображення, що виводиться як підпис під зображенням;
- alt| – вміст ALT-тега|, який виводиться у відвідувача, якщо в його браузере| відключено відображення зображень;
- small| – шлях до зменшеного варіанту зображення;
- big| – шлях до великого зображення, яке виводиться при клацанні мишею по його зменшеному варіанту;
- hide| – службове поле типу ENUM|, що приймає тільки два значення: hide|, якщо зображення приховане і недоступно для перегляду із сторінок сайту, і show|, якщо зображення відображається на сторінках сайту;
- pos| – позиція| зображення щодо інших зображень; дане поле призначене для їх сортування;
-id_position – зовнішній ключ для таблиці system_menu_position|, вказуючий, до якої статті належить параграф, а отже, і зображення;
-id_catalog – зовнішній ключ для таблиці system_menu_catalog|, вказуючий, до якого розділу належить стаття, параграф, а отже, і зображення;
- id_paragraph| – зовнішній ключ для таблиці system_menu_paragraph|, що дозволяє прив'язати зображення до конкретного параграфа.
2.4.2 Система адміністрування
Структура системи адміністрування нагадує структуру системи адміністрування блоку новин. Для кожного з об'єктів, що фігурують в базі даних (розділ, позиція, параграф і зображення) передбачається сторінка із списком об'єктів одного з типів. На даній сторінці розташовуються посилання, що управляють. Що дозволяють додавати, видаляти, редагувати і міняти порядок проходження об'єктів.
Повний список файлів:
- artadd|.php – HTML-форма|, що дозволяє додавати статті;
- artedit|.php – HTML-форма|, що дозволяє редагувати статті;
- catadd|.php – HTML-форма|, що дозволяє додавати розділи;
- catdel|.php – скрипт, що дозволяє видаляти розділи;
- catdown|.php – скрипт, що дозволяє опускати розділ на одну позицію вниз щодо останніх розділів;
- catedit|.php – HTML-форма|, що дозволяє редагувати розділи;
- cathide|.php – скрипт, що дозволяє приховувати розділи;
- catshow|.php – скрипт, що дозволяє відображати розділи;
- catup|.php – скрипт, що дозволяє піднімати розділ на одну позицію вгору щодо останніх розділів;
- image|.php – сторінка, що виводить список зображень поточного параграфа;
- imgadd|.php – HTML-форма|, що дозволяє додавати зображення;
- imgdel|.php – скрипт, що дозволяє видаляти зображення;
- imgdown|.php – скрипт, що дозволяє опускати зображення на одну позицію вниз щодо останніх зображень;
- imghide|.php – скрипт, що дозволяє приховувати зображення;
- imgshow|.php – скрипт, що дозволяє відображати зображення;
- imgup|.php – скрипт, що дозволяє піднімати зображення на одну позицію вгору щодо останніх зображень;
- index|.php – сторінка, що виводить список підрозділів поточного каталога;
- paradd|.php – HTML-форма|, що дозволяє додавати параграфи;
- paragraph|.php – сторінка, що виводить список параграфів поточної статті;
- pardel|.php – скрипт, що дозволяє видаляти параграфи;
- pardown|.php – скрипт, що дозволяє опускати параграф на одну позицію вниз щодо останніх параграфів;
- paredit|.php – HTML-форма|, що дозволяє редагувати параграфи;
- parhide|.php – скрипт, що дозволяє приховувати параграфи;
- parshow|.php – скрипт, що дозволяє відображати параграфи;
- parup|.php – скрипт, що дозволяє піднімати параграф на одну позицію вгору щодо останніх параграфів;
- position|.php – сторінка, що виводить список позицій поточного каталога;
- show|.php – сторінка проглядання збільшеного зображення;
- urladd|.php – HTML-форма|, що дозволяє додавати посилання;
- urldel|.php – скрипт, що дозволяє видаляти елементи (посилання і статті);
- urldown|.php – скрипт, що дозволяє опустити елемент (посилання або статтю) на одну позицію вниз щодо останніх елементів;
- urledit|.php – HTML-форма|, що дозволяє редагувати посилання;
- urlhide|.php – скрипт, що дозволяє приховувати елемент
- urlshow|.php – скрипт, що дозволяє відображати елемент
- urlup|.php – скрипт, що дозволяє піднімати елемент (посилання або статтю) на одну позицію вгору щодо останніх елементів.
При зверненні користувача до блоку управління вмістом сайту першою сторінкою, куди він потрапляє, є сторінка index|.php, що відображає список розділів (Рис. 2.7).
Рисунок 2.7 – Список розділів
Назва розділу є посиланням, перехід по якій приводить до відображення підрозділів і елементів поточного розділу. У міру переходу на нижчі підрозділи навігаційний рядок подовжується, указуючи користувачеві, в якій частині ієрархії він знаходиться зараз.
Для формування навігаційного рядка застосовується рекурсивна функція menu_navigation|() з файлу utils/utils.navigation.php. Функція menu_navigation|() приймає три аргументи: $id_catalog – первинний ключ найглибшого каталога $link – початковий рядок навігаційного рядка і $catalog – назва таблиці. Функція викликає сама себе до тих пір, поки не буде досягнутий кореневий каталог ($id_catalog = 0), а змінна $link не отримає навігаційний рядок.
HTML-форма| для створення нового підрозділу складається з трьох текстових полів для назви каталога name|, ключових слів keywords|, для URL| modrewrite|, текстовій області для опису каталога description|, прапорця hide|, що дозволяє призначити каталогу статус (що відображається або прихований), і двох прихованих полів; id_parent| і page|, призначених для однойменних GET-параметрів|.
Перед додаванням новому запису в таблицю system_menu_catalog| обчислюється позиція нового розділу.
Редагування розділу catedit|.php зовні повторює HTML-форму| для додавання розділу catadd|.php, відмінність полягає в тому, що в поля HTML-форми| вставляються значення редагованого запису.
Для видалення підрозділу використовується скрипт catdel|.php, який приймає два GET-параметра|: id_catalog| – первинний ключ розділу, що видаляється, і page| – номер сторінки в системі посторінкової навігації.
За відображення списку позицій (статей і посилань) несе відповідальність файл position|.php, який використовує в своїй роботі клас посторінкової навігації pager_mysql|.
Для додавання статей використовується HTML-форма| artadd|.php (Рис. 2.8). Головна особливість скрипта – вміст текстової області description| розбивається на параграфи за допомогою функції preg_split|() і регулярного виразу, відповідного перекладу рядка.
Рисунок 2.8 – Додавання позиції
Сторінка управління параграфами є таблицею, кожен рядок в якій відповідає одному параграфу. При цьому кожен параграф і шапка забезпечуються перемикачами, що дозволяють вказати місце вставки нового параграфа. У розділі «Вміст» приводиться текст параграфа. Наступний розділ «Зображення і файли» надає посилання для управління зображеннями, причому якщо параграф має хоч би одне зображення, то поряд з посиланням приводиться кількість зображень. Перехід по посиланню «Зображення» приводить до сторінки управління зображеннями параграфа image|.php (Рис. 2.9).
Рисунок 2.9 – Управління зображеннями
2.4.3 Система уявлення
Кожен з розділів веде на файл articles|.php, який, залежно від значення передаваного йому GET-параметра| id_catalog|, виводить значення того або іншого розділу (Рис. 2.10). Розділ може містити як інші підрозділи, так і статті. Кожен розділ може містити статті, які виводяться у вигляді списку. Причому, якщо розділ містить тільки одну статтю, вона виводиться без списку підрозділів і статей. Файл articles|.php формує тільки списки підрозділів і статей; передача файлу articles|.php GET-параметра| id_position| приводить до підключення файлу article_print|.php, який формує статтю (Рис. 2.11).
Рисунок 2.10 – Список розділів на сайті
Рисунок 2.11 – Стаття
UML|. Діаграма послідовностей. Робота з параграфами