Делаем корзину покупок с помощью Codeigniter и JQuery. Часть 2.

В этой статье продолжим подготовку Codeigniter к нормальной работе, а так же рассмотрим создание контроллера, отвечающего за функционал нашей AJAX корзины и модели, с помощью которой можно получать товары из БД.

Подготовка к работе Codeigniter

Давайте подведём к концу подготовку к работе с Codeigniter, чтобы больше на неё не отвлекаться.

В Codeigniter очень удобно устроена работа с URL адресами. Например, для просмотра страницы товара магазина на Codeigniter URL будет примерно таким:

http://magazine.ru/index.php/products/view/1

Сейчас в нём нас интересует следующая часть адреса: /index.php/products/view/1. Codeigniter "видит" этот адрес так:

  • Запустить скрипт index.php (от лежит в корне сайта).
  • Найти контроллер с именем products.php.
  • Вызвать метод view в контроллере с аргументом 1.

Подробнее можно почитать в официальной документации. Впринципе всё логично и удобно, но желательно избавиться от index.php в строке адреса. Для этого в корне проекта необходимо создать файл .htaccess со следующим сожержимым:

.htaccess

RewriteEngine on
RewriteCond $1 !^(index\.php|images|assets|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

Теперь все запросы будут перенаправляться файлу index.php автоматически и в строке адреса можно написать следующий URL:

http://magazine.ru/products/view/1

Теперь удалим из проекта все ненужные для работы файлы и папки. Смело можно удалять:

  • Папку user_guide. В ней находится оффлайн версия документации к Codeigniter.
  • Файл license.txt.
  • Все остальные файлы в корне проекта, кроме index.php и .htaccess.
  • Файл welcome.php в папке application/controllers. Это пример контроллера, выводящего страницу приветствия Codeigniter.
  • Файл application/views/welcome_message.php. Это шаблон для вывода стартовой страницы Codeigniter.

У меня получилось следующее:

novaya-struktura-papok-proekta.png

Ну и последним шагом будет добавление изображений товара. Я уже подготовил тестовые картинки для урока. Скачайте архив с изображениями и поместите их в папку /assets/img/.

На этом основные пункты подготовки Codeigniter к работе выполнены.

Контроллер корзины покупок

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

Создайте в новый файл cart.php в папке application/controllers и заполните стандартным шаблоном контроллера Codeigniter:

/application/controllers/cart.php

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Class Cart
 * Контроллер реализует работу AJAX корзины
 * 
 * http://nikitakiselev.ru/post/1
 */
class Cart extends CI_Controller
{

    /**
     * Метод-конструктор. Вызывается всмегда перед вызовом
     * любого метода этого класса.
     */
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {

    }
}
/* End of file cart.php */
/* Location: ./application/controllers/cart.php */

Теперь заполним метод index() следующим кодом:

public function index()
{
    // Массив, в котором будут храниться товары
    $products = array();

    // Получение товаров из БД
    $products = $this->cart_model->retrieve_products();
}

Что означает этот код?

В любом контроллере метод index() вызывается по умолчанию, если в URL адресе не указан какой метод вызывать. Например URL адрес http://magazine.ru/products/ Codeigniter отработает следующим образом:

  • найдет контроллер с именем products.php;
  • так как не указан метод этого контроллера, вызовет метод index().

В методе index() сначала мы инициализируем переменную $products как пустой массив. Затем в эту переменную получаем все товары магазина (их мы заполнили когда создавали таблицу ci_cart) с помощью модели cart_model, которую мы сейчас и создадим.

Создаём модель cart_model

Модели это классы PHP, которые предназначены для работы с информацией в базе данных. Например, если мы создаём свой блог на Codeigniter, то согласно архитектуре MVC, следует создать модель, которая будет вставлять, обновлять и удалять записи блога в базе данных. Все пользовательские файлы моделей хранятся в папке /application/models. Создадим там новый файл под названием cart_model.php и создадим в нём следующую структуру:

/application/models/cart_model.php

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Class Cart_model
 * Модельорганизовывает работу с товарам магазина
 */
class Cart_model extends CI_Model
{
    //Конструктор класса
    public function __construct()
    {
        parent::__construct();
    }
}
/* End of file cart_model.php */
/* Location: ./application/models/cart_model.php */

Поясню код.

Мы создаём новый класс, который расширяет системный класс CI_Model. Расширять класс в модели нужно всегда, чтобы получить доступ к стандартным методам Codeigniter.

В контроллере корзины покупок мы использовали метод retrieve_products() из созданной нами только что модели. Давайте создадим этот метод.

/application/models/cart_model.php

/**
 * Получает все товары магазина из БД
 */
public function retrieve_products()
{
    //Получает все записи из таблицы products
    $query = $this->db->get('products');

    //Возвращает массив с записями в виде 
    // ассоциативного массива
    return $query->result_array();
}

Модель создана, метод получения товаров из БД добавлен. Осталось подключить модель в контроллере Cart. Для этого в контроллере application/controllers/cart.php в функции конструктора класса нужно написать следующее:

public function __construct() {
  parent::__construct();
  //Подключение модели
  $this->load->model('cart_model');
}

Подробнее почитать о моделях Codeigniter можно в соответствующем разделе документации по Codeigniter.

На этом этапе, если вы запустите ваш сайт, то в браузере должна быть белая страница, без ошибок. Если это так, то продолжим, если нет – прочитайте ошибку, вернитесь и просмотрите внимательно все пункты, возможно Вы что-то упустили. Так же пишите в комментариях о трудностях и непонятках, которые возникли во время повторения этой статьи.

Давайте отобразим на странице содержимое массива $products, в который мы получали все товары из базы данных. Для этого в метод index() основного контроллера (application/controllers/cart.php) допишем следующую строку:

print_r($products);

И перезагрузите страницу. На экране появится содержимое нашего массива с продуктами $products:

Array ( [0] => Array ( [id] => 1 [name] => MacBook Pro [price] => 1199 [image] => macbookpro.jpg ) [1] => Array ( [id] => 2 [name] => MacBook Air [price] => 1499 [image] => macbookair.jpg ) [2] => Array ( [id] => 3 [name] => MacBook [price] => 999 [image] => macbook.jpg ) )

Т.к. информация в таком виде никуда не годится, нужно вывести её шаблонизатором Codeigniter, через views, но об этом в следующей статье.

Скачать исходные файлы урока.