Сегодня я продолжаю рассказывать о разработке собственной системы отслеживания ошибок. В прошлой статье только вкратце была описана общая идея и возможности, а также показан предварительный эскиз приложения.
Но прежде чем переходить к основной теме, хочу поблагодарить всех комментаторов и особенно AmdY, Big_Shark и Алексея Качаева за советы!
Первоначально я планировал доделать приложение полностью, и только потом опубликовать этот цикл постов. Но так получается даже лучше. Всегда есть шанс, что читатели найдут недостатки, и мне не придется переделывать все приложение чтобы их исправить 😉
В прошлый раз с инструментами мы определились (используем PHP, фреймворк CodeIgniter, MySQL и jQuery).
Сейчас нам нужно их установить и настроить.
Я предполагаю, что web сервер, PHP и MySQL у вас уже настроены, поэтому нам нужно только скачать CodeIgniter и jQuery. После этого распаковываем архивы в какую-нибудь папку на сервере. В результате должна получиться примерно следующая структура папок.
index.php .htaccess system/ js/ jquery-1.3.2.min.js css/
Файл index.php
и папка system
– из дистрибутива CodeIgniter.
.htaccess
– самый обычный. Сразу приведу его содержимое.
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^system.* RewriteRule ^(.*)$ /index.php?/$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond $1 !^(index\.php|images|robots\.txt|css|js) RewriteRule ^(.*)$ index.php?/$1 [L] </IfModule> <IfModule !mod_rewrite.c> ErrorDocument 404 /index.php </IfModule>
Основное его назначение – автоматически подставлять index.php в ссылки. Т.е. ссылка вида
bugtracker.local/bugtracker/page/2
будет преобразована в
bugtracker.local/index.php/bugtracker/page/2
При этом преобразование происходит, только если указанного в URL файла на самом деле не существует. Т.е. если запрос будет к js
или css
файлу, то index.php
подставляться не будет.
Кстати, если вы хотите, чтобы приложение находилось в какой-нибудь папке (например, mysite.domen/bugtracker/
), то нужно будет изменить параметр RewriteBase
.
На настройке CodeIgniter подробно останавливаться не буду. Просто перечислю файлы, в которые нужно внести изменения.
Все конфигурационные файлы находятся в папке system/application/
.
autoload.php
– загружаем библиотеку для работы с базой данных и URL хелпер
$autoload['libraries'] = array('database'); $autoload['helper'] = array('url');
config.php
– здесь указываем адрес приложения, например,
$config['base_url'] = "http://bugtracker.local/";
и добавляем ещё один параметр
$config['bugs_per_page'] = 5;
Как несложно догадаться его значение определяет количество записей о багах на странице.
routes.php
– тут нужно указать только название контроллера, который будет использоваться по-умолчанию. Я решил его называть bugtracker
.
$route['default_controller'] = "bugtracker";
database.php
– здесь заполняем массив с параметрами подключения к базе данных.
Примечание. Подробнее о настройке фреймворка можно почитать в статье «PHP framework CodeIgniter. Установка и настройка.»
Теперь переходим к созданию базы данных.
Нам потребуются три таблицы:
1) bugs – используется для хранения информации о найденных багах и комментариях к ним.
Поля:
id
– первичный ключ;
title
– заголовок;
uname
– имя пользователя, который оставил сообщение;
categoryid
– id категрии к которой относится баг (должно совпадать с соответствующим полем в таблице categories
);
description
– описание бага;
status
– здесь будет храниться информация о состоянии бага (по-умолчанию, «не исправлено»);
replyto
– это поле устанавливает связь между багами и комментариями к ним (подробнее на этом мы остановимся чуть позже).
2) categories – список категорий.
Поля:
id
– первичный ключ;
link
– ссылка на категорию (латинскими буквами);
name
– названии категории.
3) users – информация о пользователях. В данном случае этими пользователями будут только администраторы баг трекера. Оставлять сообщения и комментарии сможет кто угодно без авторизации.
id
– первичный ключ;
name
– имя пользователя;
pass
– пароль.
Теперь посмотрите на запросы, которые создают эти таблицы.
CREATE TABLE `bugs` ( `id` int(11) NOT NULL auto_increment, `title` varchar(300) NOT NULL, `uname` varchar(100) NOT NULL, `categoryid` int(11) default NULL, `description` text NOT NULL, `status` varchar(100) NOT NULL default 'не исправлено', `replyto` int(11) default NULL, PRIMARY KEY (`id`), KEY `replyto` (`replyto`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; ALTER TABLE `bugs` ADD CONSTRAINT `bugs_ibfk_1` FOREIGN KEY (`replyto`) REFERENCES `bugs` (`id`) ON DELETE CASCADE; CREATE TABLE `categories` ( `id` int(11) NOT NULL auto_increment, `link` varchar(100) NOT NULL, `name` varchar(300) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `name` varchar(100) NOT NULL, `pass` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Самый интересный момент здесь касается таблицы bugs
, а точнее её поля replyto
. Оно даёт возможность отличить комментарий к багу от самого бага. Если значение в нём не равно NULL
, то это комментарий, если равно – баг. При этом число, записанное в поле replyto
, указывает, к какому багу относится данный комментарий.
Например, в таблице есть четыре следующий записи:
id | title | … | replyto |
1 | Bug 1 | … | NULL |
2 | Comment 1 | … | 1 |
3 | Comment 2 | … | 1 |
4 | Bug 2 | … | NULL |
Это означает, что мы имеем два бага (записи 1 и 4) и два комментария (записи 2 и 3), которые относятся к первому багу.
Кстати, значение поля categoryid
для всех комментариев равно NULL
.
Тут возникает проблема. Что будет с комментариями, если мы удалим баг к которому они относятся? Можно, конечно, решить эту проблему так:
1) найти все комментарии, которые относятся к данному багу;
2) удалить их;
3) удалить сам баг.
Но будет лучше, если движок MySQL автоматически удалит все связанные комментарии при удалении бага.
Для этого мы объявляем поле replyto
внешним ключом (т.е. связываем его с полем id
) и указываем опцию ON DELETE CASCADE
(каскадное удаление) (строки 13-15). Теперь при удалении записи у которой поле id = 3
движок БД будет искать в этой же таблице все записи у которых replyto = 3
и удалять их.
И, кроме того, это поле (replyto
) мы будем использовать при выводе сообщений о багах на страницах нашего баг трекера.
Но об этом в следующий раз.
До встречи!
Интересно почитать:
Слушать радио онлайн