Корзина в проектах на конструкторе Salebot
Часть 1. Формируем товарную матрицу
В этой части урока будем формировать товарную матрицу.
Сперва создаем стартовый блок в условие ставим пока что любое слово, будь то просто start или как тут 12345
Далее в сообщение пишем "Выберите товар"
Сейчас нам нужно определять цену каждого товара. Это можно сделать 2 способами
2-й способ это с помощью словарей
Воспользуемся вторым способом, потому что словарем будет удобнее работать.
Заходим в настройки проекта и в "Константы проекта" добавляем словарь в переменную prices
{"товар 1": "1000", "товар 2": "1250", "товар 3": "600", "товар 4": "1350"} - словарь
Далее создаем блок и в стрелке ставим "Пользователь вводит данные".
Сохраняем вводимые данные в переменную product (как на картинке)
Потом в блоке пишем "Укажите количество" и в калькуляторе достаем цену выбранного товара
А именно эта цена достается с помощью такого кода:
Здесь price это новая переменная, куда будем сохранять цену товара
prices - это наш созданный словарь с товарами и их ценами
а product это выбранный товар пользователем.
С помощью конструкции dict["key"] можно доставать нужные значение по ключам. А в словаре у нас ключ это сам товара значение ключа - стоимость товара.
И тут такая же логика #{product} это наш ключ товара и с помощью этого ключа возвращаем стоимость этого же товара.
Если хотите более углубиться в тему словарей, то статья от сейлбота хорошо поможет (https://docs.salebot.pro/peremennye-1/rabota-s-massivami-i-slovaryami#primer-so-slovarem )
Хотите положить в корзину #{product} в количестве #{quantity} шт. по цене #{price} руб.
Стоимость позиции #{cost} руб.
#{product} - название продукта
#{price} - стоимость одного продукта
#{cost} - общая стоимость, вычисляется умножением количества продукта и стоимостью 1 продукта (вычисляется в калькуляторе)
Для этого в калькуляторе пишем: cost=#{price}*#{quantity}
Проверяем воронку и получаем успешный ответ от бота :D
Часть 2. Формируем корзину
В этой части мы продолжим работать с корзиной.
В первой части мы сформировали товарную матрицу, а сейчас мы будет формировать уже саму корзину.
Корзина - несколько объектов объединенных одним заказом.
Стрелку с условием "Отменить" направляем в самый первый блок. А стрелкой с условием "Добавить в корзину" Направляем уже в новый блок.
Как будем формировать корзину?
Важно! Если человек первый раз попадает в этот блок, то корзина у него еще не сформирована.
А корзина у нас объект массива. Что же нужно сейчас сделать? Нужно определить есть ли у него корзина или нет. Если ее нет, то длинна нашего массива равно нулю. Длина массива считается функцией arr_len()
basket=if(arr_len(basket)==0,'[]',basket)
basket=if(arr_len(basket)==0,'[]',basket)мы тут проверяем длину массива переменной basket.
Если такой переменной изначально не было, либо массив пустой, то arr_len(basket) будет возвращать 0.
И если arr_len(basket) возвратит 0, то в переменную basket запишутся пустые скобки '[]'.
А если в массиве basket что-то есть, то с этой переменной ничего не случиться, потому что мы его повторно сохраняем то есть вот так -> basket=basket.
Проверяем логику бота и видим, что в basket сохранилось значение []
Дальше добавляем в корзину товары в виде словарей.
Добавляем в этот же блок такую командуbasket=append(basket, '{"product":"#{product}", "quantity":#{quantity}, "price":#{price}}', True).
Здесь мы с помощью append добавляем словарь в массив. Чтобы сейлбот понимал, что мы добавляем именно словарь, нужно дополнительно передавать True.
И еще дополнительно пишем в тот же блок такую команду
(Эта переменная отвечает за стоимость всей корзины)
Проверяем логику бота и видим, что все успешно работает😄
Часть 3. Визуализируем корзину
В этой части займемся представлением корзины в понятном виде.
То есть мы будем сразу отображать, что в корзине лежит.
Для начала лучше прочитать документацию про перевод массива в человекочитаемый текст от сейлбота https://docs.salebot.pro/peremennye-1/rabota-s-massivami-i-slovaryami#kak-perevesti-massiv-v-chelovekochitaemyi-tekst
Для начала мы в калькулятор дополняем вот таким кодом
basket_text=massive_to_text(basket, header, 1)
header у нас заголовок, то есть туда ставится такой текст "Ваш заказ:"
С помощью massive_to_text мы из массива делаем текст и сохраняем результат в переменную basket_text. А сам массив у нас находится в переменной basket.
Третий элемент, который мы передает "1" это у нас цифра с которой начнется нумерация.
Да у нас выводится словари, НО эти словари выводятся как текст
И с этим текстом можно спокойно работать с помощью функции replace()
из документации сейлбота про replace()
Теперь дополняем код в калькуляторе
basket_text=replace(basket_text, "{'product': '", " ")
basket_text=replace(basket_text, "', 'quantity': ", " Количество: ")
basket_text = replace(basket_text, ", 'price': ", " шт. Цена: ")
basket_text = replace(basket_text, "};", " руб.")
Мы тут говорим с помощью replace(), чтобы заменял куски текста (к примеру, "{'product': '") заменить на другой текст (к примеру, на пустую строку " " ) и сохрани этот результат в ту же переменную basket_text.
Тем самым мы заменяем не нужные части текста на НУЖНЫЕ, чтобы красиво все отображалось, вместо некрасивого словаря.
Сохраняем все и смотрим как работает код.
Как мы видим, некрасивый словарь превратился в нормально отображаемую корзину.
И самое главное у нас есть пронумерованный список. То есть все товары идут по порядку. Это пронумерованные элементы массива.
Когда в следующих частях мы будем заниматься корректировкой корзины - такой подход пригодится.
Часть 4. Обнуляем корзину и удаляем позиции
В этой части мы научимся изменять состав заказа.
Для начала настроим обнуление корзины.
Создаем блок для этой ветки.
(Настройки стрелки)
И в этом блоке создаем 3 кнопки
Далее создаем стрелку для очистки корзины.
В блоке вывода текста даем пользователю знать, что корзина очищена.
basket=''В переменную basket мы сохраняем пустую строку
(Статья про удаление переменных)
И все! Полная очистка корзины настроена 🛒
Продолжаем настройку.
Теперь будем настраивать удаление позиции из нашей корзины
Создаем еще одно ответвление для кнопки "Удалить позицию"
Настройки этого блока выглядят таким образом:
Текст - #{basket_text}
basket_text=massive_to_text(basket, header, 1)
basket_text=replace(basket_text, "{'product': '", " ")
basket_text=replace(basket_text, "', 'quantity': ", " Количество: ")
basket_text = replace(basket_text, ", 'price': ", " шт. Цена: ")
basket_text = replace(basket_text, "};", " руб.")
Берем код из вывода корзины и ставим его в этом блоке, но меняем переменную header. И в эту переменную сохраняем новый текст "Укажите номер позиции:"
Дальше нам нужно сохранить номер позиции, которую вводит пользователь.
В настройках стрелки мы включаем "Пользователь вводит данные"
и сохраняем эти данные в переменную position.
В блоке мы пишем такие настройки
basket_text=massive_to_text(basket, header, 1)
basket_text=replace(basket_text, "{'product': '", " ")
basket_text=replace(basket_text, "', 'quantity': ", " Количество: ")
basket_text = replace(basket_text, ", 'price': ", " шт. Цена: ")
basket_text = replace(basket_text, "};", " руб.")
Так как basket у нас массив, то в массиве индексация идет с цифры 0. Поэтому мы в первой строке отнимаем от цифры введенной пользователем единицу position=position-1
Потом с помощью функции del очищаем из массива basket именно товар, под номером, который ввел пользователь ['#{position}']
Про del в документации сейлбота
Проверяем бота и видим что все работает!
Часть 5. Проверяем на неверный ввод позиции, чтоб не возникла ошибка.
Наша прошлая задача еще не завершена полностью, так как клиенты могут писать не правильный номер при удалении элемента из корзины.
В этом блоке дописываем функцию для подсчета длины массива lenbasket=arr_len(basket)
Создаем дополнительный пустой блок.
Этот блок нужен для проверки числа, которую вводит пользователь. Чтобы не было ситуации, когда у нас всего лишь 2 товара для удаления, а пользователь хочет удалить четвертый товар xD
Пользователи они такие. Дай им возможность совершить ошибку - они ее совершат. И с помощью такой конструкции мы такой возможности им не даем.
Ну точнее они могут это сделать, но мы скажем "не не не, не в этот раз" и вернем его в тот же блок из которого он уходил.
В этой стрелки в поле "Переменная для сравнения"
то есть переменная lenbasket должна быть больше или равна переменной position.
А в этой стрелке в поле "Переменная для сравнения"
то есть переменная lenbasket должна быть строго меньше чем переменная position.
И с помощью стрелки возвращаем пользователя обратно.
6 и 7 части доступны по ссылкам:
Часть 6. Получаем количество в товарной позиции
Часть 7. Меняем количество в заказе
Если вам понравилась наша статья, пишите комментарии. Задавайте вопросы по статье в комментариях.
И конечно же у вас есть возможность поддержать наш проект отправив донат.