Можно ли создавать MIGX поля с фронтеда?

Здравствуйте!

Соответственно вопрос в названии: Можно ли создавать MIGX поля с фронтеда?
Lord Voldemort
20 июля 2021, 08:16
modx.pro
438
0

Комментарии: 16

Роман
20 июля 2021, 09:01
0
Можете подробнее не очень понятно, для чего.
    Lord Voldemort
    20 июля 2021, 10:37
    0
    на сайте будут подарочные сертификаты на покупку. пользователь может заказать сертификат на сайте как обычный товар. при этом он должен указать имя(кому дарится), свой email для отправки электронной версии сертификата и выбрать одну из 5 доступных цен — 1000р,2000р,3000р,4000р или свою цену. потом юзер, которому подарят сертификат, может указать его уникальный номер в поле Сертификат при оформлении заказа и снизить цену заказа в корзине.
    Сначала думал с фронта через ms2form создавать Сертификаты как товары и после использования сертификата, чтобы он удалялся. Но по-моему это тупое решение. Вот и подумал создать ресурс Сертификаты, создать migx поле Сертификаты и чтобы с фронта они заполнялись у него и использованные соответственно удалялись
      Роман
      20 июля 2021, 10:51
      0
      Обсуждалось подобное, но там решения нет. Можно сделать товар, поставить цену 1р., вместо кол-ва поставить рублей. При добавлении такого товара уже вносить изменения, где будут генерироваться сертификаты. А так же посмотрите это дополнение(mspromocode2), возможно это уже там реализовано.
        Николай Савин
        20 июля 2021, 10:54
        +1
        MIGX поля равно и как и любые другие можно создавать откуда угодно. Они ничем не отличаются от любых других полей базы данных. Но в данном случае это прямо какое то бредовое решение.
        — Просто создайте один товар с нулевой ценой.
        — На фронте сделайте форму как удобно, чтобы в поле цена подставлялась нужная цена.
        — В классе корзины проверяйте id товара. И если это подарочный сертификат, тогда ловите еще $_POST['price'] и используйте вашу динамическую цену

        <form class="ms2_form gift__form" method="post">
                <input type="text" value="500" name="price" class="gift__form-input">
                <input type="hidden" name="id" value="{$_modx->resource.id}">
                <input type="hidden" value="1" name="count">
            <button type="submit" class="button gift__form-submit"  name="ms2_action" value="cart/add">В корзину</button>
        </form>
        
        Вот так ловить цену в классе корзины
        if ($product->id === 5178) {
              $price = filter_input(INPUT_POST, 'price', FILTER_VALIDATE_INT);
        }
          Роман
          20 июля 2021, 12:31
          0
          Мне нравится данное решение.
            Lord Voldemort
            20 июля 2021, 22:28
            0
            Если я правильно понимаю, то ваш код задает с фронта цену сертификату верно? А что если его одновременно минимум два человека будут покупать? Да и логика работы маленько другая.
            Как я и писал выше: основной параметр — это уникальный id сертификата (из чего он будет генерироваться не проблема). Юзер оформил сертификат и купил его. На почту ему пришел электронный вариант, в котором написан его уникальный номер, допустим SCD-0111-DDR.
            Он отправляет этот номер любому человеку и если он укажет этот номер в корзине в поле Сертификат и нажмет кнопку Применить сертификат, то в корзине цена изменится на минус цены сертификата. После успешной оплаты заказа, данный сертификат должен удалиться или как минимум просто не применяться дальше.
              Николай Савин
              21 июля 2021, 08:26
              0
              Судя по вопросам, которыми вы завалили форум в последние дни — вы наверное слабо представляете себе как работает minishop2.

              Вы когда добавляете товар в корзину — добавляете запись в сессию клиента. Можно сказать копируете товар в глобальный массив $_SESSION. И далее любые манипуляции происходят не над товаром, который как образец лежит в базе данных, а именно с записью в сессии, которая персонализирована под конкретного посетителя. Здесь можно запросто изменить цену товара для конкретного человека, добавить в нее стоимость дополнительных опций в зависимости от того что на фронте натыкал конкретный посетитель. Эти данные увидит ТОЛЬКО клиент. В оригинальном товаре ничего не меняется.
              Так что смело манипулируйте записью в корзине — это копия товара, не оригинал.

              А как это сделать. Все просто.
              — Все что человек добавляет в заказ или в корзину хранится в массиве $_SESSION['minishop'].
              — Любым удобным способом посылайте данные из фронта на сервер. Допустим это будет ajax POST запрос.
              — На сервере создайте плагин. В плагине поймайте POST запрос, найдите соответствующую запись в $_SESSION и крутите ей как будет удобно.
              — Плагин можно создать на разные события. Здесь от логики зависит. Можно OnHandleRequest, можно на специфичные события минишопа msOnAddToCart, msOnAddToOrder

              Это я вам ответил комплексно на ваши вопросы по форуму.
              Конкретно на текущий вопрос ответить сложно, потому что я вопроса как такового не увидел.
              Судя по той логике что вы описываете — вы пытаетесь заново изобрести msPromocode.

              Здесь напрашивается покупка промо-кода на определенную сумму. Я бы установил компонент и при покупке сертификата — генерировал одноразовый промо-код на указанную сумму. Ну и далее клиент который придет с этим промо-кодом получит указанную скидку.
              Компонент — конечно же поддерживает возможность создания промокода программно через API
                Lord Voldemort
                21 июля 2021, 08:57
                0
                Судя по вопросам, которыми вы завалили форум в последние дни — вы наверное слабо представляете себе как работает minishop2.
                Верно, я нахожусь в процессе обучения.

                Судя по той логике что вы описываете — вы пытаетесь заново изобрести msPromocode.
                Думал про него. Но застрял на одном моменте: промокод можно создать, но как его оплатить? Ведь сертификат в подарок покупается. Например я сделаю форму, в которой пользователь заполнить нужные мне поля и далее создаст Сертификат. Но я никак не могу догадаться, как он его оплатит.
                  Николай Савин
                  21 июля 2021, 09:03
                  +1
                  1. Клиент который платит — вводит сумму сертификата в специальную форму и жмет в корзину
                  2. Отлавливаете плагином id добавляемого товара. Понимаете что это сертификат. Ловите введенную сумму сертификата. Меняете на лету нулевую стоимость товара-сертификата на ту сумму что была введена. Все товар с нужной суммой в корзине
                  3. Клиент переходит в корзину. Оплачивает введенную сумму.
                  4. После перехода заказа в состояние оплачено — ловите нужное событие, генерируете сертификат, высылаете его клиенту.

                  Не вижу никаких противоречий и сложностей
                    Lord Voldemort
                    21 июля 2021, 09:11
                    0
                    Спасибо большое за подсказки!
                    Попробую так и сделать!
                      Lord Voldemort
                      21 июля 2021, 14:20
                      0
                      Я криворукий)
                      По ходу оформления все показывается правильно, в плане цены Сертификата.
                      Но в админке у заказа все также цена 0 будет?
                      В форме всего одно поле — цена сертификата. Вот код плагина:
                      <?php
                      switch ($modx->event->name) {
                          case 'msOnBeforeAddToCart': 
                              if ($product->get('id') == 177) {
                                  $newPrice = $_POST['couponprice'];
                                  $product->set('price', $newPrice);
                              } 
                              
                          break;
                      }
                        Николай Савин
                        21 июля 2021, 18:06
                        0
                        1. Я же только сегодня в соседнем топике объяснял, что не нужно делать никаких манипуляций с оригинальным товаром. При добавлении в корзину товар КОПИРУЕТСЯ, и манипулировать значениями нужно уже в копии которая находится в сессии корзины.
                        В сессии корзины у каждого товара есть поле Price и именно с ним работают все компоненты типа промо-кодов.
                        2. Если хотите использовать систему плагинов — Работать нужно с событием msOnAddToCart
                        В этом случае в плагин попадает идентификатор товара в корзине $key
                        Тогда чтобы поменять цену у товара нужно сделать так
                        switch ($modx->event->name) {
                            case 'msOnAddToCart': 
                                if ($product->get('id') == 177) {          
                                    $newPrice = $_POST['couponprice'];
                                    $product->set('price', $newPrice);
                                $_SESSION['minishop2]['cart][$key]['price] = $newPrice;
                                } 
                                
                            break;
                        }
                        Плагин использовать не обязательно. Можно расширить класс корзины и работать с ним.
                        Ну и по рукам нужно еще дать за то что нет никакой валидации введенного значения. Мало ли там клиент что напишет.
                          Lord Voldemort
                          21 июля 2021, 18:11
                          0
                          спасибо с этим вопросом разобрался уже)
                          теперь через runProcessor не могу создать купон)
                          Ну и по рукам нужно еще дать за то что нет никакой валидации введенного значения. Мало ли там клиент что напишет.
                          Это да, доделаю)) Пока главное, чтобы весь процесс заработал, потом такие нюансы поправлю
                            Николай Савин
                            21 июля 2021, 18:17
                            0
                            В моем примере лишняя строка
                            $product->set('price', $newPrice);
                            Ее быть не должно, осталась от вашего примера. Недоглядел

                            Вот так должно быть
                            switch ($modx->event->name) {
                                case 'msOnAddToCart': 
                                    if ($product->get('id') === 177) {          
                                        $newPrice = $_POST['couponprice'];
                                        $_SESSION['minishop2']['cart'][$key]['price'] = $newPrice;
                                    } 
                                    
                                break;
                            }
                              Lord Voldemort
                              21 июля 2021, 18:42
                              0
                              так он даже визуально не меняет) это не критично уже, спасибо вам большое за помощь!)
                              Николай Савин
                              21 июля 2021, 19:48
                              0
                              Не меняет. Потому что событие происходит уже ПОСЛЕ добавления товара в корзину.
                              Для визуального изменения нужно все это делать не в плагине, а в расширенном классе корзины. Ровно перед добавлением товара в корзину. Там $_POST тоже будет доступен.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          16