В сегодняшнем уроке я покажу, как сделать упрощенное оформление заказа в 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. Вот и сказочки конец, а кто сделал - молодец :)
VOT ETA DA!!!! SPASİBO VAM BOLSHOE İZ TURTSİİ!! VSE POLUCHİLOS:d
ОтветитьУдалитьДля добрых людей ничего не жалко :)
Удалитьпри удалении с этого файла блока ДИВ не забудьте удалить еще и его закрывающий тег /ДИВ
ОтветитьУдалить\catalog\view\theme\default\template\checkout\guest.tpl
иначе будет корявое смещение полей страны и региона
СПАСИБО огромное за выложенный материал. Помогло как никогда. Весьма благодарен.
ОтветитьУдалитьВыдаёт ошибку в случае если зарегистрированный пользователь хочет изменить адрес доставки.
ОтветитьУдалитьПопробуем у себя создать этот еррор, отпишусь вскоре.
УдалитьВ продолжение темы ошибки при вводе другого адреса у зарегистрированного пользователя:
ОтветитьУдалитьпишет что ошибка в файле paymant-address.php на строке 210 и связана с postcode. Пробовал эту строку закомментировать, но выдаёт другую ошибку.
Как это лечится ?
Вскоре, если эту ошибку создам у себя - напишу ответ или решение проблемы.
УдалитьРазобрался. Чтобы не было ошибки при если заказ делает зарегистрированный пользователь и при этом желает поменять адрес доставки, к выше описанному необходимо:
ОтветитьУдалить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).
ВСЁ.
Проблема решена? Готовлю статью о упрошенной регистрации.
УдалитьА можно ли поподробнее по этим полям? не пойму что убирать...2. Правим файл сatalog\controller\ checkout \register.php аналогично убираем строки с нашими полями.
Удалить3.template\checkout\register.tpl аналогично убираем строки с нашими полями.
4. Catalog\model\account\address.php правим 4 строчку (убираем инфо по нашим полям аналогично order.php).
спасибо, все получилось! только теперь в поле "город" при оформлении заказа уже стоит это Notice: Undefined variable: city in Z:\home\ocStore\www\catalog\view\theme\default\template\checkout\guest.tpl on line 55
ОтветитьУдалитья что-то не так сделала? )спасибо за помощь!
Хорошая статья. Только бы еще проще заказ сделать бы:) Без шагов. ну или 2 максимум - ввести имя, телефон и на втором подтвердить стоимость доставки, комментарий и отправить заявку
ОтветитьУдалитьДобрый день! Не подскажете после скрытия и комментирования все было в порядке , рпопускала на 3-ий шаг, а после чистки кукисов , велезает Undefined index: shipping_address in C:\home\localhost\www\brelok\catalog\controller\checkout\guest.php on line 316
ОтветитьУдалитьв shipping_address.php надо копаться?
Спасибо, статья отличная.
Как поправить всё это в админке, чтобы можно было изменять информацию клиента ? А то пытаешься что то поправить, так оно запрашивает всё по полной программе.
ОтветитьУдалитьНужно изменить проверочный файл php, который проверяет, заполненность полей отправляемой формы. Его нужно искать тут: admin\controller\checkout
УдалитьПробовал менять:
Удалить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
В admin\controller\ нет checkout . У меня версия OcStore 1.5.4.1.
ОтветитьУдалитьПожалуйста, скажите как так-же сделать на 2.1.0.1! Сотни благодарностей и тонны трафика заранее)
ОтветитьУдалитьДобрый вечер.
УдалитьВозможно скоро
тот урок будет переделан для версии 3.*.* на новой блоге GloGla.net. В этом блоге новые посты уже не будут появляться...