Здравствуйте, уважаемые читатели хабра. Данный материал является продолжением цикла статей о том, как построить 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 больше подойдёт вам для этой задачи. До новых встреч!
Поделиться с друзьями
-->

Комментарии (0)