Арамаис Манасян djenjoy96
Сайты, Telegram-боты и AI-решения под ключ
Рейтинг
5 602
№ 252 в каталоге
Отзывы
Профессионализм
10/10
Коммуникация
10 /10
Город
Москва
Опыт работы
6 лет
На сайте с
2026 года
Юридический статус
Частное лицо

Перенос 1840 товаров в интернет-магазин на OpenCart 3: поиск дублей, удаление водяного знака с 6275 фото, 1840 описаний заново, формы согласия, кнопка «Уточнить наличие»

Используемые навыки JavaScript jQuery Open Cart PHP Python

Описание

Заказчик - владелец второго интернет-магазина швейной техники на OpenCart 3.0.4 с темой ProStore на Twig: PHP 8.2, 382 товара, двусторонняя синхронизация с МойСклад, Яндекс.Маркет и Тинькофф. Хостинг только по FTP, без SSH, причём FTP заперт в public_html: каталог storage со скомпилированными копиями файлов и логами недоступен. Админка темы зашифрована ionCube: часть настроек меняется только записью в базу, а страница настроек при открытии перезаписывает массивы значений на умолчания.

Техническое задание из пяти пунктов. Заменить WhatsApp на мессенджер MAX. Привести формы к требованиям о персональных данных: галочки согласия там, где их не было, без преустановки и без лишней галочки «публичный договор». Перенести 1840 товаров с другого сайта того же владельца без дублей, с фотографиями, характеристиками и адресами страниц. Фотографии источника с вплавленным водяным знаком, а описания скопированы с другого сайта, и поисковики считают оба сайта копиями.

Сверх задания заказчик попросил кнопку «Уточнить наличие» для перенесённых товаров с нулевым остатком: форма с именем и телефоном, заявка должна попадать в заказы со статусом «Новый» с информацией о товаре.

Решение

Мессенджер MAX. Тип мессенджера зашит в зашифрованный контроллер темы. Шаблон склеивает адрес из префикса и ссылки: пустой префикс и полный адрес в ссылке дают корректный URL. Так добавил MAX без правки шаблона шапки и пересборки модификаций, тем же приёмом починил три битые ссылки на Telegram и ВКонтакте. Нарисовал иконки MAX для спрайта и подвала.

Формы и персональные данные. Убрал лишнюю галочку и преустановку, добавил согласие в «Нашли дешевле», быстрый заказ и подписку; три всплывающих окна быстрого заказа свёл в один шаблон. Главное: серверная проверка галочек в пяти контроллерах, до этого они были декорацией. Нашёл два бага. Обратный звонок создавал заказ при провале валидации: на боевом сайте 49 из 150 заказов без имени и телефона. Всплывашки всегда отправляли согласие: в функцию уходила коллекция jQuery, а не сериализация; .serialize() выбросил бы отключённые поля авторизованных покупателей, поэтому написал фильтр только для неотмеченных чекбоксов и радио.

Перенос 1840 товаров. Замеры: 2261 товар в источнике, 9341 путь к фото (405 МБ), 60 980 строк характеристик, пересекающиеся диапазоны id. Дубли искал нормализацией названий и моделей, свёрткой омоглифов (неразличимых кириллических и латинских букв) и сравнением цифровых сигнатур. Итог: 197 точных дублей, 118 спорных пар, 1946 новых; заказчику файл со ссылками на обе карточки и сортировкой по схожести.

Водяной знак. Детектор на нормализованной взаимной корреляции через БПФ с перебором масштабов эмблемы. Заливка по Лапласу оставляла серые пятна, перешёл на нейросетевую дорисовку IOPaint (LaMa) локально на GPU Apple Silicon с масками по координатам. После замечания заказчика детектор измеряет силу затемнения в ожидаемом месте вместо поиска по кадру: на 3295 фото ловит 97 из 100, повторный проход нашёл ещё 3422 файла со знаком.

Подготовка и импорт. 3635 путей с пробелами и 565 с кириллицей транслитерированы под отдельный корень — откат одной командой. Название чужого магазина заменено в 587 заголовках и 429 описаниях, исправлено двойное кодирование HTML, 88 чужих картинок перенесены к себе. Импорт только инкрементальный (обычный делает TRUNCATE четырёх таблиц), со смещением id на 100000, партиями по 200 товаров под лимит памяти 64 МБ. Импортёр сопоставляет характеристики по номеру и молча пропускает неизвестные: по названиям совпало 85 из 197, недостающие 112 создал заранее; после импорта все 49 607 строк на месте.

Новые описания для 1840 товаров. Стиль-гайд: факты неизменны, объём 70–130% оригинала, без цен, доставки и наличия. 46 партий по 40 товаров с автоприёмкой: объём, запретные темы, разметка, пропуски. Проверка одинаковых зачинов, сходства внутри категории и штампов по списку заказчика: переписано 107 карточек плюс 20 с близнецом штампа. Нашёл 10 товаров с описанием от другой модели и 8 с разными моделями в заголовке и тексте, передал списком.

Кнопка «Уточнить наличие». Использовал имеющийся «купить в 1 клик», создающий настоящий заказ, и переменную статуса наличия в шаблонах: без пересборки, оценка снизилась с 12–15 до 8–10 часов. На сервере: обход проверки остатка и минимальной суммы для заявок, сохранение корзины покупателя, нулевая цена, сборка комментария с моделью и ссылкой на сервере, а не в скрытом поле.

Перенос на боевой сайт. Бэкап; защита интеграции с МойСклад: по журналу модуля за полгода (58 981 запись) выключил две задачи, которые завели бы 1840 чужих позиций в склад и обнулили остатки, выгрузку заказов оставил. Далее фото, категории, характеристики, товары, кнопка, проверка. Стек: PHP 8.2, MySQL, Twig, JavaScript/jQuery, OCMOD, Python (NumPy, SciPy, Pillow, openpyxl), lftp.

Результат

В магазин добавлено 1840 товаров без дублей: 197 точных дублей отсеяны, 118 спорных пар решены заказчиком по подготовленному файлу. 6275 фотографий очищены от водяного знака, 442 намеренно оставлены там, где знак лежит поверх текста или схемы, это согласовано с заказчиком; средняя сила знака на выборке упала с 0,73 до 0,08.

1840 описаний написаны заново: 1 479 401 знак, в среднем 804 на карточку, медиана объёма 88% от оригинала. Ноль штампов, ноль повторяющихся зачинов, ноль похожих пар; дословных совпадений с оригиналом длиннее 90 знаков два, и оба это перечисления названий строчек.

После переноса все страницы отдают 200 без ошибок PHP, выборка из 250 фотографий совпала по размеру побайтово, все 49 607 строк характеристик на месте. Синхронизация с МойСклад не пострадала. Формы собирают согласие и проверяют его на сервере, заказы без имени и телефона больше не создаются. Мессенджер MAX подключён без правки шаблонов, три битые ссылки починены. Кнопка «Уточнить наличие» проверена живыми заявками: заказ создаётся со статусом «Новый», корзина покупателя цела, без согласия и телефона заявка не уходит.

Найденные ошибки в данных заказчика переданы списком, а не исправлены молча. Работа выполнена с 28 августа по 10 сентября 2026 вместе с первой работой для того же заказчика. Магазин публичный, ссылка в примерах.

Оценили проект:

Другие проекты

Все проекты →
Веб-разработка и IT Автопрохождение подземелий в «Мире Теней»: юзерскрипт
Автопрохождение подземелий в «Мире Теней»: юзерскрипт
11
Веб-разработка и IT Разработка интернет-магазина строительных и отделочных материалов для сети строймаркетов Сатурн
Разработка интернет-магазина строительных и отделочных материалов для сети строймаркетов Сатурн
61
Веб-разработка и IT Сайт стоматологической клиники Denta
Сайт стоматологической клиники Denta
31
Веб-разработка и IT Telegram-бот для операторов обменника: заявки через API провайдера без дублей
Telegram-бот для операторов обменника: заявки через API провайдера без дублей
10