Эта небольшая статья родилась как обсуждение в одном из профильных чатов по Joomla. В ней рассказывается о плюсах и минусах компонента интернет-магазина для Joomla – Virtuemart.
Я работаю с Virtuemart постоянно, а потому могу дать ответы на частые вопросы по нему, а также опровергнуть некоторые распространенные заблуждения.
Если вы рассматриваете выбираете компонент интернет-магазина под Joomla, то данная заметка может оказаться полезной.
Содержание
Virtuemart имеет свои минусы, это несомненно. Его код сложен для понимания, это тоже факт. Но есть и некоторые плюсы, которыми могут похвастаться далеко не все аналоги:
Virtuemart полностью бесплатный
Как Joomla. Там нет никаких хитрых лицензий вроде "нельзя удалять копирайт". Берете и делайте с ним что угодно. Ну или почти =). Код Virtuemart полностью открыт.
Очень широкий функционал из коробки
Который, правда, периодически требует напильника. Многие ли аналоги могут похвастаться своими менеджером доп.полей, интегрированным с товарами, и менеджером пользовательских полей для корзины и кабинета? А еще:
- Дочерние товары (в том числе, учитывающие остатки)
- Настраиваемые поля разных типов
- Поля-атрибуты корзины (влияющие на стоимость)
- Мультивариант (возможность продавать, например, обувь, где у одного товара будет несколько разных цветов и несколько разных размеров, по каждому сочетанию которых будут контролироваться остатки и доступность будет отображаться в реальном времени)
- Менеджер статусов заказов
- Менеджер отзывов
- Налоговые правила
- Группы покупателей
- Мультицены товаров в зависимости от групп или количества, которые работают совместно с налоговыми правилами
- Минимальная сумма заказа
- Менеждеры оплаты и доставки, с возможностью использовать сторонние плагины
- Менеджер производителей
- Купоны
- Медиа-менеджер
- Мультивалютность
- …и многое другое
Есть и упущения по функционалу
Которые компенсируются парой сторонних расширений.
Я бы здесь выделил безусловно фильтр и еще корзину (если нужна одностраничная).
Фильтр хороший, по сути, один. CF PRO. У него нет привязки к домену а также есть шикарный функционал - например, динамически скрывать опции, которые приведут к пустым результатам отбора. Все работает по AJAX.
Стандартная корзина рабочая, но слегка странная. Пользоваться ей можно, но не удобно, на мой личный взгляд. Есть несколько хороших сторонних одностраничных корзин. Выбрать есть из чего. Также у меня есть своя одностраничная корзина для Virtuemart, которая может быть модифицирована под любые задачи (разные примеры ее оформления и функционала можно посмотреть в портфолио).
Весь остальной основной функционал интернет-магазина покрывают возможности из коробки.
Бесплатные плагины оплаты и доставки
Также хочу отметить большое количество плагинов оплаты и доставки (бесплатные плагины оплаты есть для экваеринга всех ведущих банков - Сбер, Альфа, Тинькофф - эти точно есть в свободном доступе).
Для разработчиков
Отсутствие триггеров плагинов - ложь! Их несколько десятков (ниже приведу). Есть даже такие, которые способны влиять на выдачу товаров, поиск, сортировку. Есть для корзины, есть для кабинета, есть для смены статуса заказа. Но вот что будет верно - документация по ним ОЧЕНЬ скудная - нужно разбираться в коде.
Функционал в коробке очень широкий. И именно из-за этого возникают сложности по коду и многие пишут, что код там очень запутанный (отчасти это правда, но далеко не всегда).
Также вы можете:
- Переопределить почти что угодно,
- Использовать подмакеты (аналог layout'ов Joomla)
- Делать модули, которые с легкостью выбирают нужные объекты товаров по ID и другим признакам (можно посмотреть класс товара в VM)
- Можете влиять на стоимость товаров в зависимости от категории, группы и др. налоговыми правилами - несколькими сразу,
- Можете влиять на стоимость товара количеством его штук в корзине.
База данных Virtuemart построена достаточно разумно. В отдельных таблицах хранятся:
- Товары
- Категории
- Языковые версии товаров и категорий
- Цены
- Настраиваемые поля
- Медиа
- Налоговые правила
- Производители
- Группы покупателей
- Купоны
- Валюты
- Статусы заказов
- Заказы
- Способы оплаты
- Способы доставки
- Рейтинги
- Отзывы
- Голоса за товары
- Поля, заполняемые пользователями
К чему это? Такой тип хранения позволяет реализовать функционал, связывающий одну запись таблицы 1 с несколькими записями других таблиц. К примеру, у одного товара может быть несколько разных цен (в зависимости от количества и др.), несколько категорий, производителей, несколько налоговых правил, множество настраиваемых полей, изображений, и т.д.
Такой подход к организации хранения данных делает сложнее выборки (по сравнению с выборками из одной таблицы здесь постоянно приходится использовать JOIN’ы или другие инструменты SQL для выборки из связанных таблиц), но зато существенно расширяет функциональные возможности.
Sublayouts очень удобны для формирования мини-блоков. У меня они всегда формируют мини-карточки, цены, блок добавления в корзину. Вызывается в одну строчку, в него можно передать, например, массив товаров, количество товаров в строке, отображать ли цену и др. Фактически, на все разделы магазина есть всего один макет, который управляет всеми мини-карточками.
По нагрузке
Широкий функционал дает бОльшую нагрузку. Это логично. В целом я бы не назвал Virtumart слишком прожорливым и требовательным к ресурсам. Потребности малого бизнеса (посещаемость до 10 тыс. в сутки) он покроет легко. Десятки тысяч товаров, сотни тысяч значений настраиваемых полей – всё это работает. Также кешируются тяжелые запросы и некоторые наборы данных.
Скорее всего ваш бизнес попадет в те 99%, которым VM хватит за глаза. Если нет, это уже история про свой собственный движок и команду разработки.
Ну и нужно сказать, чего VM не может
За все время работы я столкнулся только с двумя серьезными ограничениями:
- Фасовки. VM не умеет в дробное количество товара, добавляемого в корзину. Можно продавать только штуками, но не на вес, например.
- Мультисклад. Его нет. Есть возможность добавлять нескольких продавцов, что, по идее, можно было бы использовать как мультисклад (только что пришло в голову =)), но это костыль.
В остальном же VM хорош. Если вы можете программировать на уровне "сам делаю модули", то сможете удовлетворить на нем почти любую хотелку – свою или заказчика.
Все это про VM3. VM4 пока, к сожалению, довольно забагован. Ошибки исправляют, но не так быстро, как хотелось бы. Такие дела... Ниже обещанный список триггеров для плагинов (инфо устарело и сейчас их даже несколько больше):
//admin
- plgVmBuildTabs
- plgVmOnUpdateOrderBEPayment
- plgVmOnUpdateOrderBEShipment
- plgVmOnShowOrderLineBEShipment
- plgVmOnUpdateOrderBEShopper
- plgVmOnUserStore
- plgVmAfterUserStore
//calc
- plgVmGetPluginInternalDataCalc
- plgVmGetPluginInternalDataCalcList
- plgVmOnStoreInstallPluginTable
- plgVmDeleteCalculationRow
- plgVmInGatherEffectRulesProduct
- plgVmInGatherEffectRulesBill
- plgVmInterpreteMathOp
- plgVmOnDisplayEdit
- plgVmAddMathOp
//not specific
- plgVmCalculateDisplayedCartOptions
- plgVmOnCheckAutomaticSelected
- plgVmOnViewCartModule
- plgVmOnViewCart
- plgVmDisplayInOrder
- plgVmConfirmedOrder
- plgVmOnSelfCallBE (type passed)
- plgVmOnSelfCallFE (type passed)
- plgVmAfterUserStore
//coupon
- plgVmCouponHandler
- plgVmCouponUpdateOrderStatus
- plgVmValidateCouponCode
- plgVmRemoveCoupon
- plgVmCouponInUse
//custom
- plgVmOnAddToCartFilter
- plgVmOnRemoveFromCart
- plgVmOnCheckoutCheckStock
- plgVmDeclarePluginParamsCustomVM3
- plgVmOnStoreInstallPluginTable
- plgVmGetTablePluginParams
- plgVmOnDisplayProductFEVM3
- plgVmOnProductEdit
- plgVmPrepareCartProduct
- plgVmOnStoreProduct
- plgVmGetProductStockToUpdateByCustom
- plgVmBeforeProductSearch
- plgVmCloneProduct
- plgVmOnDeleteProduct
- plgVmOnDisplayEdit
- plgVmSelectSearchableCustom
//shipment
- plgVmOnSelectedCalculatePriceShipment
- plgVmOnSelectCheckShipment
- plgVmOnCheckoutCheckDataShipment
- plgVmOnShowOrderBEShipment
- plgVmOnUpdateOrderShipment
- plgVmOnShowOrderFEShipment
- plgVmOnUpdateOrderLineShipment
- plgVmDeclarePluginParamsShipmentVM3
- plgVmSetOnTablePluginParamsShipment
- plgVmSetOnTablePluginShipment
- plgVmOnStoreInstallShipmentPluginTable
- plgVmShipmentWeight_countries (in migration script)
- plgVmDisplayListFEShipment
- plgVmOnProductDisplayShipment
- plgVmOnShipmentResponseReceived
//payment
- plgVmonSelectedCalculatePricePayment
- plgVmOnSelectCheckPayment
- plgVmOnCheckoutCheckDataPayment
- plgVmgetPaymentCurrency
- plgVmDisplayLogin
- plgVmOnShowOrderBEPayment
- plgVmOnUpdateOrderPayment
- plgVmOnCancelPayment
- plgVmOnShowOrderFEPayment
- plgVmOnUpdateOrderLinePayment
- plgVmDeclarePluginParamsPaymentVM3
- plgVmSetOnTablePluginParamsPayment
- plgVmSetOnTablePluginPayment
- plgVmOnStoreInstallPaymentPluginTable
- plgVmPaymentStandard (in migration script)
- plgVmDisplayListFEPayment
- plgVmgetEmailCurrency
- plgVmOnProductDisplayPayment
- plgVmOnPaymentResponseReceived
- plgVmOnUserPaymentCancel
- plgVmOnPaymentNotification
//calc, payment, shipment, custom
- plgVmConfirmedOrder
//shipment, payment, extend, userfield, coupon
- plgVmOnCheckoutAdvertise
//userfield
- plgVmInitialise
- plgVmPrepareUserfieldDataSave
- plgVmDeclarePluginParamsUserfieldVM3
- plgVmOnBeforeUserfieldSave
- plgVmOnStoreInstallPluginTable
- plgVmOnGetUserfields
- plgVmOnUserfieldDisplay
//shopper, extended
- plgVmOnUserOrder
- plgVmOnUserStore
//shopper, payment, extended
- plgVmOnUserInvoice
//system, userfield, extended
- plgVmOnAskQuestion
//extended, userfield
- plgVmOnBeforeUserfieldDataSave
//vendor
- plgVmOnVendorStore
- plgVmAfterVendorStore
Теперь только на вас надежда )))
Знаком с VM еще версии 1) Вот были времена! Хорошее решение, вот только жаль, что для новичков(а может и не только) на первый взгляд VM сейчас выглядит совсем не дружелюбно)
Спасибо что пишете! Здоровья и вдохновения!
https://wedal.ru/forum/virtuemart-3/6222-nastraivaemye-polya.html
Ещё неудобно что до сих пор из коробки нет переключения цветов -> фото в карточке товара
Не совсем так. Это можно делать через функционал дочерних товаров, правда цвета по умолчанию будут отображаться текстом, хотя и это поправимо.
Или, может быть посоветует иное решение?