Skip to main content

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

Что нужно

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

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

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


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

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

<script>
(function () {
  var REDIRECTS = {
    "8515270": "https://buy.stripe.com/cNi14mfSXe2RbUS0SE3wQ1W",
    "8515271": "https://buy.stripe.com/cNi14mfSXe2RbUS0SE3wQ1W"
  };

  var pendingRedirect = null;
  var pendingForm = 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", ".lt-form .btn.f-btn.button-md.btn-success", function () {
    var $form = getFormFromElement(this);

    resetPendingRedirect();
    rememberRedirect($form);

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

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

    normalizeNativeRequiredFields($form);

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

    if (!pendingRedirect || pendingForm !== this) {
      rememberRedirect($form);
    }
  });

  $(document).on("invalid", ".lt-form :input", function () {
    resetPendingRedirect();
  });

  $(document).ajaxComplete(function (event, xhr, settings) {
    if (!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 || "{}");

        if (response && response.success === true) {
          resetPendingRedirect();
          window.top.location.href = 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