5 копеек про Virtuemart

Эта небольшая статья родилась как обсуждение в одном из профильных чатов по 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 не может

За все время работы я столкнулся только с двумя серьезными ограничениями:

  1. Фасовки. VM не умеет в дробное количество товара, добавляемого в корзину. Можно продавать только штуками, но не на вес, например.
  2. Мультисклад. Его нет. Есть возможность добавлять нескольких продавцов, что, по идее, можно было бы использовать как мультисклад (только что пришло в голову =)), но это костыль.

В остальном же 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
Об авторе
Об авторе
Wedal (Виталий). Веб-разработчик полного цикла (Full Stack). Создатель и автор сайта Wedal.ru.
Основной профиль – создание сайтов и расширений на CMS Joomla.
Ваша оценка материала очень важна. Прошу вас оценить статью или оставить отзыв в комментариях.

Добавить комментарий

Для отправки комментария введите код с картинки:
Защитный код
Обновить

Комментарии  

0 # Guest 09.10.2022 09:13
да... был хороший сайт по вирутмарту в зоне .su=, а теперь не стало.
Теперь только на вас надежда )))
Ответить | Ответить с цитатой | Цитировать
-1 # Wedal 10.10.2022 07:23
Пока сайт только заблокирован. Может быть еще будет работать. Пока берите информацию здесь. Также можно всегда задавать вопросы на форуме, в соотвествующих разделах по Virtuemart.
Ответить | Ответить с цитатой | Цитировать
+1 # Guest 08.11.2022 05:13
сайт заработал
Ответить | Ответить с цитатой | Цитировать
0 # spro1 28.10.2022 14:00
Виталий, приветствую! Спасибо за статью! Всегда очень приятно зайти на ваш сайт и почитать что-то новенькое! Хоть сейчас и реже пишете.
Знаком с VM еще версии 1) Вот были времена! Хорошее решение, вот только жаль, что для новичков(а может и не только) на первый взгляд VM сейчас выглядит совсем не дружелюбно)
Спасибо что пишете! Здоровья и вдохновения!
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 31.10.2022 07:42
spro1, да в VM интерфейс не самый приятный на первый взгляд. Но к нему через какое-то время привыкаешь и становится сложно представить, как бы это могло выглядеть, используй они стандартный интерфейс шаблона той же Joomla4. Карточка товара содержит довольно много настроек и вкладок. Сейчас там все заточено под работу через компьютер и, соотвественно, интерфейс довольно мелкий. При работе через ПК это удобнее, чем туча больших кнопок и вертикальный скролл. Но однозначно, там есть над чем работать.
Ответить | Ответить с цитатой | Цитировать
0 # Василий 26.12.2022 18:13
Подскажите, как можно сделать настраиваемое поле строка обязательно для выбора тоесть пока клиент не выберит например размер не сможет положить товар в корзину
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 27.12.2022 08:49
Василий, ответил на форуме:
https://wedal.ru/forum/virtuemart-3/6222-nastraivaemye-polya.html
Ответить | Ответить с цитатой | Цитировать
0 # Алексей 12.01.2023 11:20
Отличный материал, когда надоело каждому 2му доказывать почему разработка будет на VM

Ещё неудобно что до сих пор из коробки нет переключения цветов -> фото в карточке товара
Ответить | Ответить с цитатой | Цитировать
+1 # Wedal 16.01.2023 05:36
Алексей,
Цитата:
Ещё неудобно что до сих пор из коробки нет переключения цветов -> фото в карточке товара
Не совсем так. Это можно делать через функционал дочерних товаров, правда цвета по умолчанию будут отображаться текстом, хотя и это поправимо.
Ответить | Ответить с цитатой | Цитировать
0 # Aleksander 04.07.2023 08:19
Цитирую Алексей:
Отличный материал, когда надоело каждому 2му доказывать почему разработка будет на VM
Ещё неудобно что до сих пор из коробки нет переключения цветов -> фото в карточке товара

Никому не нужно ничего доказывать. И кстати на Джумшопинге в разы лучше. Я пользуюсь Виртуемартом тоже.
Но в Джумшопинге как раз есть переключение цветов. А с мультиязычностю в Виртуемарте не комильфо. А если использовать товары с мультиваринтом, так вобще беда. Мультиязычности нет.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 05.07.2023 07:22
Aleksander, вы пишите, что никому ничего не нужно доказывать и тут же пытаетесь что-то доказать).

Мультиязычность в VM есть. Но я всегда и всем говорю - не связывайтесь с ней. Использование мультиязычности даже в чистой Joomla усложняет процесс создания сайта в несколько раз. Здесь у меня большой опыт. Редкий заказчик потянет поддержку сайта с мультиязычностью.

Если же у вас интернет-магазин, то там вообще "тушите свет". Вопросов появляется очень много. Плюс создание каждой карточки товара на своем языке, плюс разные валюты, письма, и др. Гораздо проще использовать один язык или сделать под каждый язык свой отдельный сайт, а если никак не обойтись без перевода, то есть модуль переводчика, который в автоматическом режиме переводит страницы сайта целиком - да, там будет ниже качество перевода, но в целом читаемо, зато с поддержкой сайта проблем меньше в разы. Как-то так.

А насчет JS'оппенга - есть ли там вообще аналог мультиварианта? Т.е набор взаимозависимых параметров, учитывающий остатки по каждой отдельной зависимости.
Ответить | Ответить с цитатой | Цитировать
0 # Aleksander 03.07.2023 14:33
Может подскажете как решить проблему мультиварианта и мультиязычности.
У товара мультивариант (цвет+размер). При создании дочерних товаров делаю мультивариант, где создаю варианты размера и цвета.
Проблем в том, что языковые константы не срабатывают. На сайте выводятся конкретные названия, которые прописаны в вариантах.
Ответить | Ответить с цитатой | Цитировать
+1 # Wedal 05.07.2023 07:15
Aleksander, если вы пишите в вариантах названия на одном языке, почему должны срабатывать языковые константы? Для констант вы должны создать в поле значения по умолчанию в виде оных и потом использовать их. Но, честно говоря, не уверен, что все сработает так просто. Я не пробовал применять мультиязычность в мультиварианте. Никогда не было такой необходимости.
Ответить | Ответить с цитатой | Цитировать
0 # Guest 06.07.2023 13:56
Цитирую Wedal:
Aleksander, вы пишите, что никому ничего не нужно доказывать и тут же пытаетесь что-то доказать).

Мультиязычность в VM есть. Но я всегда и всем говорю - не связывайтесь с ней. Использование мультиязычности даже в чистой Joomla усложняет процесс создания сайта в несколько раз. Здесь у меня большой опыт. Редкий заказчик потянет поддержку сайта с мультиязычностью.

Если же у вас интернет-магазин, то там вообще "тушите свет". Вопросов появляется очень много. Плюс создание каждой карточки товара на своем языке, плюс разные валюты, письма, и др. Гораздо проще использовать один язык или сделать под каждый язык свой отдельный сайт, а если никак не обойтись без перевода, то есть модуль переводчика, который в автоматическом режиме переводит страницы сайта целиком - да, там будет ниже качество перевода, но в целом читаемо, зато с поддержкой сайта проблем меньше в разы. Как-то так.

А насчет JS'оппенга - есть ли там вообще аналог мультиварианта? Т.е набор взаимозависимых параметров, учитывающий остатки по каждой отдельной зависимости.

Я не пытаюсь с вами спорить по поводу строения сайтов...
В Джумшопинге мультиязычность работает на Отлично. Там даже с атрибутами работать проще. Особенно набор взаимозависимых параметров. Только не перекручивайте мои слова, что я пытаюсь хейтить Виртуемарт. Он тоже по своему хорош.
И ещё в Джумшопинге понравился нюанс при мультиязычности. В карточке товара, при переключении языка, вы остаётесь в карточке данного товара. Виртуемарт же перекидывает в категорию. Мелочи конечно, но всё же.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 07.07.2023 06:38
Aleksander, если вас устраивает мультиязычность в JS и он проще/понятнее для вас, то нужно использовать его. Тут нечего доказывать. Каждый берет инструмент, который ему удобнее. Но в целом по мультиязычности для магазинов, независимо от компонента, я описал выше. Пока вы изучаете ее на уровне категория/товар все будет хорошо, но чем дальше будете углубляться в особенности работы магазина, тем больше будет появляться проблем.
Ответить | Ответить с цитатой | Цитировать
-1 # Guest 06.07.2023 13:58
Цитирую Wedal:
Aleksander, если вы пишите в вариантах названия на одном языке, почему должны срабатывать языковые константы? Для констант вы должны создать в поле значения по умолчанию в виде оных и потом использовать их. Но, честно говоря, не уверен, что все сработает так просто. Я не пробовал применять мультиязычность в мультиварианте. Никогда не было такой необходимости.

Фото сделано для примера, чтобы понять где это. Я пробовал писать языковые константы, которые в карточке на сайте так и отображались без перевода.
Ответить | Ответить с цитатой | Цитировать