Разработка CRUD-приложения, часть 2 - модель, контроллер, представление, вывод списка сайтов
- Автор mityok on марта 7th, 2008
Во второй части статьи я рассмотрю такие вопросы как создание модели, контроллера и представлений для решения задачи вывода списка сайтов каталога.
CodeIgniter является MVC-фреймворком, это означает что код приложения может быть разбит на три основные составляющие - модель (Model), представление (View) и контроллер (Controller).
Модель (Model) отвечает за реализацию бизнес-логики приложения, работу с базой данных и другими внешними источниками информации.
Представление (View) отвечает за представление информации пользователю, т.е. содержит код вывода и оформления информации.
Контроллер (Controller) отвечает за логику определения нужной модели и представления и содержит код вызова нужной модели и представления.
Разработка кода моделей
Для решения задачи добавления сайтов в каталог нам понадобиться код для добавления информации о сайте в БД, получения списка сайтов (для просмотра и категорий, удаления и редактирования сайтов в каталоге.
Модель для объектов типа "Сайт"
Создаем в каталоге application/models файл site_model.php. В нем нужно объявить класс Site_model (обратите внимание на регистр символов в названии, то же касается и имени файла), потомок класса Model.
class Site_model extends Model { var $id; var $name; var $description; var $url; var $_loaded; function Site_model() { parent::Model(); } }
Метод Site_model() является конструктором класса модели и содержит код вызова конструктора предка - parent::Model(). Эта строка должна идти перед любым обращением к средствам CodeIgniter через конструкцию $this->load... , $this->classname... и т.п.
Свойства id,name,description,url служат для хранения полей информации о сайте, поле _is_loaded является служебным и понадобится нам в дальнейшем.
Теперь добавим метод для получения списка сайтов:
function get_list($where=false,$limit_from=false,$limit_count=false) { if($limit_from) else $limit_from = null; if($limit_count) else $limit_count = null; $res = $this->db->get('sites',$where,$limit_from,$limit_count); if(0 < $res->num_rows) { foreach( $res->result() as $row) { $tmp = new Site_model(); $tmp->id = $row->id; $tmp->name = $row->name; $tmp->description = $row->description; $tmp->url = $row->url; $results[$tmp->id] = $tmp; } } return $results; }
Рассмотрим его детально. Параметр $where служит для указания фильтра при выборке списка объектов, параметры $limit_from и $limit_count служат для задания смещения и органичения количества выбранных элементов в результате запроса (SQL-конструкция LIMIT OFFSET,COUNT).
Строка $results = array(); содержит объявление массива, который будет содержать результат работы функции.
Код
if($limit_from) else $limit_from = null; if($limit_count) else $limit_count = null;
служит для проверки правильности значений параметров limit_from и limit_count.
Строка $res = $this->db->get('sites',$where,$limit_from,$limit_count); служит для выборки данных из БД при помощи функциональности Active Record.
Параметр where передается без проверки, делать так при разработке реальных сайтов я не рекомендую.
Условие if(0 < $res->num_rows) служит для проверки на то, что результат запроса содержит ненулевое количество строк.
Цикл
foreach( $res->result() as $row) { $tmp = new Site_model(); $tmp->id = $row->id; $tmp->name = $row->name; $tmp->description = $row->description; $tmp->url = $row->url; $results[$tmp->id] = $tmp; }
И наконец, строка return $results; возвращает результат работы функции.
Разработка кода контроллера управления сайтами в каталоге
CodeIgniter позволяет организовать иерархическую структуру контроллеров приложения. Например, если вы хотите сгруппировать все контроллеры панели управления в одном каталоге, то достаточно создать его в каталоге application/controllers и помещать все контроллеры в него. Создаем каталог application/controllers/admin, в нем создаем файл sites.php. В этом файле объявим класс Sites потомок класса Controller. И снова обратите внимание на регистр символов названия класса и названия файла.
class Sites extends Controller { function Sites() { parent::Controller(); } }
Метод Sites является конструктором и должен содержать вызов конструктора предка. Сделать это необходимо до обращения к средствам CodeIgniter при помощи конструкций вида $this->load или $this->classname.
Теперь добавим в этот класс метод, который будет вызываться по умолчанию. В CodeIgniter этот метод называется index()
function index() { $this->load->model('site_model'); $data['sites_list'] = $this->site_model->get_list(); $this->load->view('admin/sites/list',$data); }
Рассмотрим этот метод детально. Код $this->load->model('site_model'); подключает ранее созданный класс модели Site_model.
Строка $data = array(); содержит массива данных, которые будут переданы в представление.
Строка $data['sites_list'] = $this->site_model->get_list(); содержит вызов написанного ранее метода для получения списка сайтов и занесения результатов в массив $data с индексом 'sites_list'.
Строка $this->load->view('admin/sites/list',$data); подключает представление для данной страницы и передает в код представления полученные из БД данные.
Код представления (View) для вывода списка сайтов
В CodeIgniter все файлы кода представления хранятся в каталоге application/views, при этом для того, чтобы подключить в контроллере код представления достаточно написать $this->load->view('view_file_name');. При этом будет подключен файл application/views/view_file_name.php, т.е. расширение файла и путь к файлам представления по умолчанию указывать не нужно. Если в код представления нужно передать данные, то для этого нужно в качестве второго параметра функции $this->load->view передать ассоциативный массив. При этом в коде представления данные будут доступны в виде переменных с именами, которые соответствуют индексам переданного массива. В коде контроллера я вызывал код представления и передал ему ассоциативный массив с данными по индексу 'sites_list'. Это значит, что в коде представления эти данные будут доступны как переменная с именем $sites_list.
Создадим в каталоге application/views подкаталог admin/sites, в нем создадим файл list.php. В этот файл поместим следующий код:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <h1>Список сайтов</h1> <table border="1"> <tr> <th>ID </th> <th>Название сайта</th> <th>Описание сайта</th> <th>URL сайта</th> </tr> <?php foreach($sites_list as $site_obj) { ?> <tr> </tr> <?php } ?> </table> </body> </html>
Для того, чтобы создать тестовые данные для проверки кода, добавим несколько записей в таблицу sites:
INSERT INTO `sites` (`id`, `name`, `description`, `url`) VALUES (1, 'test1', 'test1 description', 'test2 url'), (2, 'test2', 'test2 description', 'test2 url'), (3, 'test3', 'test3 description', 'test3 url'), (4, 'test4', 'test4 description', 'test4 url');
Теперь все готово для того, чтобы проверить работоспособность кода. Сделать это можно открыв в браузере адрес scatalog.loc/index.php/admin/sites (Вместо scatalog.loc укажите имя домена, на котором вы разместили тестовый код.)
Если все было сделано правильно, то будет выведен список из четырех сайтов.
Продолжение следует...

Отправить комментарий