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