Skip to main content

Настройка виджетов офферов с редиректом и кастомной ценой

Что нужно

  • offer_id нужных офферов (из GC или из HTML: data-offer-id="...")

  • ссылка для редиректа (для каждого оффера)

  • (опционально) текст “цены”, который показываем вместо реальной


1) JS: редирект по выбранному offer_id

Вставь JS и заполни словарь REDIRECTS:

<script>
$(function () {
  var REDIRECTS = {
    "7528221"8515270": "https://buy.stripe.com/9B6dR98Sx88JcEXfgn3AY0i"cNi14mfSXe2RbUS0SE3wQ1W",
    "7528798"8515271": "https://buy.stripe.com/8x25kD7Ot74F5cv6JR3AY0l",
    "7528815": "https://buy.stripe.com/14A9AT0m1dt3dJ19W33AY0k"cNi14mfSXe2RbUS0SE3wQ1W"
  };

  var pendingRedirect = null;
  //var ХранитpendingForm URL= дляnull;
  редиректаvar послеpendingAt успешной= отправки0;
  //var ПередREDIRECT_TTL отправкой= формы30000;

  function запоминаемgetFormFromElement(element) оффер{
    return $(element).closest(".lt-form");
  }

  function getSelectedOffer($form) {
    return $form.find(".form-position-input:checked").closest(".form-position");
  }

  function getSelectedRedirect($form) {
    var $selected = getSelectedOffer($form);
    var offerId = ($selected.attr("data-offer-id") || "").toString();

    return offerId && REDIRECTS[offerId] ? REDIRECTS[offerId] : null;
  }

  function normalizeNativeRequiredFields($form) {
    $form.find('input[name="formParams[email]"]').attr({
      type: "email",
      autocomplete: "email"
    });
  }

  function nativeFormIsValid($form) {
    var form = $form.get(0);

    if (!form || typeof form.checkValidity !== "function") {
      return true;
    }

    return form.checkValidity();
  }

  function hasVisibleSystemErrors($form) {
    var selectors = [
      ".has-error",
      ".error",
      ".field-error",
      ".form-error",
      ".form-error-message",
      ".help-block-error",
      ".text-danger",
      ".alert-danger",
      ".lt-form-error",
      ".standard-page-content .alert-danger"
    ].join(",");

    return $form.find(selectors).filter(function () {
      return $.trim($(this).text()).length > 0 && $(this).is(":visible");
    }).length > 0;
  }

  function resetPendingRedirect() {
    pendingRedirect = null;
    pendingForm = null;
    pendingAt = 0;
  }

  function rememberRedirect($form) {
    normalizeNativeRequiredFields($form);

    pendingRedirect = getSelectedRedirect($form);
    pendingForm = $form.get(0) || null;
    pendingAt = Date.now();
  }

  function pendingIsActual() {
    return !!pendingRedirect && !!pendingForm && Date.now() - pendingAt <= REDIRECT_TTL;
  }

  $(document).on('click'"click", '".lt-form .btn.f-btn.button-md.btn-success'success", function (e)) {
    var $form = getFormFromElement(this);

    resetPendingRedirect();
    rememberRedirect($form);

    if (!nativeFormIsValid($form)) {
      resetPendingRedirect();
    }
  });

  $(document).on("submit", ".lt-form", function () {
    var $form = $(this).closest('.lt-form');

    var normalizeNativeRequiredFields($selected = $form.find('.form-position-input:checked').closest('.form-position');
    var offerId = ($selected.attr('data-offer-id') || "").toString()form);

    if (offerId && REDIRECTS[offerId]!nativeFormIsValid($form)) {
      //resetPendingRedirect();
      Запоминаемreturn;
    URL}

    дляif редиректа, НО НЕ блокируем отправку
      (!pendingRedirect || pendingForm !== REDIRECTS[offerId]this) {
      rememberRedirect($form);
    } else {
      pendingRedirect = null;
    }
    // Форма отправляется стандартно через liteForm()
  });

  //$(document).on("invalid", После".lt-form успешной:input", AJAX-отправкиfunction () редирект{
    resetPendingRedirect();
  });

  $(document).ajaxComplete(function(function (event, xhr, settings) {
    if (pendingRedirect!pendingIsActual()) &&return;
    if (!xhr || xhr.status =!== 200) {
      resetPendingRedirect();
      return;
    }

    if (!settings || !settings.url || settings.url.indexOf("block-public/process") === -1) {
      return;
    }

    var redirectUrl = pendingRedirect;
    var $form = $(pendingForm);

    window.setTimeout(function () {
      if (!nativeFormIsValid($form) || hasVisibleSystemErrors($form)) {
        resetPendingRedirect();
        return;
      }

      try {
        var response = JSON.parse(xhr.responseText)responseText || "{}");
        // GetCourse возвращает success: true при успешном создании заказа

        if (response && response.success)success === true) {
          resetPendingRedirect();
          window.top.location.href = pendingRedirect;redirectUrl;
          return;
        }
      } catch (e) {
        // Если не Non-JSON илиresponse ошибкаmeans парсингаGetCourse did игнорируемnot confirm a successful form process.
      }

      resetPendingRedirect();
    }, 50);
  });
})();
</script>

Как добавить новый оффер:
"НОВЫЙ_ID": "https://ссылка"


2) CSS: порядок офферов + подмена цены

База (один раз)

.part-manyPositions { display: flex; flex-direction: column; }

.form-position .form-position-price.pull-right { position: relative; }
.form-position .form-position-price.pull-right::before{
  font-size:14px;font-weight:700;color:#111;line-height:1.2;font-family:inherit;visibility:visible;
}

Для каждого оффера (копируй блок и меняй значения)

/* ОФФЕР 7820040 */
.form-position[data-offer-id="7820040"] { order: 1; }
.form-position[data-offer-id="7820040"] .form-position-price.pull-right { visibility:hidden; font-size:0; }
.form-position[data-offer-id="7820040"] .form-position-price.pull-right::before { content:"2 × 110€"; }

/* ОФФЕР 1234567 */
.form-position[data-offer-id="1234567"] { order: 2; }
.form-position[data-offer-id="1234567"] .form-position-price.pull-right { visibility:hidden; font-size:0; }
.form-position[data-offer-id="1234567"] .form-position-price.pull-right::before { content:"199€ (o singura plata)"; }

Проверка

  • Порядок офферов меняется (через order)

  • Цена визуально подменена (content)

  • Редирект срабатывает только для офферов из REDIRECTS