Здравствуйте, уважаемые читатели хабра. Данный материал является продолжением цикла статей о том, как построить VPS-хостинг с нуля на базе RUVDS White Label API. И сегодня мы рассмотрим популярную CMS Joomla и одно из самых популярных ecommerce-решений для неё — VirtueMart.
Virtuemart
Вообще говоря, расширение существует достаточно давно (первая версия вышла аж в 2005 году).
Продукт рос и развивался вместе с CMS Joomla и на текущий момент обладает достаточно широкой функциональностью.
Давайте вместе рассмотрим плюсы и минусы плагина Virtuemart 3.
Плюсы
- бесплатность
- настраиваемые поля
- форма заказа в один клик
- мультивалютность
- простой процесс оформления заказа
- гибкая и мощная система управления доступом
- множество платёжных методов доступно «из коробки»
Минусы
- громоздкий код и проблемы с производительностью
- отсутствует простое API для интеграции с внешними сервисами
- поддерживаемые по умолчанию платёжные системы ориентированы на запад (paypal, skill, 2checkout)
- относительно небольшое комьюнити (~317127 человек зарегистировано на официальном форуме, в репозитории работа ведется не слишком активно и количество задействованных разработчиков невелико (для сравнения, в репозитории woocommerce 470 разработчиков, что в 10 раз больше)
- невысокая скорость добавления новой функциональности (следствие в том числе предыдущего пункта)
- проблемы с безопасностью, обусловленные популярностью как CMS Joomla, так и самого расширения virtuemart
Особенности адаптации под vps-хостинг
Прием платежей
Порядок действий такой же, как при использовании других связок, например wordpress и woocommerce. Для того, чтобы интегрироваться с уже знакомым нам аггрегатором paymaster, скачиваем бесплатное расширение. Настройка расширения paymaster детально описана по этой же ссылке.
Отключение механизма гостевых покупок
Переходим в Virtuemart > Configuration > Checkout и выставляем флаг «Only registered users can checkout».
Настройка страниц
После установки плагина Virtuemart, у нас появляется возможность использовать в меню специализированные страницы. Для того, чтобы сделать из главной страницы витрину, переходим в Menus > Manage и редактируем меню с алиасом home. Нам нужно изменить Menu Item Type на один из типов, предоставляемых Virtuemart:
- Account Maintenance
- Category Layout
- Displays vendor contact
- Displays vendor details
- Displays vendors
- Front page
- List Orders
- Manufacturer Default Layout
- Manufacturer Details Layout
- Product Details Layout
- Shopping Cart
- User Edit Address
- View vendor TOS
Мы выбрали Category Layout и стандартное оформление Joomla (версия 3.5) и, после добавления основных конфигураций VPS, главная страница выглядит так:
Обработка оплаченных заказов
Итак, перед нами те же самые задачи:
- инициировать создание сервера с помощью RuVDS Whitelabel API и предоставить клиенту все необходимые данные о процессе создания (идентификатор сервера, этап создания, прогресс создания, конфигурация сервера)
- после создания сервера предоставить необходимые для подключения данные, а также возможности по управлению сервером и информацию о дате завершения расчетного периода
Что нам доступно для интеграции
- автоматически сгенерированная документация по API Virtuemart 2 (в статье мы рассматриваем 3-ю версию)
- сервис api2cart — унифицированный API для интернет магазинов (от 500$ в месяц)
- бесплатный компонент SOAP-сервисы для Virtuemart 3 (несколько урезанная версия, но её функционала для наших задач вполне достаточно)
Остановимся на последнем варианте. После установки этого плагина доступны следующие SOAP-сервисы:
- VM_Categories
- VM_Order
- VM_Product
- VM_SQLQueries
- VM_Users
- VM_Upload
Их wsdl доступны по url (пример для сервиса, управляющего категориями товаров):
http://host/administrator/components/com_vm_soa/services /VM_CategoriesWSDL.php
Нам потребуются 3 — VM_Order, VM_Product и VM_SQLQueries.
К сожалению, при использовании данного способа интеграции, нам недоступен механизм хуков. Поэтому мы будем периодически выбирать заказы с подходящим статусом и инициировать создание серверов нужной конфигурации.
Напишем простой скрипт на языке PHP, который будет создавать сервера после оплаты заказа:
<?php
function getApplicationSettings()
{
return [
'login' =>'admin',
'password'=>'admin',
'orderServiceWsdl'=>'http://localhost/administrator/components/com_vm_soa/services/VM_OrderWSDL.php',
'productServiceWsdl' =>'http://localhost/administrator/components/com_vm_soa/services/VM_ProductWSDL.php'
];
}
function getCompleteOrders($limitStart = 0, $limitEnd=1000)
{
$applicationSettings = getApplicationSettings();
$loginInfo = new stdClass;
$loginInfo->login=$applicationSettings['login'];
$loginInfo->password=$applicationSettings['password'];
$loginInfo->isEncrypted="Y";
$loginInfo->lang=null;
$orderServiceClient = new SoapClient($applicationSettings['orderServiceWsdl']);
$getOrderFromStatusRequest = new stdClass;
$getOrderFromStatusRequest->limite_start = $limitStart;
$getOrderFromStatusRequest->limite_end = $limitEnd;
$getOrderFromStatusRequest->status = 'F'; //завершенные заказы
$getOrderFromStatusRequest->loginInfo = $loginInfo;
try {
// выбираем все заказы со статусом "завершенный"
return [$orderServiceClient->GetOrdersFromStatus($getOrderFromStatusRequest)];
}catch(\SoapFault $e){
echo $e->getMessage();
return false;
}
}
function processPayedOrder($orderId)
{
$applicationSettings = getApplicationSettings();
$loginInfo = new stdClass;
$loginInfo->login=$applicationSettings['login'];
$loginInfo->password=$applicationSettings['password'];
$loginInfo->isEncrypted="Y";
$loginInfo->lang=null;
$productServiceClient = new SoapClient($applicationSettings['productServiceWsdl']);
$getProductsFromOrderIdRequest = new stdClass;
$getProductsFromOrderIdRequest->order_id = $orderId;
$getProductsFromOrderIdRequest->include_prices = true;
$getProductsFromOrderIdRequest->loginInfo = $loginInfo;
try {
// выбираем заказанные конфигурации
$products = [$productServiceClient->GetProductsFromOrderId($getProductsFromOrderIdRequest)];
} catch(\SoapFault $e){
echo $e->getMessage();
return false;
}
// создаём сервер в зависимости от конфигурации
foreach($products as $product) createRuvdsServer($product);
return true;
}
function createRuvdsServer($product)
{
// код создания сервера через RUVDS White-Label Api и ожидания завершения процесса
}
$orders = getCompleteOrders();
if (!$orders || count($orders)==0) return 1;
foreach ($orders as $order)
{
$orderId=$order->Order->id;
$res = processPayedOrder($orderId);
if(!$res) echo 'Processing order with id '.$orderId.' failed!';
}
Далее с помощью любого планировщика задач, например cron, настраиваем запуск этого скрипта с необходимой периодичностью.
Итоги
В целом, связка Joomla 3 + Virtuemart 3 выглядит как достаточно функциональный и мощный инструмент в качестве основы для организации вашего VPS-хостинга. Сразу «из коробки» доступно множество настроек всего, что только можно представить. Но требуется ли это при перепродаже, скажем, 3-10 популярных конфигураций виртуальных серверов?
В следующей статье мы рассмотрим CMS Drupal и одно из её самых популярных eCommerce-расширений, и, возможно, новая CMS больше подойдёт вам для этой задачи. До новых встреч!
Поделиться с друзьями