Opencart 3.x: country_id и zone_id не корректная валидация select
на OpenCart v 3.0.3.9 стоит шаблон Unishop я хочу переделать страницу регистрации клиента и я сделал модификатор, но у меня не получается корректно сделать валидацию полей (выпадающие списки селект) страна и зона. После нажатия на кнопку продолжить ложно вываливаются ошибки что эти селекты не выбраны, хотя в них покупателем были выбраны значения страны и зоны. Уже все перепробовал, не могу понять где проблема, почему валидар думает что селекты пустые. помогите пожалуйста. Вот весь код моего модификатора
Opencart 3.x: country_id и zone_id не передаются через POST при регистрации
Я кастомизировал страницу регистрации (catalog/view/theme/.../template/account/register.twig), добавив обязательные поля:
<select name="country_id"> — страна
<select name="zone_id"> — регион / область
Регионы загружаются динамически через AJAX при выборе страны:
function zone(flag) {
const country_id = $('select[name="country_id"]').val();
$.ajax({
url: 'index.php?route=checkout/uni_checkout/country&country_id=' + country_id,
dataType: 'json',
success: function (json) {
let html = '<option value="">Выберите регион / область</option>';
for (let i = 0; i < json['zone'].length; i++) {
html += '<option value="' + json['zone'][i]['zone_id'] + '">' + json['zone'][i]['name'] + '</option>';
}
$('select[name="zone_id"]').html(html);
}
});
}
Перед отправкой формы добавил JS-проверку:
document.querySelector('form').addEventListener('submit', function (e) {
const deliveryRequired = document.querySelector('input[name="delivery_required"]:checked')?.value;
if (deliveryRequired === 'yes') {
const country = document.querySelector('select[name="country_id"]');
const zone = document.querySelector('select[name="zone_id"]');
if (!country.value || !zone.value) {
e.preventDefault();
country.classList.add('input-warning');
zone.classList.add('input-warning');
}
}
});
В контроллере PHP:
$country_id = $this->request->post['country_id'] ?? '';
$zone_id = $this->request->post['zone_id'] ?? '';
if ($delivery_required === 'yes') {
if (empty($country_id)) {
$json['error']['country_id'] = 'Укажите страну';
}
if (empty($zone_id)) {
$json['error']['zone_id'] = 'Укажите регион / область';
}
}
❗ Проблема: Даже если пользователь выбирает страну и регион в интерфейсе, country_id и zone_id не попадают в $_POST при отправке формы — даже не как пустые строки.
Что я проверил: Элементы и zone_id существуют в HTML,
Атрибут name задан правильно,
Списки стран и регионов заполняются корректно,
Пользователь явно выбирает оба значения.
Но значения не доходят до сервера через $_POST.
❓Вопрос: Почему такие поля могут вообще не отправляться в POST-запрос, несмотря на то, что они есть, заполнены, выбраны и видны?
Может ли это быть связано:
с динамической загрузкой JavaScript,
с OpenCart-спецификой рендеринга,
или с тем, как обрабатывается форма?