Поясню на примере. У меня есть некоторые плагины, которым это нужно. Так же сразу же появится масса возможностей для других плагинов.
Главная картинка для Блог:
Невозможно прикрепить дополнительные данные к записи в блоге до тех пор пока эта запись не создана.
Гибкий заказ:
Невозможно задавать дополнительные поля в зщаказе на стадии оформления заказа пока он еще не создан. Это сильно ограничивает область использования плагина.
Конструктор товаров:
Плагин работает с корзиной и добавляет к товарам дополнительные данные. Но, в момент создания заказа cart_items и order_items никак не связаны между собой. Нужно дополнительное уникальное поле для связи этих записей между собой.
Предлагаю ввести во все основные сущности UUID, который генерируется на стороне клиента и играет роль id до момента создания. Так же у каждой сущности должен быть хук сразу же после создания новой записи где будет возможность прикреплять дополнительные данные.
14 комментариев
как избежать зациклевания?
нужен механизм удаления связанных данных - допустим надобавлял я к заказу данных по uuid, а заказ так до конца и не был офорлен и в итоге образуется мусор.
Так мы ничего еще не создали, но у нас где-то закешированы все uuid и данные к ним. Хоть в той же сессии. А потом мы ловим хук и видим что к нам приплыл uuid, который мы закешировали. И тут уже сущность создана, есть живой id, к нему и цепляемся. А файлы так же можно в кеше аебасиста хранить. Они там до первой очистки.
Данные в сессии точно хранить не стоит. Вместо uuid можно просто использовать отрицательные значения для id как сейчас это делается в артикулах товара.
Лучше реализовать active record\orm модели + паттерн observer/listener: методы onDelete, onInsert, ... биндят "слушателей" - модели плагинов наследующих интерфейс "слушателей" или просто callback'и, после выполнения запроса модель оповещает слушателей об изменениях.
Вот только врядли этим тут кто-то станет заморачиваться).
В Kohana мы реализовали это так https://github.com/koseven/koseven/blob/devel/modules/orm/guide/orm/behaviors.md
Еще можно в wa_model добавить метод insertByUuid и там уже все нюансы продумать.
+, проблема бы решилась если бы добавили везде три хука вместо одного: https://developers.webasyst.ru...
Связь cart_items и order_items - тут 1000 плюсов! всегда приходится городить огород через промежуточные данные чтобы связать эти значения
Там на самом деле можно использовать порядок индексов. Он один в один повторяется. Но это ппц какой колхоз.
Кстати индексы cart_items строго больше либо равны индексам order_items. Поэтому можно смело их приравнять при создании заказа. И проблема будет решена.
На шаге checkout сохраняете в params все нужные значения и при создании заказа производите нужные действия. Можете привязываться к shop_cart или генерировать свой UUID.
А если заказ создан плагином Купить в 1 клик? у него нет checkout
Если собственный плагин, то туда можно добавить любую нужную информацию. Если вопрос в интеграции то можно вызывать своё событие типа wa('shop')->event('my1clickplugin.params'), собирать значения и добавлять в заказ.
по UID понятно, а как насчет трех хуков вместо одного (after, before)?
Зачем это нужно Плагин подарки, сейчас например хук создания заказа срабатывает когда уже заказ создан, и все товары распределены по складам, посчиталась сумма и т.д. Пришлось потратить много времени для работы с подарками (также распределять по складам, изменить стоимость заказа если нужно и т.д.) причем пришлось делать как для Shop-script7 так и для Shop-script6, хотя имея хук order_create.before можно было бы просто добавить новый элемент и Shop-script бы его сам обработал как нужно
лучше универсальные хуки для запросов waModel + в инсталлере должна быть возможность задать порядок вызова плагинов - например, вначале должен отрабовать Ваш плагин подарков (т.к. он изменяет заказ), а уже после плагин отправляющий доп. уведомление.
Порядок выполнения плагинов зависит от их расположения поэтому в разделе Магазин - Плагины можно просто перенести плагин ниже.
неплохо бы перенести этот функционал в инсталлер заодно с возможностью удалять отключенные плагины.