Opencart 3 — письмо админу о заказе со всей информацией

opencart

Расширенное письмо о заказе админу

Я только только разбираюсь с Opencart 3 и не очень люблю ставить непонятные дополнение, а люблю все разбирать и изучать и вот после того как клиенту запустили сайт и в этот же день после первого заказа было принято решение переработать письмо которое приходит админу и менеджеру о заказе, а именно что бы в письме было:

  • имя
  • фамилия
  • телефон
  • адрес
  • город
  • способ оплаты
  • способ доставки

Итого, нужно все поля которые заполняет покупатель на сайте.

В итоге вот к чему пришел.

Когда клиент оформляет заказ, то ему при ходит письмо со всей информацией:

opencart письмо администратору

тогда как администратору приходит вот такое вот грустное письмо(((

Opencart 3 - письмо админу о заказе со всей информацией

 

НУ как вы понимаете, а точнее кто хоть раз держал свои интернет магазины, сразу скажет, что это никуда не годится, не позвонить, ни узнать какую то информацию и что бы получить более подробную информацию надо заходить в админку,а если вы в пути и не можете зайти в админку?

НУ в итоге я пошел другим путем и сделал просто подмену писем, т.е. админу будет приходить такое же письмо как и клиенту)

а теперь немного магии и дело в шляпе)

Opencart 3 письмо админу о заказе

Для того что бы в opencart письмо админу о заказе вся информация приходила в письме, нужно править два файла:

  1. /catalog/controller/mail/order.php
  2. /catalog/view/theme/yourtheme/template/mail/order_alert.twig

 

order.php

Открываем файл order.php и ищем строку 270 где есть такой текст:

$mail->setTo($order_info[’email’]);
$mail->setFrom($from);
$mail->setSender(html_entity_decode($order_info[‘store_name’], ENT_QUOTES, ‘UTF-8’));
$mail->setSubject(html_entity_decode(sprintf($language->get(‘text_subject’), $order_info[‘store_name’], $order_info[‘order_id’]), ENT_QUOTES, ‘UTF-8’));
$mail->setHtml($this->load->view(‘mail/order_add’, $data));
$mail->send();

Под ним вставляем этот код:

$mail->setTo($this->config->get(‘config_email’));
$mail->setFrom($this->config->get(‘config_email’));
$mail->setSender(html_entity_decode($order_info[‘store_name’], ENT_QUOTES, ‘UTF-8’));
$mail->setSubject(html_entity_decode(sprintf($this->language->get(‘text_subject’), $this->config->get(‘config_name’), $order_info[‘order_id’]), ENT_QUOTES, ‘UTF-8’));
$mail->setHtml($this->load->view(‘mail1/order_alert’, $data));
$mail->send();

Данная вставка кода была вставлена в раздел где формируется и отправляется письмо покупателю, и мы такое же письмо отправляем еще и администратору как видите мы подставили шаблон письма order_alert )))

 

order_alert.twig

То что мы сделали выше по факту ничего не изменит, нам будет приходить все то же убогое письмо, а все потому что мы еще не изменили шаблон письма который должен приходить администратору!

Смотрите, я делал все на стандартном шаблоне Opencart с темой default и поэтому я создавал специально для этого папку mail1 и в ней создаем файл order_alert.twig , если же у вас своя тема, то просто создаете папку mail если ее там нет

Данные для файла order_alert.twig полностью копируем из файла order_add.twig (который лежит по адресу /catalog/view/theme/default/template/mail )

После этого нам на почту придет вот такое письмо)

Opencart 3 - письмо админу о заказе со всей информацией

 

Скачать готовый модификатор

Либо можете скачать модификатор для изменения внешнего вида письма о заказе для opencart 3

скачать модификатор письма админу

 

Ну и как обычно видео ))

nibbl
Оцените автора
NIBBL
Добавить комментарий

  1. Павел

    Странное решение, а самое главное что у меня не заработало.
    Зато заработало немного другое- в том месте order.php где речь идёт про алерт админу поменял тип письма с txt на html, далее вставил после:
    $data[‘order_id’] = $order_info[‘order_id’]; (365 строка у меня, у других может быть где-то рядом но не точно эта) инфу из верхней части, а именно:
    $data[‘date_added’] = date($this->language->get(‘date_format_short’), strtotime($order_info[‘date_added’]));
    $data[‘payment_method’] = $order_info[‘payment_method’];
    $data[‘shipping_method’] = $order_info[‘shipping_method’];
    $data[’email’] = $order_info[’email’];
    $data[‘telephone’] = $order_info[‘telephone’];
    $data[‘ip’] = $order_info[‘ip’];

    $order_status_query = $this->db->query(«SELECT * FROM » . DB_PREFIX . «order_status WHERE order_status_id = ‘» . (int)$order_status_id . «‘ AND language_id = ‘» . (int)$order_info[‘language_id’] . «‘»);

    if ($order_status_query->num_rows) {
    $data[‘order_status’] = $order_status_query->row[‘name’];
    } else {
    $data[‘order_status’] = »;
    }

    if ($comment && $notify) {
    $data[‘comment’] = nl2br($comment);
    } else {
    $data[‘comment’] = »;
    }

    if ($order_info[‘payment_address_format’]) {
    $format = $order_info[‘payment_address_format’];
    } else {
    $format = ‘{firstname} {lastname}’ . «n» . ‘{company}’ . «n» . ‘{address_1}’ . «n» . ‘{address_2}’ . «n» . ‘{city} {postcode}’ . «n» . ‘{zone}’ . «n» . ‘{country}’;
    }

    $find = array(
    ‘{firstname}’,
    ‘{lastname}’,
    ‘{company}’,
    ‘{address_1}’,
    ‘{address_2}’,
    ‘{city}’,
    ‘{postcode}’,
    ‘{zone}’,
    ‘{zone_code}’,
    ‘{country}’
    );

    $replace = array(
    ‘firstname’ => $order_info[‘payment_firstname’],
    ‘address_1’ => $order_info[‘payment_address_1’],
    ‘city’ => $order_info[‘payment_city’],
    ‘zone’ => $order_info[‘payment_zone’],
    ‘zone_code’ => $order_info[‘payment_zone_code’],
    ‘country’ => $order_info[‘payment_country’]
    );

    $data[‘payment_address’] = str_replace(array(«rn», «r», «n»), », preg_replace(array(«/ss+/», «/rr+/», «/nn+/»), », trim(str_replace($find, $replace, $format))));

    if ($order_info[‘shipping_address_format’]) {
    $format = $order_info[‘shipping_address_format’];
    } else {
    $format = ‘{firstname} {lastname}’ . «n» . ‘{company}’ . «n» . ‘{address_1}’ . «n» . ‘{address_2}’ . «n» . ‘{city} {postcode}’ . «n» . ‘{zone}’ . «n» . ‘{country}’;
    }

    $find = array(
    ‘{firstname}’,
    ‘{lastname}’,
    ‘{company}’,
    ‘{address_1}’,
    ‘{address_2}’,
    ‘{city}’,
    ‘{postcode}’,
    ‘{zone}’,
    ‘{zone_code}’,
    ‘{country}’
    );

    $replace = array(
    ‘firstname’ => $order_info[‘shipping_firstname’],
    ‘address_1’ => $order_info[‘shipping_address_1’],
    ‘city’ => $order_info[‘shipping_city’],
    ‘zone’ => $order_info[‘shipping_zone’],
    ‘zone_code’ => $order_info[‘shipping_zone_code’],
    ‘country’ => $order_info[‘shipping_country’]
    );

    $data[‘shipping_address’] = str_replace(array(«rn», «r», «n»), », preg_replace(array(«/ss+/», «/rr+/», «/nn+/»), », trim(str_replace($find, $replace, $format))));

    $this->load->model(‘tool/upload’);
    Далее скопировал все из order_add.twig и заменил им действующий order_alert- впрочем как вы и рекомендовали. И всё заработало как надо. А вот при вашем решение при нажатии «оформить заказ» клиенту выпадала ошибка.

    Ответить
    1. nibbl автор

      вполне возможно, Ваш вариант тоже опробую через некоторое время. Кстати почему мой способ не сработал у Вас потому как у меня был opencart 3 а не ocstore может из за этого.

      Ответить
      1. Павел

        У меня Opencart 3.0.2.0

        Ответить
        1. Наталья

          Павел. Опишите, что вы сделали точнее, пожалуйста, у меня так же, при нажатии «оформить заказ» клиенту выпадает ошибка.

          Ответить
  2. Юлия

    Добрый день. а как быть, если человек при оформлении заказа выбирает пункт выдачи, но мне в письме оно не высвечивается? в итоге мне приходится звонить и переспрашивать((

    Ответить
    1. nibbl автор

      не очень понял вопроса, пишите на почту, разберемся

      Ответить
  3. Mari

    Нормальное решение. Но работать не будет из-за одной ошибки
    $mail->setHtml($this->load->view(‘mail1/order_alert‘, $data));
    Убираем единицу в mail1 и все заработает

    Ответить
  4. Bogdan

    Приходит два письма, одно нормальное с html таблицой, а в другом просто код весь 🙁

    Ответить
    1. nibbl автор

      вы делали по инструкции?
      я уже третий сайт делаю и все норм

      Ответить
      1. Bogdan

        Да, все по инструкции

        И еще исправьте в инструкции mail1/order_alert‘, $data) , потому что не срабатывает, нужно менять название папки, как писали в комментарии ниже

        Ответить
        1. nibbl автор

          сейчас проверю. Спасибо!

          Ответить
  5. Виктор

    Сообщение для администратора формируется для 2-х адресов. Основного и дополнительного, переделанный заказ приходит только на основной. У меня основной адрес не был настроен. И переделанное сообщение не приходило. Настроил основной и сообщения стали приходить 😉

    Делал по видео и вставка во 2-ой строке там отличается от той, что в статье.

    $mail->setTo($this->config->get(‘config_email’));
    $mail->setFrom($from);
    $mail->setSender(html_entity_decode($order_info[‘store_name’], ENT_QUOTES, ‘UTF-8’));

    Спасибо автору 😎 !

    Ответить
  6. Валя

    Добрый день!
    В теме письма администратору приходит текст «text_subject», как его поменть? Заранее спасибо!

    Ответить
    1. nibbl автор

      смотрите языковой файл либо прямо в коде письмо можно заменить на свой текст

      Ответить
  7. Олександр

    Решение нормальное , только есть замечания.
    1. Убрать из кода mail1 , прописать mail
    2. Чтобы не приходило по 3 письма , а только такое же как покупателю , после 338 строчки в order.php
    начиная с 339 public function alert(&$route, &$args) {
    и до конца , кроме самой последней дужки }
    удалить весь код

    Ответить
    1. nibbl автор

      возможно, но мне три письма не приходит

      Ответить
    2. Эдуард

      Здравствуйте. Я тоже получаю по три письма после заказа с регистрацией и по два письма, когда просто регистрируюсь. Как я вас понял, вывод письма в файле: catalog/controller/mail/order.php. Как понять удалить весь код, начиная с 339 public function alert(&$route, &$args) {

      Ответить
  8. Максим

    Это все хорошо вот только коменты не приходят)) как исправить?

    Ответить
    1. nibbl автор

      вероятно вы удалили или не добавили блок отвечающий за них, смогу посмотреть только к выходным если не забуду (сейчас аврал) подпишитесь на youtube канал я туда сброшу вам инструкцию

      Ответить
  9. Lobo

    Попробую и я.

    Ответить
  10. Эдуард

    Здравствуйте. Я тоже получаю по три письма после заказа с регистрацией и по два письма, когда просто регистрируюсь. Как я вас понял, вывод письма в файле: catalog/controller/mail/order.php. Как понять удалить весь код, начиная с 339 public function alert(&$route, &$args) {

    Ответить
    1. nibbl автор

      https://yadi.sk/i/n7rLsximDnD5ag уберите тут галочку и не будут приходить

      Ответить
  11. Радомир

    Благодарю, решение рабочее, правда с нуля не заработало, выдавало ошибку. Начал разбираться, благодаря комментариям понял, что нужно изменить mail/order_edit — убрав еденицу из пути до файла. Потом опять пошли ошибки. Оказалось, что тупо ковычки, которые обрамляют конструкции ‘mail/order_edit’ были не рабочие, вероятно результат копирования, поменял на рабочие. Ну и пришлось менять $mail->setHtml что бы письма приходили не в тексте. Кому надо, вот мой исправленный код:

    $mail->setTo($this->config->get(‘config_email’));
    $mail->setFrom($this->config->get(‘config_email’));
    $mail->setSender(html_entity_decode($order_info[‘store_name’], ENT_QUOTES, ‘UTF-8’));
    $mail->setSubject(html_entity_decode(sprintf($this->language->get(‘text_subject’), $this->config->get(‘config_name’), $order_info[‘order_id’]), ENT_QUOTES, ‘UTF-8’));
    $mail->setHtml($this->load->view(‘mail/order_alert’, $data));
    $mail->send();

    Ответить