Разработка CRUD-приложения, часть 2 - модель, контроллер, представление, вывод списка сайтов

 

Во второй части статьи я рассмотрю такие вопросы как создание модели, контроллера и представлений для решения задачи вывода списка сайтов каталога.

CodeIgniter является MVC-фреймворком, это означает что код приложения может быть разбит на три основные составляющие - модель (Model), представление (View) и контроллер (Controller).

Модель (Model) отвечает за реализацию бизнес-логики приложения, работу с базой данных и другими внешними источниками информации.

Представление (View) отвечает за представление информации пользователю, т.е. содержит код вывода и оформления информации.

Контроллер (Controller) отвечает за логику определения нужной модели и представления и содержит код вызова нужной модели и представления.

Разработка кода моделей

Для решения задачи добавления сайтов в каталог нам понадобиться код для добавления информации о сайте в БД, получения списка сайтов (для просмотра и категорий, удаления и редактирования сайтов в каталоге.

Модель для объектов типа "Сайт"

Создаем в каталоге application/models файл site_model.php. В нем нужно объявить класс Site_model (обратите внимание на регистр символов в названии, то же касается и имени файла), потомок класса Model.

  1. class Site_model extends Model {
  2. var $id;
  3. var $name;
  4. var $description;
  5. var $url;
  6. var $_loaded;
  7.  
  8. function Site_model() {
  9. parent::Model();
  10. }
  11. }

Метод Site_model() является конструктором класса модели и содержит код вызова конструктора предка - parent::Model(). Эта строка должна идти перед любым обращением к средствам CodeIgniter через конструкцию $this->load... , $this->classname... и т.п.

Свойства id,name,description,url служат для хранения полей информации о сайте, поле _is_loaded является служебным и понадобится нам в дальнейшем.

Теперь добавим метод для получения списка сайтов:

  1. function get_list($where=false,$limit_from=false,$limit_count=false) {
  2. $results = array();
  3. if($limit_from)
  4. $limit_from = intval($limit_from);
  5. else $limit_from = null;
  6.  
  7. if($limit_count)
  8. $limit_count = intval($limit_count);
  9. else $limit_count = null;
  10.  
  11. $res = $this->db->get('sites',$where,$limit_from,$limit_count);
  12. if(0 < $res->num_rows) {
  13. foreach( $res->result() as $row) {
  14. $tmp = new Site_model();
  15. $tmp->id = $row->id;
  16. $tmp->name = $row->name;
  17. $tmp->description = $row->description;
  18. $tmp->url = $row->url;
  19. $results[$tmp->id] = $tmp;
  20. }
  21. }
  22. return $results;
  23. }

Рассмотрим его детально. Параметр $where служит для указания фильтра при выборке списка объектов, параметры $limit_from и $limit_count служат для задания смещения и органичения количества выбранных элементов в результате запроса (SQL-конструкция LIMIT OFFSET,COUNT).

Строка $results = array(); содержит объявление массива, который будет содержать результат работы функции.
Код

  1. if($limit_from)
  2. $limit_from = intval($limit_from);
  3. else $limit_from = null;
  4.  
  5. if($limit_count)
  6. $limit_count = intval($limit_count);
  7. 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) служит для проверки на то, что результат запроса содержит ненулевое количество строк.
Цикл
  1. foreach( $res->result() as $row) {
  2. $tmp = new Site_model();
  3. $tmp->id = $row->id;
  4. $tmp->name = $row->name;
  5. $tmp->description = $row->description;
  6. $tmp->url = $row->url;
  7. $results[$tmp->id] = $tmp;
  8. }
нужен чтобы для каждой строки результата запроса создать экземпляр класса модели и занести его в массив результата функции.
И наконец, строка return $results; возвращает результат работы функции.

Разработка кода контроллера управления сайтами в каталоге

CodeIgniter позволяет организовать иерархическую структуру контроллеров приложения. Например, если вы хотите сгруппировать все контроллеры панели управления в одном каталоге, то достаточно создать его в каталоге application/controllers и помещать все контроллеры в него. Создаем каталог application/controllers/admin, в нем создаем файл sites.php. В этом файле объявим класс Sites потомок класса Controller. И снова обратите внимание на регистр символов названия класса и названия файла.

  1. class Sites extends Controller {
  2. function Sites() {
  3. parent::Controller();
  4. }
  5. }

Метод Sites является конструктором и должен содержать вызов конструктора предка. Сделать это необходимо до обращения к средствам CodeIgniter при помощи конструкций вида $this->load или $this->classname.

Теперь добавим в этот класс метод, который будет вызываться по умолчанию. В CodeIgniter этот метод называется index()

  1. function index() {
  2. $this->load->model('site_model');
  3. $data = array();
  4. $data['sites_list'] = $this->site_model->get_list();
  5. $this->load->view('admin/sites/list',$data);
  6. }

Рассмотрим этот метод детально. Код $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. В этот файл поместим следующий код:

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. </head>
  5. <body>
  6. <h1>Список сайтов</h1>
  7. <table border="1">
  8. <tr>
  9. <th>ID
  10. </th>
  11. <th>Название сайта</th>
  12. <th>Описание сайта</th>
  13. <th>URL сайта</th>
  14. </tr>
  15. <?php foreach($sites_list as $site_obj) { ?>
  16. <tr>
  17. <td><?php print $site_obj->id ?></td>
  18. <td><?php print $site_obj->name ?></td>
  19. <td><?php print $site_obj->description ?></td>
  20. <td><?php print $site_obj->url ?></td>
  21. </tr>
  22. <?php } ?>
  23. </table>
  24. </body>
  25. </html>

Для того, чтобы создать тестовые данные для проверки кода, добавим несколько записей в таблицу sites:

  1. INSERT INTO `sites` (`id`, `name`, `description`, `url`) VALUES
  2. (1, 'test1', 'test1 description', 'test2 url'),
  3. (2, 'test2', 'test2 description', 'test2 url'),
  4. (3, 'test3', 'test3 description', 'test3 url'),
  5. (4, 'test4', 'test4 description', 'test4 url');

Теперь все готово для того, чтобы проверить работоспособность кода. Сделать это можно открыв в браузере адрес scatalog.loc/index.php/admin/sites (Вместо scatalog.loc укажите имя домена, на котором вы разместили тестовый код.)
Если все было сделано правильно, то будет выведен список из четырех сайтов.

Продолжение следует...

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

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Allowed HTML tags: <a> <em> <b> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <h2> <h3>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]". PHP source code can also be enclosed in <?php ... ?> or <% ... %>.

Подробнее о форматировании

CAPTCHA
Этот вопрос предназначен для того, чтобы отсеять ботов
4 + 4 =
Решите простой математический пример и введите результат. К примеру, для вопроса 1+3 нужно ввести 4

Вход в систему

Последние комментарии