Сам модуль экспорта написан пользователем 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 не будет работать, его нужно переписывать