Сегодня я продолжу рассказ о разработке web приложения, выполняющего проверку URL.
Но, прежде всего, кратко напомню, что уже сделано на данный момент. Мы определились со структурой приложения и базы данных, установили и настроили фреймворк, а также написали модели для работы с БД.
Примечание. Ссылки на все предыдущие статьи находятся здесь.
Теперь самое время заняться контроллером.
Т.к. приложение довольно простое нам вполне хватит одного контроллера, назовем его main
. Кстати, при настройке CodeIgniter в файле routes.php мы указали, что этот контроллер должен загружаться по-умолчанию.
Со структурой приложения и его функциями мы уже определились, переходим к написанию методов контроллера.
class Main extends Controller { var $errorMes; function Main() { parent::Controller(); $this->errorMes = null; $this->output->enable_profiler(TRUE); } /** * Отображает главную страницу с таблицей результатов */ function index() { $this->load->model('resultmodel'); $this->load->helper('form'); $resData = $this->resultmodel->getGeneralData(); $pageData['results'] = $resData; $pageData['title'] = "Simple URL checker - Главная"; $pageData['error'] = $this->errorMes; $this->load->view('header', $pageData); $this->load->view('mainpage'); $this->load->view('footer'); } /** * Отображает страницу с таблицей результатов проверок заданного URL * * @param $urlId - значение поля urlId в базе данных (таблица results) */ function urldetails($urlId) { if (!isset($urlId) || !is_numeric($urlId) || $urlId <= 0) { redirect('main/index'); } $this->load->model('resultmodel'); $this->load->helper('form'); $urlInfo = $this->resultmodel->getUrlData($urlId); $pageData['title'] = "Simple URL checker - подробно"; $pageData['urlInfo'] = $urlInfo; $pageData['urlId'] = $urlId;$this->load->view('header', $pageData); $this->load->view('urldetails'); $this->load->view('footer'); } /** * Добавляет новый URL * * @param newurl (передается в массиве $_POST) */ function addurl() { $this->load->helper('form'); $this->load->model('urlmodel'); $url = $this->input->post('newurl'); if ($url !== FALSE && $this->_isValidURL($url)) { $id = $this->urlmodel->addURL($url); } else { $this->errorMes = "Некорректный URL"; } $this->index(); } /** * Отправляет запрос (и сохраняет его результаты) по указанным URL * * @param $urlId - значение поля urlId в базе данных (таблица results), * если не задан или равен 0 - нужно пропинговать все URL из базы */ function ping($urlId = 0) { //этот метод мы рассмотрим немного позже } /** * Проверяет формат URL * * @param строка, содержащая URL * @return TRUE - если URL имеет правильный формат, FALSE - если нет */ function _isValidURL($url) { $strRegex = "/^[a-zA-Z0-9]+:\/\/[^ ]+$/"; return preg_match($strRegex, $url); } /** * Удаляет результат проверки URL * * @param $urlId - значение поля urlId в базе данных (таблица results) * @param $id - значение поля id в базе данных (таблица results) */ function removeresult($urlId, $id) { $this->load->model('resultmodel'); $this->resultmodel->removeResult($id); $this->urldetails($urlId); } /** * Удаляет URL из базы данных * * @param $urlId - значение поля id в базе данных (таблица urls) */ function removeurl($urlId) { if (isset($urlId) && is_numeric($urlId) && $urlId > 0) { $this->load->model('urlmodel'); $this->urlmodel->deleteURL($urlId); } $this->index(); } }
Чтобы в контроллере было проще ориентироваться, приведу диаграмму, которую мы составили во второй части этого цикла.
Конструктор (строки 5-10). Тут сбрасываем сообщение об ошибке и включаем профайлер (в релизе его, естественно, нужно будет отключить).
Метод index
(строки 15-27). Формирует главную страницу сайта. На этой странице должны быть размещены таблица с усредненными результатами проверок, форма добавления нового URL и кнопка, запускающая проверку всех URL.
Поэтому в начале метода мы загрузили модель (resultmodel
) и хелпер form (содержит методы для создания форм). После этого с помощью модели получаем данные (строка 19), формируем массив с данными для представления ($pageData
) и загружаем представления.
Примечание. Сами представления мы рассмотрим немного позже, но думаю, уже по названию понятно, что header
формирует заголовок страницы, mainpage
– основное содержимое главной страницы, а footer
– хвостовик.
Метод urldetails
(строки 34-50). Формирует страницу с подробными данными о проверках выбранного URL. Работает аналогично методу index
, но, естественно, используются другой метод модели (getUrlData
) и представление (urldetails
).
В начале метода (строки 35-37) выполняется проверка параметра $urlId
и если он имеет недопустимое значение, посетитель перенаправляется на главную страницу.
Для добавления URL в базу данных служит метод addurl
(строки 57-68). Здесь мы читаем url из массива $_POST
и выполняем проверку.
Проверка простейшая, выполняется с помощью регулярного выражения в методе _isValidURL
(строки 86-89). URL считается правильным если содержит символы «://» и не содержит пробелов, кроме того в первой части URL могут быть только английские буквы и цифры.
Естественно, можно написать более сложное выражение для проверки, но я хотел оставить возможность добавлять локальные адреса (вроде http://localhost).
Если URL прошел проверку, то он добавляется в базу данных. В противном случае – формируем сообщение об ошибке. После этого вызываем метод index
, т.е. загружаем главную страницу.
Метод removeresult
(строки 97-101). Удаляет указанный результат проверки (используется метод removeResult
модели resultmodel
). После удаления загружаем страницу с подробными данными о выбранном URL.
removeurl
(строки 108-114) – удаляет URL из базы данных. Здесь тоже ничего особенного. Используем метод deleteURL
модели urlmodel
.
Вызовы методов removeresult
и removeurl
происходят при клике по ссылке «Удалить», которая находится напротив соответствующего URL или результата проверки.
Осталось рассмотреть метод ping
. Но он получился довольно объемный, поэтому о нем я напишу отдельный пост.
До встречи!
P.S. Ссылки на все статьи и примеры цикла я публикую здесь.