Настройка виджетов офферов с редиректом и кастомной ценой
Что нужно
-
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