Waistline. Интернет магазин

#backend #frontend #woocommerce #retail-crm

https://waistline.shop/

Интернет магазин специализирующийся на тематике корсетов и других корректирующее тело продуктах.

Изначально интернет магазин уже существовал на платформе https://taplink.ru. Неплохая платформа с готовым функционалом. Но клиент пожелал полноценный сайт по аналогии с магазbном, который им нравился. Он был на битриксе. Я с битриксом не работаю, поэтому предложили Woocommerce.

Столкнулись со сложной ситуацией. Я не имел большого опыта в ИМ разработке. Мы выбрали шаблон под вукоммерс. Но открыв код и тему, я понял, что не смогу с этим работать. Тема была сделана на конструкторе и перегружена излишками неиспользуемого кода и избытком админки.
Интерфейс для конструктора, интерфейс для настройки темы + к этому интерфейс фукомерса, фильтров и плагином. Все это котел неконтролируемого кода, раскиданного везде и что хуже в базе данных.

Я чуть было не отказался от проекта. Но волевым решением попытался адаптировать код вукомерса под нужды не использую конструктор, ненужные плагины и излишки вукомерса. Взял чистую тему и начал ее дорабатывать. А верстальщику поставили задачу перенести верстку из шаблона, так же успростив структуру и излишки html.

Переработка основного функцонала вукомерс.

Сложность состояла в том, что архитектура Вордпресс и Вукомерс построена на хуках. Мне не понятна эта архитектура, она не столь гибкая и в ней нет компонентного MVC подхода. В корпоративных сайтах я не использую хуки. С магазином посложнее. Функционала много, много логики завязано. Тем не менее я переработал, упростил, сделал компонентно подобные структуры для:

И много других нюансов.

Так же помимо этого не полностью, но значительно доработаны страницы: Корзины, Чекаута и Админка клиента.

Для страницы чекаута были доработаны поля и верстка всех блоков. Валидация полей в зависимости от типа доставки. Добавлены сами типы доставки:

Контентные части сайта были вынесены в блоки Lazy Block.
Так же был реализован простой мини блок.

Интеграции

Их было несколько.

Retail CRM.

Очень сложный кусок разработки. Я не хотел использовать плагин. Плагины вордпресс - это отдельная тема. С одной стороны есть хорошие действительно упрощающие жизнь, а есть такие, функционал которых ты не контролируешь используешь то, что есть и ни на йоту больше. Не говоря о платности расширенных возможностей, которых так же может не хватать как и гибкости их реализации.

Тут важная часть системы, которую бы хотелость контролировать полностью. Плагин - черный ящик. Работает - хорошо, не работает - пиши разработчику или гадай. Я немного попробовал плагин, мне не понравилось, я решил все сделать используя php api клиент и api retail crm.

Некоторая сложность была в том, чтобы разобраться какие поля и в каком формате для чего передавать. Просто полей было под 50+. В документации была информация, но не чтобы исчерпывающая. А на просторах интернета про Ретейл Црм не так много как хотелось. Поэтому большая часть работы состояла в личном экспериментирование и выяснение работы полей.

Так было сделано:

Для еще большего контроля сделал свою системы логов. Где наглядно показывались статусы работы интеграции и ошибки.


Robokassa

Для оплаты была подключена робокасса. Подключение не составило труда, разве что кроме самого кабинета робокассы и активация магазина. Сделал два аккаунта: собственно для прод сайта и для тестового домена

СДЭК

Был подключен и настроен плагин сдека. Номер отправления сохраняется в админке, передается в письме, а так же отправляется в Retail CRM. Было сделано два типа доставки: курьером до адреса и до ПВЗ, с возможностью выбора точки на карте.

Почта россии

По аналогии со СДЭК подключил и настроил плагин. Так трекномер попадал в админку и црм. Был реализован стандартный способ доставки по адресу с автоматическим выбором ПВЗ на строне кабинета почты.

Unisender

Система подписок. Был выбран юнисендер. Так же настроил форму через API. Добавил автоматизацию на отправку купона при регистрации. Так как для юнисендер, так и для всего сайта настроил SMTP mail.ru почты.

Exception

Error

We're sorry, but an unhandled error occurred. Please see the details below.

file_put_contents(/home/admin/web/alex.dzen-code.ru/public_html/storage/framework/cache/11/de/11de31e1eabb2682cf62ee9c9ccb0630f1019006): failed to open stream: Permission denied

/home/admin/web/alex.dzen-code.ru/public_html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php line 122

     * @param  string  $contents
     * @param  bool  $lock
     * @return int
     */
    public function put($path, $contents, $lock = false)
    {
        return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
    }
 
    /**
     * Prepend to a file.
     *
     * @param  string  $path

Stack trace

# Called Code Document Line
30 file_put_contents(…) ~/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php 122
29 Illuminate\Filesystem\Filesystem->put(…) ~/vendor/october/rain/src/Filesystem/Filesystem.php 217
28 October\Rain\Filesystem\Filesystem->put(…) ~/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php 65
27 Illuminate\Cache\FileStore->put(…) ~/vendor/laravel/framework/src/Illuminate/Cache/Repository.php 191
26 Illuminate\Cache\Repository->put(…) ~/vendor/october/rain/src/Halcyon/MemoryRepository.php 61
25 October\Rain\Halcyon\MemoryRepository->put(…) ~/vendor/laravel/framework/src/Illuminate/Cache/Repository.php 323
24 Illuminate\Cache\Repository->remember(…) ~/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php 304
23 Illuminate\Cache\CacheManager->__call(…) ~/vendor/october/rain/src/Database/QueryBuilder.php 158
22 October\Rain\Database\QueryBuilder->getCached(…) ~/vendor/october/rain/src/Database/QueryBuilder.php 121
21 October\Rain\Database\QueryBuilder->getDuplicateCached(…) ~/vendor/october/rain/src/Database/QueryBuilder.php 92
20 October\Rain\Database\QueryBuilder->get(…) ~/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php 481
19 Illuminate\Database\Eloquent\Builder->getModels(…) ~/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php 465
18 Illuminate\Database\Eloquent\Builder->get(…) ~/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php 77
17 Illuminate\Database\Eloquent\Builder->first() ~/modules/system/behaviors/SettingsModel.php 114
16 System\Behaviors\SettingsModel->getSettingsRecord() ~/modules/system/behaviors/SettingsModel.php 76
15 System\Behaviors\SettingsModel->instance() ~/modules/system/behaviors/SettingsModel.php 135
14 System\Behaviors\SettingsModel->get(…)
13 call_user_func_array(…) ~/vendor/october/rain/src/Extension/ExtendableTrait.php 414
12 October\Rain\Database\Model->extendableCall(…) ~/vendor/october/rain/src/Database/Model.php 647
11 October\Rain\Database\Model->__call(…) ~/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php 1489
10 Illuminate\Database\Eloquent\Model::__callStatic(…) ~/modules/system/models/EventLog.php 37
9 System\Models\EventLog::useLogging() ~/modules/system/ServiceProvider.php 286
8 System\ServiceProvider->System\{closure}(…)
7 call_user_func_array(…) ~/vendor/october/rain/src/Events/Dispatcher.php 233
6 October\Rain\Events\Dispatcher->dispatch(…) ~/vendor/laravel/framework/src/Illuminate/Log/Writer.php 295
5 Illuminate\Log\Writer->fireLogEvent(…) ~/vendor/laravel/framework/src/Illuminate/Log/Writer.php 201
4 Illuminate\Log\Writer->writeLog(…) ~/vendor/laravel/framework/src/Illuminate/Log/Writer.php 114
3 Illuminate\Log\Writer->error(…) ~/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php 221
2 Illuminate\Support\Facades\Facade::__callStatic(…) ~/vendor/october/rain/src/Foundation/Exception/Handler.php 66
1 October\Rain\Foundation\Exception\Handler->report(…) ~/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php 81
0 Illuminate\Foundation\Bootstrap\HandleExceptions->handleException(…)