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

5

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


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

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


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

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


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

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


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

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

  • +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 и там уже все нюансы продумать. 

      • +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
            Алексей Алексей 2 октября 2018 09:27 #

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

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

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

              • +1
                Алексей Алексей 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
                      Алексей Алексей 2 октября 2018 10:59 #

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

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

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

                        Добавление новых комментариев к этой теме отключено.