Как рассчитать скидку в корзине в зависимости от количества согласных букв в логине пользователя?

Каким образом можно создать динамическую скидку на сайте, которая зависит от количества согласных букв в логине пользователя? Как можно реализовать логику формирования такой скидки в обработчике события OnBeforeBasketAdd? Можно ли создать гибкую скидку, которая меняется в зависимости от передаваемого значения в обработчике перед добавлением товара в корзину, вместо того чтобы каждый раз создавать новую скидку?
  • 5 февраля 2024 г. 9:32
Ответы на вопрос 2
Для создания динамической скидки, зависящей от количества согласных букв в логине пользователя, можно использовать следующий подход:

1. Определение количества согласных букв в логине: 
   Напишите функцию, которая будет принимать логин пользователя и возвращать количество согласных букв в нем. Для этого нужно будет пройтись по каждому символу в строке и проверить, является ли данный символ согласной буквой.

2. Расчет скидки: 
   Определите логику для расчета размера скидки в зависимости от количества согласных букв. Например, каждая согласная буква дает 1% скидки, но не более 10% в общем.

3. Применение скидки:
   В обработчике события OnBeforeBasketAdd реализуйте логику добавления расчетной скидки к товарам в корзине.

Пример кода на PHP (рассмотрим его в контексте CMS Bitrix, которая использует события, подобные OnBeforeBasketAdd):

```php
// Функция, которая считает кол-во согласных букв в логине
function countConsonants($login) {
    $consonants = 'bcdfghjklmnpqrstvwxyz'; // Можно добавить согласные иных алфавитов
    $count = 0;
    for ($i = 0; $i < mb_strlen($login); $i++) {
        if (strpos($consonants, mb_strtolower(mb_substr($login, $i, 1))) !== false) {
            $count++;
        }
    }
    return $count;
}

// Обработчик события добавления в корзину
AddEventHandler("sale", "OnBeforeBasketAdd", "OnBeforeBasketAddHandler");
function OnBeforeBasketAddHandler(&$arFields) {
    $userId = $arFields['FUSER_ID'];
    $user = CUser::GetByID($userId)->Fetch();
    $login = $user['LOGIN'];
    
    // Количество согласных в логине
    $consonantsCount = countConsonants($login); 
    
    // Расчет скидки (например, 1% за каждую согласную, максимум 10%)
    $discountPercent = min($consonantsCount, 10); 
    
    // Получение цены товара
    $price = $arFields["PRICE"];

    // Расчет новой цены с учетом скидки
    $arFields["PRICE"] = $price * (1 - ($discountPercent / 100));
}
```
Обратите внимание, что этот пример предполагает, что вы используете CMS Bitrix и у вас есть базовое понимание её API. Если вы используете другую систему управления контентом или пишете собственное решение, некоторые из этих API вызовов будут отличаться. 

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

AddEventHandler("sale", "OnCondSaleControlBuildList", "GetControlDescr");
AddEventHandler("catalog", "OnCondSaleControlBuildList", "GetControlDescr");

эти события должны помочь, ради интересна подосвобожусь попробую сделать, думаю завтра получится
Похожие вопросы