Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4. Текст-2.doc
Скачиваний:
1
Добавлен:
05.09.2019
Размер:
3.03 Mб
Скачать

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|. Діаграма послідовностей. Робота з параграфами

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]