Ruslan Brest, rb.labtodo.com
Backend web-developer: CodeIgniter, PHP, MySQL, OpenCart, PrestaShop, MaxSite CMS

Quickcheckout: как сделать необязательным поле email?

Как скрыть "Адрес доставки: Адрес (продолжение):"

открыть файл catalog/view/theme/default/template/checkout/quickcheckout.tpl

найти там:

<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>) изменить на:

<tr style="display:none;">

Как сделать ввод почтового ящика необязательным

в этом же файле найдите чуть выше строку

<td><span class="required">*</span> <?php echo $entry_email; ?></td>

из неё надо убрать звёздочку:

<td><?php echo $entry_email; ?></td>

Дальше надо найти и открыть файл catalog/controller/checkout/quickcheckout_address.php

найти там строки (#30-33)

$l = utf8_strlen($this->request->post['email']);
                                if (($l < 1) || ($l > 96) || !preg_match('/^[^\@]+@.*\.[a-z]{2,6}$/i', $this->request->post['email'])) {
                                        $json['error']['email'] = $this->language->get('error_email');
                                }

и закомментировать их. На этом изменения в модуле закончены, их должно быть достаточно.

После этого надо исправить в движке Опенкарт часть, которая отсылает письма

Надо открыть файл catalog/model/checkout/order.php

найти там строку:

// Admin Alert Mail

(у меня это строка #438)

Над ней будет блок, который выглядит так:

$mail = new Mail();
                                $mail->protocol = $this->config->get('config_mail_protocol');
                                $mail->parameter = $this->config->get('config_mail_parameter');
                                $mail->hostname = $this->config->get('config_smtp_host');
                                $mail->username = $this->config->get('config_smtp_username');
                                $mail->password = $this->config->get('config_smtp_password');
                                $mail->port = $this->config->get('config_smtp_port');
                                $mail->timeout = $this->config->get('config_smtp_timeout');
                                $mail->setTo($order_info['email']);
                                $mail->setFrom($this->config->get('config_email'));
                                $mail->setSender($order_info['store_name']);
                                $mail->setSubject($subject);
                                $mail->setHtml($html);
                                $mail->setText(html_entity_decode($text, ENT_QUOTES, 'UTF-8'));
                                $mail->addAttachment(DIR_IMAGE . $this->config->get('config_logo'), md5(basename($this->config->get('config
_logo'))));
                                $mail->send();

Его надо заменить на такой:

if( !empty($order_info['email']) )
                        {
                                $mail = new Mail();
                                $mail->protocol = $this->config->get('config_mail_protocol');
                                $mail->parameter = $this->config->get('config_mail_parameter');
                                $mail->hostname = $this->config->get('config_smtp_host');
                                $mail->username = $this->config->get('config_smtp_username');
                                $mail->password = $this->config->get('config_smtp_password');
                                $mail->port = $this->config->get('config_smtp_port');
                                $mail->timeout = $this->config->get('config_smtp_timeout');
                                $mail->setTo($order_info['email']);
                                $mail->setFrom($this->config->get('config_email'));
                                $mail->setSender($order_info['store_name']);
                                $mail->setSubject($subject);
                                $mail->setHtml($html);
                                $mail->setText(html_entity_decode($text, ENT_QUOTES, 'UTF-8'));
                                $mail->addAttachment(DIR_IMAGE . $this->config->get('config_logo'), md5(basename($this->config->get('config
_logo'))));
                                $mail->send();
                        }

то есть сверху добавится условие, снизу - закрывающая скобка.

После этого всё должно работать без обязательного заполнения покупателем поля Email.

См. также:

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us
Комментариев: 5
  1. Зачем таким сложным способом отключать обязательность заполнения email? Нельзя ли в файле catalog/view/theme/default/template/checkout/quickcheckout.tpl добавить условие что если поле email пустое, то по умолчанию присвоить значение какого либо ящика info@example.ru

  2. 2012-07-09 в 19:35:33 | Ruslan Brest

    В случае ошибок в других полях этот адрес будет светиться и смущать покупателей, которые его не вводили. Это как минимум. По-моему, была ещё какая-то причина, почему этот способ был забракован. Как минимум объяснять ещё людям, как это настраивать, где менять этот спец. адрес, и ещё что я не хакер, пытающийся отослать куда-то их данные на неизвестный им email, который они случайно в коде обнаружили и т.п.

    Вылавливать дополнительно этот специальный адрес, чтобы не отображать его при показе ошибок? И в чём тогда разница - нагромождать здесь кучу логики и обходных путей вместо того, чтобы один раз нормально сделать?

    P.S. Что сложного в этом способе?

  3. Звучит очень убедительно )))) Не то чтобы этот способ сложный, просто он затрагивает файлы движка и в случае перехода на новую версию придется опять вносить исправления.

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

    Когда уже будет реализовано автоматическое обновление в опенкарт?

    Или уже что то есть?

  5. 2012-12-21 в 21:47:37 | Дмитрий

    Спасибо за блог и решения и стиль их описания. Очень полезно, внятно для начинающих

Оставьте комментарий!

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

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

Авторизация  Facebook. MaxSiteAuth. Loginza

(обязательно)