Сам модуль экспорта написан пользователем toporchillo и на момент написания статьи доступен на opencartforum.com
Клиентом была поставлена задача выполнять экспорт базы email в unisender не каждый раз при добавлении нового клиента, как делает указанный модуль, а по крону раз в неделю. Так как на клиентском сайте в принципе отсутствует регистрация пользователей, то такой подход вполне логичен. В общем был написан небольшой класс, который использует настройки модуля toporchillo и выполняет экспорт контактов из заказов за прошедшую неделю. Vqmod модуля был отключен за ненадобностью.Исходный код файла unisender.php (расположен в catalog/cron/unisender)
<?php /** * Class ControllerCronUnisender * @author sfonclub@gmail.com * @date 15.10.2015 * класс собирает по крону email адреса из заказов за последнюю неделю и отправляет их в unisender */ class ControllerCronUnisender extends Controller { public function index() { $orders = $this->getLastWeekOrders(); $this->subscribe($orders); exit; } /** * @return mixed * метод получает список заказов за последнюю неделю */ public function getLastWeekOrders() { $sql = "SELECT o.email, CONCAT(o.firstname, ' ', o.lastname) AS customer, o.ip FROM `" . DB_PREFIX . "order` o WHERE o.order_status_id > '-1' AND DATE(o.date_added) between date_sub(now(),INTERVAL 1 WEEK) and now() ORDER BY o.order_id DESC"; $query = $this->db->query($sql); return $query->rows; } /** * @param $data * метод выполняет импорт контактов в unisender */ public function subscribe($data) { $api_key = $this->config->get('unisender_key'); if (!$this->config->get('unisender_status') || !$api_key) return; // Список, куда их добавить $list = $this->config->get('unisender_subscribtion'); // Создаём POST-запрос $POST = array ( 'api_key' => $api_key, 'double_optin' => 1, 'field_names[0]' => 'email', 'field_names[1]' => 'Name', 'field_names[2]' => 'email_list_ids', 'field_names[3]' => 'email_request_ip', 'field_names[4]' => 'email_confirm_ip', 'field_names[5]' => 'email_add_time', 'field_names[6]' => 'email_confirm_time' ); // Новые подписчики $i = 0; $emails = array(); foreach($data as $d){ if(empty($d['email']) or !(filter_var($d['email'], FILTER_VALIDATE_EMAIL)) or in_array($d['email'], $emails)) continue; $POST['data[' . $i .'][0]'] = $d['email']; $POST['data[' . $i .'][1]'] = $d['customer']; $POST['data[' . $i .'][2]'] = implode(',', $list); $POST['data[' . $i .'][3]'] = $d['ip']; $POST['data[' . $i .'][4]'] = $d['ip']; $POST['data[' . $i .'][5]'] = gmdate('Y-m-d h:i:s', time()-200); $POST['data[' . $i .'][6]'] = gmdate('Y-m-d h:i:s', time()-10); $emails[] = $d['email']; $i++; } // Устанавливаем соединение $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $POST); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_URL, 'http://api.unisender.com/ru/api/importContacts?format=json'); $result = curl_exec($ch); if ($result) { // Раскодируем ответ API-сервера $jsonObj = json_decode($result); if(null===$jsonObj) { // Ошибка в полученном ответе echo "Invalid JSON"; } elseif(!empty($jsonObj->error)) { // Ошибка импорта echo "An error occured: " . $jsonObj->error . "(code: " . $jsonObj->code . ")"; } else { // Новые подписчики успешно добавлены echo "Success! Added " . $jsonObj->result->new_emails . " new e-mail addresses"; } } else { // Ошибка соединения с API-сервером echo "API access error"; } } }
Запускается крон по ссылке вашсайт.ру/index.php?route=cron/unisender
На всякий случай архивы с оригинальным модулем прикладываю
P.s. мой класс написан для opencart 1.5, на версии 2 не проверял 😉
Добрый день! Пытаюсь приделать ваш скрипт для opencart 2.3
но упёрся в первую же ошибку. уже на строке class ControllerCronUnisender extends Controller
выдаётся error 500 PHP Fatal error: Class ‘Controller’ not found
Ума не приложу что за ерунда!
Добрый день. Модуль под 2.3 не будет работать, его нужно переписывать