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-спецификой рендеринга,

или с тем, как обрабатывается форма?


Ответы (0 шт):