Skip to content
  1. Компоненты
  2. msPromoCode2
  3. Кейсы
  4. Генерация промо-кода в письме на следующий заказ

Генерация промо-кода в письме на следующий заказ

С версии 1.1.12 появился метод mspc2Manager::generateCoupon, который позволяет сгенерировать промо-код с кодом в заданном формате и заданными параметрами. Это значительно упрощает процесс генерации купона с уникальным кодом.

Шаг 1

Создаём сниппет generateCoupon с кодом:

php
$mspc2 = $modx->getService('mspromocode2', 'msPromoCode2',
    MODX_CORE_PATH . 'components/mspromocode2/model/mspromocode2/');
$mspc2->initialize($modx->context->key);
$manager = $mspc2->getManager();

$order_id = (int)$modx->getOption('order', $scriptProperties) ?: 0;
if (empty($order_id)) {
  return 'Укажите id заказа.';
}

// Сначала попробуем найти уже сгенерированный промо-код для этого заказа
if ($couponObj = $modx->getObject('mspc2Coupon', ['properties LIKE "%\"prev-order\":' . $order_id . '%"'])) {
  $coupon = $manager->getCoupon((int)$couponObj->get('id'));
}

// Не удалось найти промо-код
if (empty($coupon) || !is_array($coupon)) {
  // Формат промо-кода в виде regex-like синтаксиса
  $format = '[a-zA-Z0-9]{12}';

  // Параметры промо-кода
  $data = [
    'list' => 'for-next-order', // Поле "Список" для промо-кода
    'count' => 1, // Сколько раз можно применить генерируемый промо-код
    'discount' => '10%', // Размер скидки для генерируемого промо-кода
    'description' => 'Скидка на следующий заказ', // Описание промо-кода

    // Конфиг
    'showinfo' => true, // Показывать предупреждения
    'oneunit' => false, // На одну единицу товара
    'onlycart' => true, // Только в корзине
    'unsetifnull' => false, // Не применять без скидки
    'unsetifnull_msg' => '', // Текст при отмене
    'oldprice' => false, // Без старой цены

    // Время действия
    'lifetime' => strtotime('1 month'), // +1 месяц в секундах

    // Сохраним id заказа в properties
    'properties' => [
      'prev-order' => $order_id,
    ],
  ];
  $coupon = $manager->generateCoupon($format, $data);
}

return $coupon;

Шаг 2

В чанке письма, в котором вы хотите сгенерировать промо-код для клиента (у меня это tpl.msEmail.paid.user) вызываем сниппет и прописываем вывод данных купона, примерно так:

fenom
{extends 'tpl.msEmail'}

{block 'title'}
  {'ms2_email_subject_paid_user' | lexicon : $order}
{/block}

{block 'products'}
  {var $newCoupon = ('!generateCoupon' | snippet : [
    'order' => $order.id,
  ])}
  {if ($newCoupon is not empty) && is_array($newCoupon)}
    <div style="margin: -10px 20px 40px;">
      Специально для Вас мы сгенерировали промокод -{$newCoupon.discount} на следующую покупку:
      <span style="display: inline-block;background: #ffecec;padding: 4px 4px;border: 2px solid #ff4f50;border-radius: 4px;font-size: 18px;line-height: 1;">
        {$newCoupon.code}
      </span>.
      Вставьте его в корзине нашего сайта при следующем заказе, чтобы получить персональную скидку.
      {if $newCoupon.stoppedon?}
        <br>Скидка действительна до {$newCoupon.stoppedon | date : 'd.m.Y H:i'}
      {/if}
    </div>
  {/if}

  {parent}
{/block}

Выглядеть это будет как-то так: