- newsletter.html.twig: расширяет базовый шаблон информационного бюллетеня и добавляет новую форму флажка.
- handleAdditionalOptionSubmission() в контроллере: обрабатывает отправку формы через запрос POST к маршруту frontend.account.additionalOption.
- index.js: добавляет прослушиватель событий в форму и выполняет запрос AJAX.
Вот соответствующий код:
newsletter.html.twig
Код: Выделить всё
{% sw_extends '@Storefront/storefront/page/account/newsletter.html.twig' %}
{% block page_account_overview_newsletter_content_form %}
{{ parent() }}
{# ... form content ... #}
{% endblock %}
Код: Выделить всё
#[Route(path: '/account/newsletter/additional-option', name: 'frontend.account.additionalOption', methods: ['POST'], defaults: ['_loginRequired' => true, '_storefront' => true])]
public function handleAdditionalOptionSubmission(Request $request, RequestDataBag $dataBag, SalesChannelContext $context, CustomerEntity $customer): Response {
// ... controller logic ...
}
Код: Выделить всё
document.querySelectorAll('form[name="additionalOptionForm"]').forEach(form => {
form.addEventListener('submit', this.additionalOptionFormSubmit.bind(this));
});
additionalOptionFormSubmit(e) {
e.preventDefault();
var form = e.target;
var data = new FormData(form);
data.append('additionalOption', document.querySelector('#newsletterAdditionalOption').checked ? 'agreed' : 'not-asked');
data.append('csrf_token', document.querySelector('meta[name="csrf-token"]').getAttribute('content'));
this._client.post(form.getAttribute('action'), data, (response) => {
this.handleFormResponse(response);
});
return false;
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... -ajax-form
Мобильная версия