От автора: в самом ядре OpenCart уже есть множество функций, однако зачастую необходимо интегрировать стороннюю библиотеку. В то же время, есть концепция библиотеки, которая обеспечивает общий набор OpenCart API для ежедневных операций, как например, взаимодействие с системой конфигурации или системой баз данных, работа с email и т.д. Сегодня мы узнаем, как реализовать свою кастомную библиотеку в OpenCart.
В этой статье мы создадим кастомную библиотеку, с помощью которой вы сможете делать CURL запросы. Постараемся не усложнять. Важно понять концепцию, а реализация может отличаться по сложности.
Будем использовать последнюю версию OpenCart. Предполагаю, что вы знакомы с модульной структурой OpenCart.
Что такое библиотека в OpenCart?
Что же такое библиотека в OpenCart? Простым языком, это набор скриптов, обеспечивающий основной функционал во фреймворке. В OpenCart все библиотеки находятся в папке system/library. Например, входящий запрос обрабатывается библиотекой Request, а для обработки ответа есть библиотека Response. Аналогично есть библиотеки для кэширования, покупателей, баз данных и систем конфигурации. Назовем парочку.
Необходимые библиотеки загружаются в код контроллера/модели. Для загрузки любой библиотеки необходимо сделать что-то типа:
1 |
$cache = $this->load->library('cache'); |
В примере выше мы загрузили библиотеку cache. Теперь вам доступен объект $cache, от которого вы можете вызывать методы, определенные в этой библиотеке. Как видите, это действительно гибкий способ загрузки объектов.
Сегодня мы реализуем библиотеку curl, с помощью которой вы сможете делать CURL вызовы с помощью самой библиотеки. В контроллере лучше избегать дублирования кода, так как для каждого CURL запроса необходимо создать объект и настроить общие заголовки. Мы обернем код в общую библиотеку, чтобы не дублировать его в модулях и иметь возможность повторно использовать его.
Прежде чем перейдем к реализации кастомной библиотеки, давайте взглянем на одну из библиотек ядра OpenCart.
Изучите код библиотеки ядра
В предыдущем разделе мы говорили про библиотеку кэширования, давайте посмотрим ее код. Откройте файл system/library/cache.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 |
<?php class Cache { private $cache; public function __construct($driver, $expire = 3600) { $class = 'Cache\\' . $driver; if (class_exists($class)) { $this->cache = new $class($expire); } else { exit('Error: Could not load cache driver ' . $driver . ' cache!'); } } public function get($key) { return $this->cache->get($key); } public function set($key, $value) { return $this->cache->set($key, $value); } public function delete($key) { return $this->cache->delete($key); } } |
Все просто, правда? Простой класс с необходимыми методами. Это очень простой пример, но он мог быть достаточно сложным! Просмотрите еще пару библиотек, чтобы ознакомиться с концепцией.
Создание кастомной библиотеки: curl
Вы ознакомились с библиотеками ядра, теперь давайте создадим свою! Создайте файл system/library/curl.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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<?php class Curl { private $logger; private static $instance; /** * @param object $registry Registry Object */ public static function get_instance($registry) { if (is_null(static::$instance)) { static::$instance = new static($registry); } return static::$instance; } /** * @param object $registry Registry Object * * You could load some useful libraries, few examples: * * $registry->get('db'); * $registry->get('cache'); * $registry->get('session'); * $registry->get('config'); * and more... */ protected function __construct($registry) { // load the "Log" library from the "Registry" $this->logger = $registry->get('log'); } /** * @param string $url Url * @param array $params Key-value pair */ public function do_request($url, $params=array()) { // log the request $this->logger->write("Initiated CURL request for: {$url}"); // init curl object $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // prepare post array if available $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 request $result = curl_exec($ch); // close connection curl_close($ch); return $result; } } |
Мы определили класс Curl с полезными методами.
Метод get_instance позволяет создавать объект класса. Он также проверяет, что в любое время у нас всего один экземпляр класса.
Далее мы определяем конструктор с аргументом $registry. Аргументы не нужны, но для примера я его задал, чтобы показать, как загружать другие библиотеки с помощью объекта $registry. В нашем примере мы загружаем библиотеку Log и назначаем ее на свойство logger. С помощью этой библиотеки мы будем логировать curl запросы для отладки!
Есть метод do_request, который выполняет всю тяжелую работу за нас! Он принимает два аргумента: $url хранит URL, на который мы будем делать curl запрос, а $params хранит необязательный массив параметров, если понадобится отправить POST запрос с любыми данными. Далее очень простой код: он делает curl запрос и возвращает ответ!
Почти закончили с созданием кастомной библиотеки. В следующем разделе посмотрим ее в действии.
Как использовать нашу кастомную библиотеку
В большинстве случаев вы будете вызывать библиотеки из контроллера. Давайте посмотрим, как загружать и использовать библиотеку из контроллера.
1 2 3 4 5 6 |
// load curl library $this->load->library('curl'); $obj_curl = Curl::get_instance($this->registry); $result = $obj_curl->do_request($url); $result = $obj_curl->do_request($url, $params); // in case of $params needed |
Выражение $this->load->library(‘curl’) загружает кастомную библиотеку. В следующем выражении мы вызвали метод get_instance и передали объект $registry, как аргумент конструктора. Далее мы использовали метод do_request для совершения curl запроса!
Как видите, довольно легко создать свою собственную библиотеку в OpenCart! Точно так же вы можете интегрировать любую стороннюю библиотеку в формат библиотек OpenCart и использовать ее во всем фреймворке.
Заключение
Сегодня мы обсудили концепцию библиотеки в OpenCart. Мы изучили библиотеки ядра и создали свою библиотеку для curl. Надеюсь, вам понравилось! Делитесь своими мыслями и запросами в комментариях!
Автор: Sajal Soni
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.