От автора: в какой-то момент требования к вашему проекту вынудят вас создать кастомные API OpenCart. Об этом мы и поговорим в этом уроке. В кастомном модуле API мы будем получать все доступные товары магазина. Список будет в виде закодированной JSON строки – это требование REST стандартов в OpenCart.
Вы должны знать основы модульной разработки в OpenCart. Еще один важный момент, у вас должна быть установлена последняя версия OpenCart 2.1.0.2 (на момент написания статьи) для обеспечения совместимости с API ядра. Не буду тратить ваше время, перейдем сразу к практике в следующей секции.
Создание файлов
Взглянем на список файлов, которые нам нужны.
catalog/controller/api/custom.php: файл контроллера, здесь лежит большая часть логики приложения
catalog/language/en-gb/api/custom.php: языковой файл с языковыми переменными
common.php: в файле хранится общий код для повторного использования
login.php: файл для авторизации в магазине через REST API
products.php: в файле вытягиваются товары через кастомный модуль API
Это все что нужно для создания кастомного модуля API и для тестирования с помощью PHP библиотеки CURL.
Начнем с контроллера. Создайте файл catalog/controller/api/custom.php со следующим кодом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php // catalog/controller/api/custom.php class ControllerApiCustom extends Controller { public function products() { $this->load->language('api/custom'); $json = array(); if (!isset($this->session->data['api_id'])) { $json['error']['warning'] = $this->language->get('error_permission'); } else { // load model $this->load->model('catalog/product'); // get products $products = $this->model_catalog_product->getProducts(); $json['success']['products'] = $products; } if (isset($this->request->server['HTTP_ORIGIN'])) { $this->response->addHeader('Access-Control-Allow-Origin: ' . $this->request->server['HTTP_ORIGIN']); $this->response->addHeader('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); $this->response->addHeader('Access-Control-Max-Age: 1000'); $this->response->addHeader('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With'); } $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } } |
Если вы знакомы со структурой файлов модулей в OpenCart, то код вам будет знаком. Но мы все же объясним важные моменты в методе products.
Сначала нам нужно проверить подлинность запроса, что делается через переменную api_id в активной сессии. Если запрос правильный и подлинный, мы идем дальше и получаем все товары через метод getProducts модели ядра Product. Если не пройдена авторизация, метод вернет сообщение об ошибке доступа.
Далее идет общая проверка безопасности на CSRF атаки. Проверка проводится через переменную HTTP_ORIGIN и добавление соответствующих заголовков, если переменная существует.
В конце с помощью функции json_encode мы кодируем массив $products, результат передается как аргумент в метод setOutput.
Далее необходимо создать языковой файл catalog/language/en-gb/api/custom.php для модуля со следующим кодом.
1 2 3 4 |
<?php // catalog/language/english/api/custom.php // Error $_['error_permission'] = 'Warning: You do not have permission to access the API!'; |
С созданием файлов в OpenCart закончили. Начиная со следующего раздела, мы начнем создавать файлы для тестирования кастомного API через PHP библиотеку CURL.
Принцип работы
Прежде чем перейти к тестированию модуля API необходимо создать данные для авторизации в API через back end OpenCart.
Если вы этого еще не сделали, то это не сложно. Перейдите на back end и далее System > Users > API. Добавьте нового пользователя API. Также необходимо добавить IP-адрес, с которого вы будете совершать API вызовы.
Создайте файл common.php со следующим кодом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php function do_curl_request($url, $params=array()) { $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/apicookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/apicookie.txt'); $params_string = ''; if (is_array($params) && count($params)) { foreach($params as $key=>$value) { $params_string .= $key.'='.$value.'&'; } rtrim($params_string, '&'); curl_setopt($ch,CURLOPT_POST, count($params)); curl_setopt($ch,CURLOPT_POSTFIELDS, $params_string); } //execute post $result = curl_exec($ch); //close connection curl_close($ch); return $result; } |
Как видите, в файле всего одна функция do_curl_request, которая делает CURL запрос на URL, переданный как аргумент $url. Второй аргумент – массив параметров, если вам нужны POST данные.
Важно заметить CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE. Они устанавливают файл, в котором будут храниться и считываться куки. Наши вызовы будут авторизованные, поэтому нам эти переменные нужны! Нужно лишь сменить путь /tmp/apicookie.txt на ваш собственный. Файл должен быть доступен для записи сервера!
Функция возвращает ответ на CURL запрос!
Сначала необходимо начать сессию. Для этого необходимо авторизоваться. Разберем пример. Создайте файл login.php со следующим кодом.
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php require "common.php"; $url = '//your-opencart-store-url/index.php?route=api/login'; $fields = array( 'username' => 'demouser', 'key' => 'ysvF7M1nqNYiZV3GFtU252jhn0FrCWMdH8Kw8qR6DApZ7RSJWCN7S0IvIxnti1QP2wUNsYCaG6vHa2l2q8FTFbWNwNYQUO58CfSYJHHJRG0vt7OBN60BnE5MdEVLBSSJVBZJ7ioFuiAmQN1dmBO56dmaawULlY8lnWFXQimecZznUo7NCJHp3rkL1tOAYgeIUl1oVjzrZ7cayikQEvUtwIGj7Ai4XudDH70E7hKGNJcXPiY5RfgFI8PQ8eLg1FZJ', ); $json = do_curl_request($url, $fields); var_dump($json); |
Сначала мы подключили файл common.php из предыдущей секции. Далее переменная $url определяет URL авторизации API магазина OpenCart. Далее массив $fields хранит данные для авторизации пользователя API.
В конце мы вызываем метод do_curl_request для авторизации. Обратите внимание на переменную token в объекте $json. Сохраните значение переменной, позже нам придется его передавать в API запросы.
Создайте файл products.php со следующим кодом.
1 2 3 4 5 6 7 8 |
<?php require "common.php"; $url = '//your-opencart-store-url/index.php?route=api/custom/products&token=GtULQW9ZMhhHLi3ooobDukIqTmqOZ1fJ'; $json = do_curl_request($url, $fields); $data = json_decode($json); var_dump($data); |
Обратим внимание на переменную строки запроса роута. Она задана в значение api/custom/products и вызывает метод products из файла контроллера custom.php, который мы создали в начале урока. Мы передали переменную token со значением, чтобы у нас был доступ к API.
Нам важно получить правильно закодированный JSON в переменной $data, что и произойдет, если запустить файл products.php! Если вы правильно создали пользователя и файлы, все заработает.
Это лишь щепотка того, на что способно REST API в OpenCart. Это был очень простой, но эффективный пример демонстрации темы. Вы можете расширить его и реализовать свои решения под требования.
На сегодня все. Не стесняйтесь задавать вопросы и писать предложения, мы их очень ценим!
Заключение
Сегодня мы обсудили, как создать кастомный API в OpenCart через кастомный модуль. Мы прошли полный процесс для создания функциональности.
Автор: Sajal Soni
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.