четверг, 4 апреля 2013 г.

Упрощенная форма оформления заказа без регистрации


В сегодняшнем уроке я покажу, как сделать упрощенное оформление заказа в OpenCart БЕЗ регистрации.
Что имеется под "упрощенная форма"? Это не заказ в один клик, а оптимизация. 
Задача:
- убрать ненужные поля в форме (компания, факс, ид компании, адрес (продолжение), почтовый код);
- структурировать поля.
0. Делаем резервные копии файлов, которые будут редактированы в данном уроке:
\catalog\view\theme\default\template\checkout\guest.tpl
\catalog\view\theme\default\template\checkout\payment_address.tpl
\catalog\view\theme\default\template\checkout\guest_shipping.tpl
\catalog\controller\checkout\guest.php
\catalog\controller\checkout\payment_address.php
\catalog\controller\checkout\guest_shipping.php
\catalog\controller\checkout\confirm.php
\catalog\model\checkout\order.php
Версия OpenCart 1.5.4.1

1. Открываем файл: 
\catalog\view\theme\default\template\checkout\guest.tpl
удаляем:

<?php echo $entry_fax; ?><br />

<input type="text" name="fax" value="<?php echo $fax; ?>" class="large-field" />
<br />
<br />

<?php echo $entry_company; ?><br />
<input type="text" name="company" value="<?php echo $company; ?>" 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="<?php echo $company_id; ?>" class="large-field" />
<br />
<br />

<?php echo $entry_address_2; ?><br />
<input type="text" name="address_2" value="<?php echo $address_2; ?>" class="large-field" />
<br />
<br />

<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 />

2. Ищем файл: 
\catalog\view\theme\default\template\checkout\payment_address.tpl
удаляем:
<tr>
<td><?php echo $entry_company; ?></td>
<td><input type="text" name="company" value="" class="large-field" /></td>
</tr>

<?php if ($company_id_display) { ?>
<tr>
<td><?php if ($company_id_required) { ?>
<span class="required">*</span>
<?php } ?>
<?php echo $entry_company_id; ?></td>
<td><input type="text" name="company_id" value="" class="large-field" /></td>
</tr>
<?php } ?>

<tr>
<td><?php echo $entry_address_2; ?></td>
<td><input type="text" name="address_2" value="" class="large-field" /></td>
</tr>

<tr>
<td><span id="payment-postcode-required" class="required">*</span> <?php echo $entry_postcode; ?></td>
<td><input type="text" name="postcode" value="" class="large-field" /></td>
</tr>

3. Убираем ненужно в: 
\catalog\view\theme\default\template\checkout\guest_shipping.tpl
<tr>
<td><?php echo $entry_company; ?></td>
<td><input type="text" name="company" value="<?php echo $company; ?>" class="large-field" /></td>
</tr>

<tr>
<td><?php echo $entry_address_2; ?></td>
<td><input type="text" name="address_2" value="<?php echo $address_2; ?>" class="large-field" /></td>
</tr>

<tr>
<td><span id="shipping-postcode-required" class="required">*</span> <?php echo $entry_postcode; ?></td>
<td><input type="text" name="postcode" value="<?php echo $postcode; ?>" class="large-field" /></td>
</tr>

4. Теперь работаем с файлами php. 
Открываем:
\catalog\controller\checkout\guest.php
$this->data['entry_address_2'] = $this->language->get('entry_address_2');
$this->data['entry_postcode'] = $this->language->get('entry_postcode');
$this->data['entry_company'] = $this->language->get('entry_company');
$this->data['entry_company_id'] = $this->language->get('entry_company_id');
$this->data['entry_fax'] = $this->language->get('entry_fax');

if (isset($this->session->data['guest']['fax'])) {
$this->data['fax'] = $this->session->data['guest']['fax'];
} else {
$this->data['fax'] = '';
}

if (isset($this->session->data['guest']['payment']['company'])) {
$this->data['company'] = $this->session->data['guest']['payment']['company'];
} else {
$this->data['company'] = '';
}

if ($country_info) {
if ($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');
}

// VAT Validation
$this->load->helper('vat');

if ($this->config->get('config_vat') && $this->request->post['tax_id'] && (vat_validation($country_info['iso_code_2'], $this->request->post['tax_id']) == 'invalid')) {
$json['error']['tax_id'] = $this->language->get('error_vat');
}
}

// Company ID
if (isset($this->session->data['guest']['payment']['company_id'])) {
$this->data['company_id'] = $this->session->data['guest']['payment']['company_id'];
} else {
$this->data['company_id'] = '';
}

if (isset($this->session->data['guest']['payment']['address_2'])) {
$this->data['address_2'] = $this->session->data['guest']['payment']['address_2'];
} else {
$this->data['address_2'] = '';
}

if (isset($this->session->data['guest']['payment']['postcode'])) {
$this->data['postcode'] = $this->session->data['guest']['payment']['postcode'];
} elseif (isset($this->session->data['shipping_postcode'])) {
$this->data['postcode'] = $this->session->data['shipping_postcode'];
} else {
$this->data['postcode'] = '';
}

$this->session->data['guest']['fax'] = $this->request->post['fax'];
$this->session->data['guest']['payment']['company'] = $this->request->post['company'];
$this->session->data['guest']['payment']['company_id'] = $this->request->post['company_id'];
$this->session->data['guest']['payment']['address_2'] = $this->request->post['address_2'];
$this->session->data['guest']['payment']['postcode'] = $this->request->post['postcode'];

$this->session->data['guest']['shipping']['company'] = $this->request->post['company'];
$this->session->data['guest']['shipping']['address_2'] = $this->request->post['address_2'];
$this->session->data['guest']['shipping']['postcode'] = $this->request->post['postcode'];
$this->session->data['shipping_postcode'] = $this->request->post['postcode'];

5. \catalog\controller\checkout\payment_address.php
удаляем ненужное: 
$this->data['entry_company'] = $this->language->get('entry_company');
$this->data['entry_company_id'] = $this->language->get('entry_company_id');
$this->data['entry_address_2'] = $this->language->get('entry_address_2');
$this->data['entry_postcode'] = $this->language->get('entry_postcode');

6. \catalog\controller\checkout\guest_shipping.php
чистим мусор: 
$this->data['entry_company'] = $this->language->get('entry_company');
$this->data['entry_address_2'] = $this->language->get('entry_address_2');
$this->data['entry_postcode'] = $this->language->get('entry_postcode');

if (isset($this->session->data['guest']['shipping']['company'])) {
$this->data['company'] = $this->session->data['guest']['shipping']['company'];
} else {
$this->data['company'] = '';
}

if (isset($this->session->data['guest']['shipping']['address_2'])) {
$this->data['address_2'] = $this->session->data['guest']['shipping']['address_2'];
} else {
$this->data['address_2'] = '';
}

if (isset($this->session->data['guest']['shipping']['postcode'])) {
$this->data['postcode'] = $this->session->data['guest']['shipping']['postcode'];
} elseif (isset($this->session->data['shipping_postcode'])) {
$this->data['postcode'] = $this->session->data['shipping_postcode'];
} else {
$this->data['postcode'] = '';
}

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');
}

$this->session->data['guest']['shipping']['address_2'] = $this->request->post['address_2'];
$this->session->data['guest']['shipping']['company'] = trim($this->request->post['company']);
$this->session->data['guest']['shipping']['postcode'] = $this->request->post['postcode'];

$this->session->data['shipping_postcode'] = $this->request->post['postcode'];

7. Избавляемся от ненужного в: 
\catalog\controller\checkout\confirm.php
$data['fax'] = $this->customer->getFax();
$data['fax'] = $this->session->data['guest']['fax'];

$data['payment_company'] = $payment_address['company'];
$data['payment_company_id'] = $payment_address['company_id'];
$data['payment_address_2'] = $payment_address['address_2'];
$data['payment_postcode'] = $payment_address['postcode'];

$data['shipping_company'] = $shipping_address['company'];
$data['shipping_address_2'] = $shipping_address['address_2'];
$data['shipping_postcode'] = $shipping_address['postcode'];

$data['shipping_company'] = '';
$data['shipping_address_2'] = '';
$data['shipping_postcode'] = '';

8. В этом файле будьте внимательны!!!
\catalog\model\checkout\order.php
на 4 строке (!!!) удалить: 
"', fax = '" . $this->db->escape($data['fax']) .
"', payment_company = '" . $this->db->escape($data['payment_company']) .
"', payment_company_id = '" . $this->db->escape($data['payment_company_id']) .
"', payment_address_2 = '" . $this->db->escape($data['payment_address_2']) .
"', payment_postcode = '" . $this->db->escape($data['payment_postcode']) .
"', shipping_company = '" . $this->db->escape($data['shipping_company']) .
"', shipping_address_2 = '" . $this->db->escape($data['shipping_address_2']) .
"', shipping_postcode = '" . $this->db->escape($data['shipping_postcode']) .
Обратите внимание на структуру кода! Масив начинается с "',  и заканчивается:  . ! Смотрите что удаляете. В противном случае получите ошибку sql. 
9. Вот и сказочки конец, а кто сделал - молодец :)


20 комментариев:

  1. Анонимный14 мая, 2013 22:35

    VOT ETA DA!!!! SPASİBO VAM BOLSHOE İZ TURTSİİ!! VSE POLUCHİLOS:d

    ОтветитьУдалить
    Ответы
    1. Анонимный14 мая, 2013 23:31

      Для добрых людей ничего не жалко :)

      Удалить
  2. Анонимный11 июня, 2013 20:29

    при удалении с этого файла блока ДИВ не забудьте удалить еще и его закрывающий тег /ДИВ

    \catalog\view\theme\default\template\checkout\guest.tpl

    иначе будет корявое смещение полей страны и региона

    ОтветитьУдалить
  3. СПАСИБО огромное за выложенный материал. Помогло как никогда. Весьма благодарен.

    ОтветитьУдалить
  4. Анонимный12 июня, 2013 16:07

    Выдаёт ошибку в случае если зарегистрированный пользователь хочет изменить адрес доставки.

    ОтветитьУдалить
    Ответы
    1. Анонимный12 июня, 2013 23:52

      Попробуем у себя создать этот еррор, отпишусь вскоре.

      Удалить
  5. Владислав12 июня, 2013 17:40

    В продолжение темы ошибки при вводе другого адреса у зарегистрированного пользователя:
    пишет что ошибка в файле paymant-address.php на строке 210 и связана с postcode. Пробовал эту строку закомментировать, но выдаёт другую ошибку.
    Как это лечится ?

    ОтветитьУдалить
    Ответы
    1. Анонимный12 июня, 2013 23:53

      Вскоре, если эту ошибку создам у себя - напишу ответ или решение проблемы.

      Удалить
  6. Владислав13 июня, 2013 21:22

    Разобрался. Чтобы не было ошибки при если заказ делает зарегистрированный пользователь и при этом желает поменять адрес доставки, к выше описанному необходимо:
    1. внести доп правку в файл Payment-address.php:
    Закомментируем или вырезаем
    if ($country_info) {
    if ($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');
    }

    // VAT Validation
    $this->load->helper('vat');

    if ($this->config->get('config_vat') && !empty($this->request->post['tax_id']) && (vat_validation($country_info['iso_code_2'], $this->request->post['tax_id']) == 'invalid')) {
    $json['error']['tax_id'] = $this->language->get('error_vat');
    }
    }

    2. Правим файл сatalog\controller\ checkout \register.php аналогично убираем строки с нашими полями.

    3.template\checkout\register.tpl аналогично убираем строки с нашими полями.

    4. Catalog\model\account\address.php правим 4 строчку (убираем инфо по нашим полям аналогично order.php).

    ВСЁ.

    ОтветитьУдалить
    Ответы
    1. Проблема решена? Готовлю статью о упрошенной регистрации.

      Удалить
    2. А можно ли поподробнее по этим полям? не пойму что убирать...2. Правим файл сatalog\controller\ checkout \register.php аналогично убираем строки с нашими полями.

      3.template\checkout\register.tpl аналогично убираем строки с нашими полями.

      4. Catalog\model\account\address.php правим 4 строчку (убираем инфо по нашим полям аналогично order.php).

      Удалить
  7. спасибо, все получилось! только теперь в поле "город" при оформлении заказа уже стоит это Notice: Undefined variable: city in Z:\home\ocStore\www\catalog\view\theme\default\template\checkout\guest.tpl on line 55
    я что-то не так сделала? )спасибо за помощь!

    ОтветитьУдалить
  8. Хорошая статья. Только бы еще проще заказ сделать бы:) Без шагов. ну или 2 максимум - ввести имя, телефон и на втором подтвердить стоимость доставки, комментарий и отправить заявку

    ОтветитьУдалить
  9. Добрый день! Не подскажете после скрытия и комментирования все было в порядке , рпопускала на 3-ий шаг, а после чистки кукисов , велезает Undefined index: shipping_address in C:\home\localhost\www\brelok\catalog\controller\checkout\guest.php on line 316
    в shipping_address.php надо копаться?
    Спасибо, статья отличная.

    ОтветитьУдалить
  10. Как поправить всё это в админке, чтобы можно было изменять информацию клиента ? А то пытаешься что то поправить, так оно запрашивает всё по полной программе.

    ОтветитьУдалить
    Ответы
    1. Нужно изменить проверочный файл php, который проверяет, заполненность полей отправляемой формы. Его нужно искать тут: admin\controller\checkout

      Удалить
    2. Пробовал менять:
      admin\model\sale\order.php
      admin\controller\sale
      admin\view\template\sale\order_form.tpl

      Ругается на:
      \vqmod\vqcache\vq2-admin_controller_sale_order.php
      и шрифт слетает (появляются каракатицы вместо букв).

      Попробую admin\controller\checkout

      Удалить
  11. В admin\controller\ нет checkout . У меня версия OcStore 1.5.4.1.

    ОтветитьУдалить
  12. Пожалуйста, скажите как так-же сделать на 2.1.0.1! Сотни благодарностей и тонны трафика заранее)

    ОтветитьУдалить
    Ответы
    1. Добрый вечер.
      Возможно скоро
      тот урок будет переделан для версии 3.*.* на новой блоге GloGla.net. В этом блоге новые посты уже не будут появляться...

      Удалить