CartiX
Снимки экрана скоро появятся.
Подробное описание ещё готовится.
Тема «Базовая» (default)
Референс-структура темы витрины CartiX (Smarty 5, шаблоны .html).
Структура
themes/default/
├── theme.json # манифест: имя, версия, СХЕМА настроек
├── theme.png # превью для галереи тем
├── templates/ # Smarty-шаблоны страниц
│ ├── layout.html # каркас (наследуется всеми через {extends})
│ ├── home.html # главная
│ ├── category.html # листинг категории
│ ├── product.html # карточка товара
│ ├── list.html # страница списка товаров (is_page)
│ ├── brand.html # страница бренда
│ ├── tag.html # страница тега
│ ├── page.html # CMS-страница
│ ├── search.html # результаты поиска
│ ├── cart.html # корзина (этап 3)
│ ├── checkout.html # чекаут (этап 3)
│ ├── partials/ # переиспользуемые куски
│ │ ├── header.html footer.html product-card.html
│ │ ├── breadcrumbs.html pagination.html filters.html
│ │ └── (sort-bar, sku-options, services, product-features …)
│ └── blocks/ # контент-блоки
│ ├── hero.html
│ └── product-list.html # вывод подборки (getList)
├── assets/ # статика темы
│ ├── css/theme.css
│ ├── js/theme.js
│ ├── images/
│ └── fonts/
└── locale/ # переводы строк темы
├── ru.json uk.json en.json
Ключевые механизмы
- Клонирование: тема копируется целиком в новую папку (полная независимая копия, без наследования). Правки клона ни на что не влияют; обновления базовой темы в клон не переносятся — это самостоятельная тема.
- Настройки (schema-driven): описаны в
theme.json → settings.groups, редактор строит форму автоматически. Значения хранятся per-витрина, попадают в шаблоны как$theme.*. - Функции тем:
{url},{trans},{money}(готовы),{getList}(вывод подборок),{hook}(точки расширения для плагинов — работают нативно на Smarty). - Данные: контроллер витрины собирает контекст (товар/категория/список/фильтры) и передаёт в шаблон. Логику в шаблонах не пишем — только вывод.
- Безопасность: песочница Smarty (без
{php}, автоэкранирование HTML).
Точки расширения (hooks)
storefront.head, storefront.body.start/end, header.end, footer.*,
home.after.lists, product.after.buy, product.bottom, product.card.footer,
catalog.filters.end, checkout.fields. Плагин подписывается — вставляет свой HTML.
Выбранные заказы видно всегда
В окне «На несколько заказов» отметки переживают листание и смену фильтра — так и собирают пачку. Но стоило сменить статус, и отмеченные заказы уходили с экрана: печаталось больше, чем было видно.
Теперь выбранные заказы показаны строкой над списком. Каждый убирается нажатием, рядом — «Снять все».
Выбор заказов для дополнений
Окно «На несколько заказов», которым магазин печатает бланки пачкой, теперь могут открывать и дополнения. Кнопка дополнения в заказе спрашивает, по каким заказам работать: тот заказ, из которого её нажали, отмечен сразу, к нему добавляются остальные. Такие кнопки появились и в шапке списка заказов, рядом с печатью бланков.
Первым этим пользуется дополнение «Ценники и этикетки»: наклейки на дневную отгрузку печатаются одной пачкой. В выборе видны только те заказы, которые сотруднику доступны.
Штрихкод товара и основа для печати этикеток
У каждого варианта товара появилось поле «Штрихкод» — раньше код с упаковки хранить было негде. По нему товар находится поиском наравне с артикулом: достаточно поднести сканер.
В магазин заложена основа для печати ярлыков и этикеток: каталог и карточка товара теперь умеют показывать кнопки дополнений. Сама печать появляется вместе с дополнением «Ценники и этикетки» — оно устанавливается отдельно из маркетплейса.
Вариант товара подписан так, как его назвал магазин
Если у товара несколько артикулов без опций покупки, переключатель вариантов теперь подписан их названиями («чёрный», «белый») — так, как их назвал владелец магазина. Раньше при заведённой числовой характеристике артикула подписи молча заменялись на её значения («275 г», «290 г»). Характеристика подставляется только там, где названий у артикулов нет.
Характеристики артикула и выбор варианта в карточке
Характеристику теперь можно задать не только товару, но и каждому артикулу — число, текст, дату или «да/нет». Раньше флаг «задать значения для артикулов» работал только для характеристик со списком значений: числовую с ним магазин сохранял, но задать её артикулу было негде.
Товар с несколькими артикулами, которые не различаются опциями покупки, теперь даёт покупателю выбор: переключатель собирается по числовой характеристике артикула («10 таблеток» / «30 таблеток»), а если её нет — по названиям артикулов. Раньше выбора не было вовсе и товар всегда продавался основным артикулом. Собственные характеристики артикула видны в карточке и меняются вместе с выбранным вариантом.
Баллы видны там, где на них смотрят
В карточке заказа появилась строка «Оплачено баллами» — раньше менеджер видел итог и не понимал, из чего он сложился. В карточке покупателя теперь есть счёт: остаток, история движений со ссылками на заказы и сроками сгорания, а также начисление и списание вручную — за задержку, за отзыв, в качестве извинения. Каждое такое движение подписано сотрудником.
Оформление заказа
Набранная покупателем сумма баллов сразу пересчитывает заказ, а не только кнопка «Все». Обе правки — из живой проверки: поле принимало число, а сумма оставалась прежней.
Бонусные баллы покупателей
У покупателя появился бонусный счёт: он видит остаток и историю в кабинете и оплачивает баллами часть заказа прямо в оформлении. Списанное показано отдельной строкой в итогах, а отменённый заказ возвращает баллы обратно.
Сколько начислять и сколько разрешать тратить — задаёт дополнение «Бонусы и лояльность». Магазин же следит за тем, чтобы баллами нельзя было заплатить больше, чем их есть, и чтобы сумма заказа сходилась до копейки.
Мелочи
Журнал заказа больше не подписывает сотрудником действие покупателя.
Уведомления в браузере и магазин на телефоне
Магазин получил бесплатный канал связи: покупатель один раз разрешает уведомления и узнаёт о заказе, поступлении товара и скидке даже с закрытым сайтом. Уведомления встают рядом с почтой и SMS — те же события, те же тексты, тот же журнал — и ими же можно сделать рассылку.
Тем же дополнением витрина становится приложением: покупатель ставит магазин на главный экран телефона.
Рассылка больше не врёт об успехе
Рассылка, у которой канал недоступен, честно останавливается с объяснением. Раньше она помечалась отправленной, не отправив ни одного сообщения. Установка дополнения теперь сама перезапускает обработчик задач — новый канал работает сразу, а не после перезапуска сервера.
Помощник отвечает на частые вопросы
Вы задаёте слова покупателя и готовый ответ — магазин отвечает сам, показывает подходящие товары или зовёт менеджера. В переписке видно, что отвечал не человек, поэтому менеджер не повторяет одно и то же.
Заказ прямо из переписки
Покупатель перечисляет коды товаров — магазин узнаёт их с количествами и предлагает положить всё сразу, а менеджеру открывает форму заказа с готовым составом.
Видно, что покупатель уже выбрал
В карточке собеседника показано содержимое его корзины — вместе с самим вопросом, а не после него. Половина вопросов в чате именно о том, что человек уже положил.
Видно, с кем говоришь
Вместе с вопросом приходит карточка собеседника: узнанный покупатель — с телефоном и покупками, гость — со страницей, устройством и тем, откуда пришёл. Отвечать можно обычным сообщением, «ответить» больше не требуется.
Вопрос с сайта приходит в Telegram
Сообщение покупателя из чата на сайте дублируется отвечающему в Telegram, а его ответ возвращается покупателю. Отвечать можно с телефона, не заходя в магазин.
Разделы админки стали одинаковыми
Шапка раздела, кнопки, панели и вкладки теперь выглядят и работают одинаково везде. Раньше каждый экран верстался отдельно, и разделы понемногу разъезжались между собой.
Разделы дополнений — «Заявки на звонок», «Уведомления о поступлении», «Короткие ссылки» — приведены к тому же виду: содержимое лежит в карточке раздела, отбор по состоянию переехал в левую панель со счётчиками.
Поиск товаров в админке ищет как на витрине
Раньше подбор товара в заказе искал по-своему — строго по совпадению названия. Менеджер не находил того, что покупатель на витрине находил.
Теперь во всех местах, где выбирают товар — состав заказа, аксессуары, подборки, подарки, скидки, акции, рассылки — работает тот же поиск и те же настройки, что у покупателя: синонимы, неправильная раскладка, латиница и кириллица, порядок по важности. В подсказках появились фотографии товара. Точный артикул находится всегда, даже если артикулы убраны из поиска витрины.
Правка заказа переписана
- У правки появился свой адрес: ссылку можно дать коллеге, «назад» возвращает к просмотру.
- Из рабочего стола «Редактировать» открывает правку сразу — раньше приходилось нажимать кнопку второй раз уже в карточке.
- Слева покупатель, справа состав заказа, под ним доставка и оплата.
- Позиция занимает одну строку: количество, цена и сумма справа.
- Способ доставки выбирается списком, поля перевозчика подгружаются после выбора.
Мелочи, которые заметны
- Поля выбора больше не стоят пустыми без подсказки — по всей админке.
- У поля «Название магазина» появилось пояснение, где покупатель его увидит.
- Подсказка к имени списка товаров написана человеческим языком.
Повтор заказа
Менеджер открывает новый заказ с готовым составом прежнего — цены и наличие проверяются заново.
Подарки к заказу
Магазин умеет отдавать товар подарком: его цена не пересчитывается скидками и остаётся нулевой до самого оформления.
Товары в заказе — по складу
Позиции заказа сортируются так, как удобно собирать: по складу.
Уведомление на любой статус заказа
Письмо или сообщение покупателю можно привязать к любому статусу, включая ваши собственные.
Колонки товаров в вашем порядке
Порядок колонок в таблице товаров остаётся таким, каким вы его задали.
Заказ помнит нужные вам поля покупателя
Поля, которые вы настроили в оформлении, сохраняются в заказе и показываются менеджеру.
Установка и сброс не оставляют магазин без витрины
После установки и после сброса магазин остаётся рабочим: витрина, тема и настройки на месте.
Один покупатель — одна карточка. Телефон везде хранится в международном виде, поэтому «0671234567» и «+380671234567» больше не считаются разными людьми, а в поле телефона нельзя оставить что попало. Гостю с номером, на который уже есть личный кабинет, магазин предлагает войти вместо того, чтобы завести ещё одну карточку. Регистрация и вход через соцсеть подхватывают карточку человека, который раньше покупал гостем, а правка карточки в админке переносит телефон и почту в его кабинет. Накопленные дубли разбираются кнопкой «Найти дубли» в контактах: заказы, переписка и значения полей переезжают в выбранную карточку.
Названия статусов заказа теперь переводятся на языки магазина. Покупатель видит статус в личном кабинете и в письмах на своём языке, а названия для каждого языка задаются в разделе «Локализация → Статусы заказов». Существующие названия сохраняются как основной язык магазина.
Печать сразу на несколько заказов
Выделили заказы на рабочем столе — и печатаете накладные или бланки пачкой, а не по одному.
Акции со сроками снова включаются и выключаются сами: задача, которая за это отвечает, падала при каждом запуске, и закончившаяся акция продолжала действовать.
Письмо о восстановлении пароля переехало в раздел «Уведомления» — его текст, язык и канал теперь настраиваются как у остальных писем покупателю.
В настройках канала «E-mail» появился переключатель «Не проверять сертификат сервера»: он нужен, если почтовый сервер ваш собственный и сертификат выписан им самим.
Проверка почты в диагностике смотрит на настройки магазина, а не на файл конфигурации, и показывает ваш почтовый сервер.
Исправлена отправка проверочного письма из настроек канала: адрес получателя терялся при сохранении.
Ссылка на магазин выглядит опрятно
У раздела своя картинка для соцсетей, у страницы — своё описание: ссылка, которой поделились, показывает то, что нужно.
Оформление магазина под себя
Значок вкладки загружается прямо в настройках, а не вписывается адресом. Меню админки собирает владелец: свой состав пунктов, раздельные меню магазина и статей, верхнее меню в одну строку.
Исправлено: ссылка на заказ в личном кабинете покупателя вела на пустую страницу. Тема «Промо»: выровнено оформление — единый вид кнопок, одинаковая высота карточек товара, на телефоне ленты товаров листаются и видно, что их можно листать, заработала кнопка «Каталог» в нижней панели.
Реквизиты продавца стали профилями: если витрины торгуют от разных юрлиц, каждая печатает документы со своими данными, а при печати можно выбрать, от чьего имени выставить счёт. Живут они теперь во вкладке «Реквизиты» раздела «Печатные формы»; заполненное раньше переезжает само. Номер заказа: в магазине хранится сам номер, а приставка вроде «#100» добавляется при показе — поэтому перенесённые заказы тоже с ней, а формат можно поменять в любой момент. После переезда новые заказы продолжают нумерацию старого магазина. Счётчик у пункта «Заказы» считает те статусы, которые вы выберете в настройках заказов.
Исправлен перенос категорий: в прошлой версии они не переносились вовсе. Проверка связи с базой старого магазина больше не путает недоступную базу с чужой — причина отказа приходит от самого сервера базы и остаётся на экране. Значения характеристик и названия категорий и товаров приезжают заполненными на всех языках магазина, даже если старый магазин перевёл не всё. В рабочем столе заказов появились печатные формы и кнопки дополнений — раньше они были только в полной карточке заказа.
Переезд с другой платформы больше не зависит от планировщика: перенос идёт из окна магазина, порция за порцией, и две порции больше не наступают друг другу на пятки — от этого раньше терялись отдельные товары. Значения характеристик приезжают заполненными на всех языках магазина, даже если старый магазин перевёл только названия. Заказ теперь можно напечатать: счёт на оплату и расходная накладная, бланки правятся в разделе «Печатные формы». Дополнения научились добавлять свои кнопки и блоки прямо в карточку заказа.
Заказ теперь можно напечатать: счёт на оплату и расходная накладная. Бланки правятся под вашу бухгалтерию в разделе «Настройки → Печатные формы» — с предпросмотром на настоящем заказе и возвратом к заводскому виду. Реквизиты продавца задаются в «Настройки → Реквизиты». Связывание справочников при переезде стало понятнее: блоки свёрнуты, видно, что с чем свяжется, есть поиск и связывание совпадающих названий одним нажатием. Типы товаров в характеристике отмечаются списком.
Раздел «Инсталлер»: магазин дополнений и тем, всё установленное, обновления и установка из файла — теперь в одном месте. Обновление начинается сразу по кнопке и больше не ждёт расписания. Перед обновлением видно, готов ли к нему сервер, что из установленного может перестать работать и есть ли свежая резервная копия. Настройки установленных плагинов переехали в свой раздел «Плагины».
Обновление начинается сразу по кнопке, а не по расписанию, и показывает честный ход установки. Названия статусов старого магазина при переезде.
Две темы оформления со светлым и тёмным видом. Варианты покупки прямо в каталоге: покупатель выбирает цвет или объём памяти на карточке, меняются фото, цена и наличие. Доп-услуги товара доходят до корзины. Раздел «Акции»: страница акции со сроком и скидкой на подборку. Темы ставятся из маркетплейса. Исправлен переезд с Webasyst напрямую из базы.
Перенос заказов больше не останавливается на десятитысячном и не выдаёт себя за завершённый.
Старый магазин на части номеров отвечает неверно: на «заказы после 10000» отдаёт заказы с самого начала, а число записей выдумывает. Перенос этому верил, дальше пройти не мог и объявлял себя готовым — доезжало около 15% заказов. Теперь заказы забираются по счёту записей, каждая порция сверяется, а при неудаче перенос останавливается с причиной.
Названия вариантов покупки теперь переводятся. Раньше у товара, категории и характеристики перевод был, а у варианта («40 Вт», «Синій», «XL») — нет, и на магазине с несколькими языками карточка оставалась наполовину непереведённой.
Итоги покупок магазин досчитывает сам. Если очередь задач останавливалась, раздел «Покупатели» мог показать нули у всех — теперь недосчитанное чинится без вашего участия.
Резервные копии базы данных работают на хостингах, которые запрещают запуск вспомогательных программ. Раньше на таких копия не снималась и не восстанавливалась вовсе.
Диагностика показывает ограничения вашего хостинга и объясняет, что каждое из них меняет для магазина, — до того, как что-то сломается.
Кнопка «Открыть доступ к фотографиям» объясняет, что делать, вместо технической ошибки.
Перенос магазина с другой платформы, переданный серверу, больше не останавливается. Он не делал ни одного шага: счётчик замирал, а перенос числился идущим.
Перенос покупателей идёт заметно быстрее. Поиск уже заведённых людей перебирал всю базу контактов на каждого человека, и с каждой тысячей перенос замедлялся.
Кнопка «Остановить» у переноса теперь работает: раньше он сам продолжался через три минуты. А перенос, вставший по настоящей причине, больше не поднимается бесконечно — он останавливается и показывает причину.
Резервные копии базы данных работают на хостингах, которые запрещают запуск вспомогательных программ. Раньше на таких хостингах копия не снималась и не восстанавливалась вовсе, а владелец видел техническую ошибку.
Диагностика показывает ограничения вашего хостинга и объясняет, что каждое из них меняет для магазина, — до того, как что-то сломается, а не после.
Очередь задач больше не отчитывается о работе, которой не делала: письма покупателям, выгрузки и обновления доходят до конца. В режиме обслуживания задачи тоже выполняются — раньше обновление, включившее этот режим, не могло завершиться.
Кнопка «Открыть доступ к фотографиям» объясняет, что делать, вместо технической ошибки.
Очередь задач теперь разбирается и на хостингах, где запрещены функции pcntl: раньше её обработчик падал, и не уходили письма, не применялись обновления, стоял фоновый перенос.
Расписание теперь работает на хостингах, где запрещены proc_open и pcntl: раньше из-за них не выполнялась НИ ОДНА задача — не уходили письма, не разбиралась очередь, стоял перенос, а cron рапортовал об успехе.
Диагностика больше не говорит «планировщик не запускается» при работающем cron. Фоновый перенос сам продолжается, если цепочка оборвалась, и счётчик на экране больше не замирает.
Главное: планировщик падал на хостингах, где запрещены функции pcntl — из-за этого не работали ни очередь, ни фоновый перенос, хотя cron отрабатывал. Незаконченный перенос теперь открывается сам после перезагрузки страницы. Перенесённые покупатели видны в разделе сразу, не дожидаясь заказов.
Исправлено: один оборванный запуск задачи глушил расписание на сутки, и диагностика говорила «планировщик не запускается» при работающем cron. Добавлена кнопка «Снять замки планировщика».
Обновление теперь рассказывает, что делает: «в очереди», «загружаем пакет», «проверяем подпись», «заменяем файлы». Все подписи и описание обновления приходят на языке админки.
Перенос магазина теперь идёт на сервере: вкладку можно закрыть. Продолжение продолжает с места остановки, а не начинает заново. После переезда пересчитываются итоги покупок.
В карточке покупателя появились покупки: итоги и история заказов. Категории покупателей пересчитываются ночью — условие «покупал за последние N дней» теперь срабатывает само.
Раздел «Покупатели»: шапка встала вровень с остальными разделами, у числовых полей появились подсказки.
Режим обслуживания: сотрудник теперь видит полосу «магазин закрыт», а страницы, открытые сотрудником, больше не попадают в общий кеш витрины. В архив добавлена инструкция по настройке сервера.
Появился раздел «Покупатели»: кто покупает, сколько принёс, история заказов, категории покупателей со своими названиями и автоназначением по покупкам. Фотографии больше не нарезаются все сразу при загрузке — перенос ускорился в сотни раз. Мастер установки открывает доступ к фотографиям сам и показывает, что нужно настроить на сервере.
Скидка в корзине теперь объяснена: прежняя цена зачёркнута, рядом название акции, в итогах — «Ваша выгода». Акция на категорию применяется сразу при сохранении, а не через минуту. Переключатель языков остаётся на том же домене. Один знак валюты на всём экране.
Названия и описания плагинов теперь на языке админки — и у установленных, и в списке доступных к установке. Ссылка на скачивание обновления живёт сутки вместо получаса.
Появилась кнопка «Сбросить магазин»: возвращает копию к состоянию после установки, сохраняя плагины, лицензию и сотрудников. Витрина и язык интерфейса берутся из того, что указали при установке. Перенос с другой платформы больше не спотыкается на длинных ключевых словах, не замирает на фотографиях, а о непрошедших записях сообщает понятным текстом.
Отозванная лицензия теперь распознаётся магазином, а не остаётся активной навсегда. В диагностике видно, работает ли планировщик и когда он отработал. Маркетплейс разбит по категориям целиком. Мастер установки задаёт языком магазина тот язык, на котором его проходили.
Фоновые задачи наконец выполняются: письма покупателям, выгрузки и обновления больше не копятся молча. Неактивированная копия не получает платные разделы. Переезд с другой платформы работает без настройки сервера и показывает ход работы.
Установка на чистом сервере проверена целиком: исправлен посев данных на нескольких языках, мастер больше не закрывается на шаге администратора, копия ставится в рабочем режиме, а не в отладочном.
Установка в базу, где остались таблицы от прошлой попытки, объясняется словами, а не ошибкой SQL, и базу можно очистить прямо из мастера. Исправлено имя индекса, из-за которого установка обрывалась посреди миграций. В мастере появился фирменный знак.
Установка на чистом сервере доводится до конца: мастер больше не спотыкается на переходе к настроенной базе. Сам мастер теперь на трёх языках — открывается на украинском, переключается на русский и английский.
Первый релиз CartiX: каталог, заказы, доставка и оплата, админка, витрина.