середу, 12 лютого 2014 р.

OpenCart — убираем обязательные поля в оформлении заказа

Не так давно мы рассмотрели способ удаления лишних шагов при оформлении заказа, вместо шести мы оставили всего лишь 2 шага. Сегодня же разберемся с вопросом о полях, которые помечены звездочкой, с вопросом об обязательных полях. Они обязательны для заполнения, но порой в них просто нет надобности, так что мы постараемся их скрыть, чтобы упростить оформление заказа.


Что мы можем предпринять для осуществления задуманного? Мы можем скрыть поля и удалить проверку на ошибки касательно этих полей.
OpenCart содержит два файла, отвечающих за ввод персональных данных в первом шаге заказа:
 catalog/view/theme/default/template/checkout/register.tpl   при оформлении заказа с регистрацией
 catalog/view/theme/default/template/checkout/guest.tpl  - при гостевом оформлении заказа
Мы рассмотри процесс удаления ненужных для нас полей на примере оформления заказа с регистрацией, но для гостевой регистрации изменения будут идентичны. Редактировать мы будем следующее:
  • удалять поля: Факс, Компания, Company ID и Индекс,
  • редактировать поля «Имя, Отчество» и «Фамилия» — объединим их в одно поле и назовем стандартно «ФИО».
Все изменения рассмотрены на версии 1.5.3.1, на дефолтной теме.
Наши действия: 
1. Перестрахуемся и сохраним файл  catalog/view/theme/default/template/checkout/register.tpl   (всегда может что-то пойти не так, или произведенные действия не возымеют эффекта и т.д.).
2. Факс. В вышеупомянутом файле ищем строки касающиеся факса (19-22 строки):
<?php echo $entry_fax; ?><br />
 <input type="text" name="fax" value="" class="large-field" />
 <br />
 <br />
И либо удаляем их, либо комментируем. Я обычно выбираю второй способ, если та или иная возможность мне еще может понадобиться в будущем.
3. Компания и Company ID . Находим строки о компании и поступаем с ними также, как и с факсом — удаляем или комментируем (приблизительно строки 36-39, 53-57):
<?php echo $entry_company; ?><br />
 <input type="text" name="company" value="" class="large-field" />
 <br />
 <br />
и
<div id="company-id-display"><span id="company-id-required" class="required">*</span> <?php echo $entry_company_id; ?><br />
  <input type="text" name="company_id" value="" class="large-field" />
  <br />
  <br />
  </div>
4. Почтовый Индекс. Все предыдущие поля не были обязательными, с индексом ситуация немного иная, так как это поле обязательно для заполнения и помечено в файле как «required». Поэтому, найдя строки с индексом (75-78), мы их закомментируем
<span id="payment-postcode-required" class="required">*</span><?php echo $entry_postcode; ?><br />
 <input type="text" name="postcode" value="<?php echo $postcode; ?>" class="large-field" />
 <br />
 <br />
и для того, чтобы разобраться с ошибками мы будем также править файлы в контроллере:
 catalog/controller/checkout/register.php  - заказ с регистрацией,
 catalog/controller/checkout/guest.php  - гостевое оформление заказа.
Открываем  register.php и ищем строку с почтовым индексом, комментировать мы будем только его, поскольку все остальные поля, скрытые нами, необязательны для заполнения (приблизительно 23я и 50-54 строки):
$this->data['entry_postcode'] = $this->language->get('entry_postcode');
if (isset($this->session->data['shipping_postcode'])) {
 $this->data['postcode'] = $this->session->data['shipping_postcode']; 
 } else {
 $this->data['postcode'] = '';
 }
5. Для того же, чтобы объединить два поля с «именем, отчеством» и «фамилией» в одно поле, следует в файле catalog/view/theme/default/template/checkout/register.tpl
закомментировать строки (строки 7-10):
<span class="required">*</span><?php echo $entry_lastname; ?><br />
 <input type="text" name="lastname" value="" class="large-field" />
 <br />
 <br />
Мы убрали второе поле, для ввода фамилии, теперь для того, чтобы изменить название поля с «Имя, Отчество» на «ФИО», открываем файл catalog/language/russian/checkout/checkout.php и вносим изменения:
вместо
$_['entry_firstname'] = 'Имя, Отчество:';
прописываем
$_['entry_firstname'] = 'ФИО:';
Поля приобрели необходимый вид и структуру, но обработчик не пропустит покупателя дальше второго шага, так как поле с фамилией было обязательным для заполнения. Снова обращаемся к файлу  catalog/controller/checkout/register.php и комментируем строки (приблизительно 13 и 138-140):
$this->data['entry_lastname'] = $this->language->get('entry_lastname');
if ((utf8_strlen($this->request->post['lastname']) < 1) || (utf8_strlen($this->request->post['lastname']) > 32)) {
 $json['error']['lastname'] = $this->language->get('error_lastname');
 }
Поскольку мы изменяем оформление заказа с регистрацией, то нам теперь необходимо открыть файл catalog/model/account/customer.php и 14 строку:
$this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" . (int)$this->config->get('config_store_id') . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', password = '" . $this->db->escape(md5($data['password'])) . "', newsletter = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', customer_group_id = '" . (int)$customer_group_id . "', ip = '" . $this->db->escape($this->request->server['REMOTE_ADDR']) . "', status = '1', approved = '" . (int)!$customer_group_info['approval'] . "', date_added = NOW()");
изменить на
$this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" . (int)$this->config->get('config_store_id') . "', firstname = '" . $this->db->escape($data['firstname']) . /*"', lastname = '" . $this->db->escape($data['lastname']) .*/ "', email = '" . $this->db->escape($data['email']) . "', telephone = '" . $this->db->escape($data['telephone']) . "', fax = '" . $this->db->escape($data['fax']) . "', password = '" . $this->db->escape(md5($data['password'])) . "', newsletter = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', customer_group_id = '" . (int)$customer_group_id . "', ip = '" . $this->db->escape($this->request->server['REMOTE_ADDR']) . "', status = '1', approved = '" . (int)!$customer_group_info['approval'] . "', date_added = NOW()");
Также меняем 18ю строку:
$this->db->query("INSERT INTO " . DB_PREFIX . "address SET customer_id = '" . (int)$customer_id . "', firstname = '" . $this->db->escape($data['firstname']) . "', lastname = '" . $this->db->escape($data['lastname']) . "', company = '" . $this->db->escape($data['company']) . "', company_id = '" . $this->db->escape($data['company_id']) . "', tax_id = '" . $this->db->escape($data['tax_id']) . "', address_1 = '" . $this->db->escape($data['address_1']) . "', address_2 = '" . $this->db->escape($data['address_2']) . "', city = '" . $this->db->escape($data['city']) . "', postcode = '" . $this->db->escape($data['postcode']) . "', country_id = '" . (int)$data['country_id'] . "', zone_id = '" . (int)$data['zone_id'] . "'");
на
$this->db->query("INSERT INTO " . DB_PREFIX . "address SET customer_id = '" . (int)$customer_id . "', firstname = '" . $this->db->escape($data['firstname']) . /*"', lastname = '" . $this->db->escape($data['lastname']) .*/ "', company = '" . $this->db->escape($data['company']) . "', company_id = '" . $this->db->escape($data['company_id']) . "', tax_id = '" . $this->db->escape($data['tax_id']) . "', address_1 = '" . $this->db->escape($data['address_1']) . "', address_2 = '" . $this->db->escape($data['address_2']) . "', city = '" . $this->db->escape($data['city']) . "', postcode = '" . $this->db->escape($data['postcode']) . "', country_id = '" . (int)$data['country_id'] . "', zone_id = '" . (int)$data['zone_id'] . "'");
Подобными изменениями строк мы лишь закомментировали фамилию.
Вот таким несложным способом мы удалили из второго шага оформления заказа ненужные для нашего магазина поля личных данных покупателя.
Остальные поля, например e-mail или телефон, можно убрать точно таким же способом, каким мы убрали индекс и фамилию.
Напомню еще раз, для того, чтобы править гостевое оформление заказа, то есть без регистрации, необходимо править файлы  catalog/view/theme/default/template/checkout/guest.tpl и  catalog/controller/checkout/guest.php . Принцип действия тот же, только в файле catalog/controller/checkout/guest.php необходимо закомментировать следующие строки:
13
$this->data['entry_lastname'] = $this->language->get('entry_lastname');
приблизительно 189-191
if ((utf8_strlen($this->request->post['lastname']) < 1) || (utf8_strlen($this->request->post['lastname']) > 32)) {
 $json['error']['lastname'] = $this->language->get('error_lastname');
 }
приблизительно 261
$this->session->data['guest']['lastname'] = $this->request->post['lastname'];
приблизительно 267
$this->session->data['guest']['payment']['lastname'] = $this->request->post['lastname'];
и приблизительно 318 строку
$this->session->data['guest']['shipping']['lastname'] = $this->request->post['lastname'];
В результате мы получили второй шаг с уменьшенным количеством полей для заполнения:


Запчасти на Great Wall в ассортименте

4 коментарі:

  1. "И либо удаляем их, либо комментируем."- ростлумачте пожалуйста что означает комментируем!

    ВідповістиВидалити
    Відповіді
    1. Комментарий - это понятие из программирования. Закомментировать код - это значит сделать какой-то кусок кода невидимым для компелятора.
      В PHP комментарии делаются так (с начала строки):
      //эта строчка юудет прогнорирована компелятором

      Видалити
  2. Спасибо за труд! у меня получилось, но в админке появилась строка ошибки:

    Warning: vsprintf() [function.vsprintf]: Too few arguments in C:\OpenServer\domains\site\admin\controller\dashboard\activity.php on line 19

    никак не найду в чем дело, версия 2.1.2.1. Похоже, админка "считает" что нет каких-то данных... Ничего не подскажете?

    ВідповістиВидалити
    Відповіді
    1. Сходу не скажу в чем проблема, нужно разбираться

      Видалити