Магазин на OpenCart рідко ламається одним днем. Спершу купується тема, потім модуль доставки, потім фід для маркетплейсу, далі хтось дописує правку в кошик. Через кілька років власник уже не може сказати, що в його рушії штатне, а що прикручене зверху. При оновленні OpenCart чи модуля такі доробки доводиться перевіряти й часто переписувати.
Ця стаття для тих, хто вже на OpenCart або вибирає його. Тут немає огляду того, що видно ззовні у 43 магазинах на трьох платформах, — він є окремо в статті «Prom, Хорошоп чи OpenCart». Тут — перевірка самого ядра: чотири місця, де каталог найчастіше впирається в архітектуру, і як кожне з них перевірити у своєму магазині без розробника.
Що OpenCart дає з коробки, і чого не треба шукати в модулях
Почнемо з того, що часто купують даремно. Гуртові ціни в простому вигляді в ядрі вже є: на вкладці Discount у картці товару задається ціна для групи клієнтів, мінімальна кількість, пріоритет і дати дії. У базі це окрема таблиця oc_product_discount з полями групи, кількості, пріоритету, ціни й дат. Якщо ваш гурт — це «дилер від 10 штук платить менше», модуль для цього не потрібен.
Так само штатно в картці є поля Model і SKU, кількість на складі та перемикач Subtract Stock, тобто чи списувати залишок при замовленні. У значень опцій товару є власна кількість і своя надбавка до ціни.
Тепер про те, де штатного вже не вистачає.
Коли шаблону й модулів OpenCart уже замало: чотири перевірки
Далі — чотири ознаки, кожну можна перевірити у своїй адмінці.
Кілька складів, а кількість одна
Візьміть позицію, яка лежить у двох місцях, і спробуйте з адмінки сказати, скільки її на кожному. Поле Quantity у картці одне, і це не обмеження інтерфейсу: і в гілці 3.0, і в 4.1 кількість лежить одним цілим числом у таблиці товару, поруч з однією ціною. Таблиці складів у штатній схемі немає.
Якщо розбивка живе в таблиці менеджера, ви вже на межі: усе, що читає штатне поле кількості, бачить одне число. Чому одна ціна ламається з другим складом і різною закупкою, ми розібрали в статті «Кілька складів — одна ціна товару не працює».
Гурт, якому замало групи й кількості
Штатна знижка знає дві речі: групу клієнта й кількість. Межа проходить там, де ціна починає залежати від чогось третього. Найчастіше це склад, з якого відвантажують, або персональна домовленість з конкретним покупцем на конкретну позицію. Ще одна типова вимога — мінімальна сума замовлення для гурту.
Попросіть менеджера записати, як він насправді рахує ціну для найскладнішого постійного клієнта. Вмістилося в рядок «група плюс кількість» — ядро впорається. З'явилося «але з цього складу» чи «а цьому клієнту на цей бренд окремо» — таку логіку доводиться дописувати патчами в розрахунок ціни, і вони можуть конфліктувати з іншими модулями, що правлять те саме місце.
Залишок змінився, і ніхто не знає чому
Учора в картці було 12, сьогодні 9. Хто й коли змінив число? У штатній схемі 3.0 є таблиці історії для замовлень, клієнтів, купонів, сертифікатів і повернень. Таблиці рухів залишку немає. Кількість у картці просто перезаписується — замовленням, імпортом чи рукою менеджера, і попереднє значення ніде не лишається.
Якщо без логів сервера й розпитувань відповіді не знайти, складського обліку у вас немає — є лише поточна цифра.
Для гілки 3.0 є ще одна перевірка. Відкрийте базу в phpMyAdmin і подивіться колонку Engine у списку таблиць. Штатний інсталятор 3.0.5.1 створює 132 таблиці зі 134 на MyISAM, а цей рушій, за документацією MySQL, транзакцій не підтримує. Тобто кілька пов'язаних записів одного замовлення не можна ні виконати разом, ні разом відкотити, якщо посередині щось пішло не так. У гілці 4.1 інсталятор уже ставить InnoDB. Переведення таблиць на InnoDB зазвичай можна зробити без зміни платформи, але його варто перевірити на копії бази; журналу рухів воно не додасть.
Пошук не знаходить артикул
Для магазинів запчастин, інструменту й будь-якого гурту це найдорожча ознака, бо покупець приходить з артикулом у буфері обміну.
Ось як шукає штатний OpenCart (ми читали код моделі каталогу в гілках 3.0 і 4.1). Назва розбивається на слова, і кожне слово шукається входженням. Модель і в 3.0, і в 4.1 порівнюється з запитом цілком, без урахування регістру. SKU, EAN та інші коди в 3.0 теж порівнюються цілком, а в 4.1 — за початком рядка.
Тож якщо артикула AB-1234 немає в назві товару, запити AB 1234, ab1234 чи 1234 у пошуку вітрини здебільшого повернуть порожню сторінку — спробуйте на своєму каталозі, це дві хвилини. Покупець не знає, як саме у вас записаний код, і йде туди, де знайшло.
Що лікується, не міняючи OpenCart
Типові діри, які ми знаходили у вимірі ринку, лежать не в ядрі. Повільна відповідь сервера, застаріла версія PHP, карта сайту з дублями, відсутній canonical — усе це виправляється на тому самому рушії, докладно — у вимірі технічної бази ринку.
Гуртові рівні в межах «група плюс кількість» закриваються вкладкою Discount. Таблиці переводяться на InnoDB. Новий шаблон міняє вигляд вітрини. Якщо ваші болі тут, міняти платформу не треба, і ми скажемо це першим листом. Пошук по артикулу — пограничний випадок: його переробляють і на OpenCart, але це вже доробка ядра пошуку, а не налаштування.
Що не лікується патчами
Межа — не одна ознака, а їхній збіг. Коли від складу залежить ціна, а замовлення доводиться розбивати між складами й вести журнал рухів залишку, це вже модель даних, і функцією її не додаси. Її доводиться вбудовувати в ядро чужого рушія, і при оновленні OpenCart чи модуля її доводиться перевіряти й часто переписувати.
Під цей випадок ми робимо Stable Shop — власний рушій LIONEX на Laravel. У ядрі там один артикул лежить на кількох складах, і в кожного своя ціна, залишок і термін доставки, а замовлення розбивається автоматично. Групи клієнтів мають кілька рівнів гурту, персональні ціни на позицію й мінімальні суми замовлення. Кожен рух залишку записується окремим рядком з автором і часом, операції йдуть у транзакціях з блокуванням рядка. Пошук працює на Meilisearch з лематизацією української, і артикул знаходиться з пробілами, дефісами й крапками. Код і дані лишаються на вашому сервері.
Чого там ще немає, кажемо так само прямо: імпорту з OpenCart поки немає, резервування товару з таймером у кошику немає, Rozetka Delivery і Meest поки заглушки, а магазин розширень для сторонніх розробників ще в розробці. Продукт зараз на етапі підготовки запуску. Детальніше — на картці Stable Shop і сторінці магазину на власній платформі.
Коли OpenCart лишається правильним вибором
Коли задача типова: під неї вже є готовий модуль, і його дешевше поставити, ніж написати. Якщо склад один, а ціни вміщаються в групу й кількість, опенкарт робить свою роботу, і переписування рушія коштувало б більше, ніж дасть. Ми переважно працюємо з OpenCart і розробку на ньому продовжуємо робити.
Якщо після чотирьох перевірок у вас дві-три ознаки збіглися, надішліть адресу магазину й опис того, як рахуються ціни й залишки. Безкоштовний розбір каталогу покаже, що можна вилікувати на поточному рушії, а що впирається в ядро. Відповідаємо протягом двох годин, а сума, якщо дійде до роботи, фіксується в договорі після розбору.