Разработка 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: <em> <b> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <h2> <h3> <h4> <table> <tr> <td> <th>
  • Строки и параграфы переносятся автоматически.
  • 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
Этот вопрос предназначен для того, чтобы отсеять ботов

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

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