Сделать возможность оперировать с новыми записями сущностей до их создания.

5

Поясню на примере. У меня есть некоторые плагины, которым это нужно. Так же сразу же появится масса возможностей для других плагинов.


Главная картинка для Блог:

Невозможно прикрепить дополнительные данные к записи в блоге до тех пор пока эта запись не создана.


Гибкий заказ:

Невозможно задавать дополнительные поля в зщаказе на стадии оформления заказа пока он еще не создан. Это сильно ограничивает область использования плагина.


Конструктор товаров:

Плагин работает с корзиной и добавляет к товарам дополнительные данные. Но, в момент создания заказа cart_items и order_items никак не связаны между собой. Нужно дополнительное уникальное поле для связи этих записей между собой.


Предлагаю ввести во все основные сущности UUID, который генерируется на стороне клиента и играет роль id до момента создания. Так же у каждой сущности должен быть хук сразу же после создания новой записи где будет возможность прикреплять дополнительные данные.

14 комментариев

  • +2
    Александр Тарасенко Александр Тарасенко 2 октября 2018 07:38 #

    +, проблема бы решилась если бы добавили везде три хука вместо одного: https://developers.webasyst.ru...

    Связь cart_items и order_items - тут 1000 плюсов! всегда приходится городить огород через промежуточные данные чтобы связать эти значения

    • +1
      ITFrogs ITFrogs 2 октября 2018 07:40 #

      Там на самом деле можно использовать порядок индексов. Он один в один повторяется. Но это ппц какой колхоз. 

      • +1
        ITFrogs ITFrogs 2 октября 2018 08:20 #

        Кстати индексы cart_items строго больше либо равны индексам order_items. Поэтому можно смело их приравнять при создании заказа. И проблема будет решена. 

      • +1
        enso_studio@mail.ru enso_studio@mail.ru 2 октября 2018 01:46 #
        Так же у каждой сущности должен быть хук сразу же после создания новой записи где будет возможность прикреплять дополнительные данные.

        как избежать зациклевания?

        нужен механизм удаления связанных данных - допустим надобавлял я к заказу данных по uuid, а заказ так до конца и не был офорлен и в итоге образуется мусор.


        • +1
          ITFrogs ITFrogs 2 октября 2018 07:45 #

          Так мы ничего еще не создали, но у нас где-то закешированы все uuid и данные к ним. Хоть в той же сессии. А потом мы ловим хук и видим что к нам приплыл uuid, который мы закешировали. И тут уже сущность создана, есть живой id, к нему и цепляемся. А файлы так же можно в кеше аебасиста хранить. Они там до первой очистки. 

          • +1
            enso_studio@mail.ru enso_studio@mail.ru 2 октября 2018 10:00 #

            Данные в сессии точно хранить не стоит. Вместо uuid можно просто использовать отрицательные значения для id как сейчас это делается в артикулах товара.

            Лучше реализовать active record\orm модели + паттерн observer/listener: методы onDelete, onInsert, ... биндят "слушателей" - модели плагинов наследующих интерфейс "слушателей" или просто callback'и, после выполнения запроса модель оповещает слушателей об изменениях.

            class Model
            {
                 protected $observers = [
                    'insert' => [],
                    'delete' => [],
                    'update' => [],
                 ];
                 
                 public function notifyObservers($type) {
                     foreach ($this->observers[$type] as $observer) {
                         call_user_func($observer, $this);
                     }
                 }
                 
                 public function attachObserver(callable $observer, $type)
                 {
                    if (!in_array($observer, $this->observers[$type])) {
                        $this->observers[$type][] = $observer;
                    }
                 }
                 
                 public function onInsert(callable $observer)
                 {
                     $this->attachObserver($observer, 'insert');
                 }
                 
                 public function onDelete(callable $observer)
                 {
                     $this->attachObserver($observer, 'delete');
                 }
            }

            Вот только врядли этим тут кто-то станет заморачиваться).

            В Kohana мы реализовали это так https://github.com/koseven/koseven/blob/devel/modules/orm/guide/orm/behaviors.md

          • +1
            ITFrogs ITFrogs 2 октября 2018 07:47 #

            Еще можно в wa_model добавить метод insertByUuid и там уже все нюансы продумать. 

          • +1
            Алексей Алексей Webasyst 2 октября 2018 09:27 #

            На шаге checkout сохраняете в params все нужные значения и при создании заказа производите нужные действия. Можете привязываться к shop_cart или генерировать свой UUID.

            • +1
              Александр Тарасенко Александр Тарасенко 2 октября 2018 09:30 #

              А если заказ создан плагином Купить в 1 клик? у него нет checkout

              • +1
                Алексей Алексей Webasyst 2 октября 2018 09:34 #

                Если собственный плагин, то туда можно добавить любую нужную информацию. Если вопрос в интеграции то можно вызывать своё событие типа wa('shop')->event('my1clickplugin.params'), собирать значения и добавлять в заказ.

                • +1
                  Александр Тарасенко Александр Тарасенко 2 октября 2018 09:41 #

                  по UID понятно, а как насчет трех хуков вместо одного (after, before)?

                  Зачем это нужно Плагин подарки, сейчас например хук создания заказа срабатывает когда уже заказ создан, и все товары распределены по складам, посчиталась сумма и т.д. Пришлось потратить много времени для работы с подарками (также распределять по складам, изменить стоимость заказа если нужно и т.д.) причем пришлось делать как для Shop-script7 так и для Shop-script6, хотя имея хук order_create.before можно было бы просто добавить новый элемент и Shop-script бы его сам обработал как нужно

                  • +1
                    enso_studio@mail.ru enso_studio@mail.ru 2 октября 2018 10:32 #

                    лучше универсальные хуки для запросов waModel + в инсталлере должна быть возможность задать порядок  вызова плагинов  - например, вначале должен отрабовать Ваш плагин подарков (т.к. он изменяет заказ), а уже после плагин отправляющий доп. уведомление.

                    • +2
                      Алексей Алексей Webasyst 2 октября 2018 10:59 #

                      Порядок выполнения плагинов зависит от их расположения поэтому в разделе Магазин - Плагины можно просто перенести плагин ниже. 

                      • +1
                        enso_studio@mail.ru enso_studio@mail.ru 2 октября 2018 12:46 #

                        неплохо бы перенести этот функционал в инсталлер заодно с возможностью удалять отключенные плагины.

                        Добавить комментарий

                        Чтобы добавить комментарий, зарегистрируйтесь или войдите