Давече попался мне в руки небольшой интернет-магазин, который сделан на OpenCart, в котором необходимо было упростить процесс регистрации пользователей и, собственно, заказ товаров.
Кто не знает, то OpenCart – это наследник старой доброй CMS osCommerce, в которой худо-бедно реализовано псевдо-MVC, что существенно упрощает жизнь по сравнению с оригинальной osCommerce, от которой я отказался несколько лет назад ввиду муторности поддержки.
Так вот, стоит задача – убрать лишние поля в формах регистрации и заказа для гостей.
Решение достаточно простое и элегантное:
Шаг 1. Редактируем шаблоны
Их два:
- catalog/view/theme/default/template/checkout/register.tpl – для формы регистрации
- catalog/view/theme/default/template/checkout/guest.tpl – для гостей
Структура файлов у них похожая, потому говорить буду на примере одного из них.
Мы можем пойти двумя путями – редактировать существующие шаблоны или создать новые и сказать контролеру использовать их вместо стандартных. Пойдем вторым путем, т.к. он упростит дальнейший апгрейд магазина.
Копируем шаблоны и создаем файлы:
- catalog/view/theme/default/template/checkout/register-new.tpl
- catalog/view/theme/default/template/checkout/guest-new.tpl
Само копирование не позволит нам использовать новые шаблоны в OpenCart, потому идем в catalog/controller/checkout/register.php и редактируем строки (145-147), которые отвечают за выбор шаблона:
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/checkout/register.tpl')) { $this->template = $this->config->get('config_template') . '/template/checkout/register.tpl'; } else { $this->template = 'default/template/checkout/register.tpl'; } |
Меняем register.tpl на register-new.tpl, сохраняем и проверяем – теперь мы можем вносить изменения в наши новые шаблоны.
Собственно процесс редактирования формы будет заключаться в том, что мы скроем поля, благодаря использованию style=”display:none” и удалим соответствующие заголовки полей.
Удаляем строки типа:
- <span class=“required”>*</span> <!—?php echo $entry_postcode; ?—>
После этого редактируем поля:
-
<input class="large-field" style="display: none;" type="text" name="postcode" value="" />
добавляем style=”display:none” (или просто удаляем строки, чтобы не засорять код).
Сохраняем изменения, обновляем страницу и видим, что поля исчезли, но заказ работать не будет пока, так как мы не внесли необходимые изменения в контроллере.
Шаг 2. Контроллер
Контроллер отвечает за валидность данных, которые мы вводим на этапе заказа, и проверяем все поля, если мы не внесем изменения, то он будет ожидать данных в тех полях, которые мы скрыли, и ругаться ошибкой Undefined index.
Валидация происходит в файлах
- catalog/controller/checkout/register.php – для зарегистрированных пользователей
- catalog/controller/checkout/guest.php
Начиная с 18 строки контроллер проверяет все поля, которые есть по умолчанию в форме.
if ($country_info && $country_info['postcode_required'] && (utf8_strlen($this->request->post['postcode']) < 2) || (utf8_strlen($this->request->post['postcode']) > 10)) { //$json['error']['postcode'] = $this->language->get('error_postcode'); }
Проходимся по всему файлу и внимательно комментируем все поля, которые мы убрали в шаблоне.
На этом в принципе все, так как мы скрыли поля формы в шаблоне и сказали конроллеру, что нам их использоваться не надо. Но мы сделаем еще один шаг, который будет своебразной “защитой от дурака”, если кто-то будет пытаться передать данные в тех полях, которые мы убрали, то контроллер будет присваивать пустые значения:
if ($this->request->server['REQUEST_METHOD'] == 'POST') { if (!$json) { $this->request->post['postcode'] = ''; .. |
Вот теперь точно все, а наш интернет-магазин готов к обработке лавины заказов перед Новым Годом! С наступающими праздниками!