Расширенное письмо о заказе админу
Я только только разбираюсь с Opencart 3 и не очень люблю ставить непонятные дополнение, а люблю все разбирать и изучать и вот после того как клиенту запустили сайт и в этот же день после первого заказа было принято решение переработать письмо которое приходит админу и менеджеру о заказе, а именно что бы в письме было:
- имя
- фамилия
- телефон
- адрес
- город
- способ оплаты
- способ доставки
Итого, нужно все поля которые заполняет покупатель на сайте.
В итоге вот к чему пришел.
Когда клиент оформляет заказ, то ему при ходит письмо со всей информацией:
тогда как администратору приходит вот такое вот грустное письмо(((
НУ как вы понимаете, а точнее кто хоть раз держал свои интернет магазины, сразу скажет, что это никуда не годится, не позвонить, ни узнать какую то информацию и что бы получить более подробную информацию надо заходить в админку,а если вы в пути и не можете зайти в админку?
НУ в итоге я пошел другим путем и сделал просто подмену писем, т.е. админу будет приходить такое же письмо как и клиенту)
а теперь немного магии и дело в шляпе)
Opencart 3 письмо админу о заказе
Для того что бы в opencart письмо админу о заказе вся информация приходила в письме, нужно править два файла:
- /catalog/controller/mail/order.php
- /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
скачать модификатор письма админу
Ну и как обычно видео ))
Странное решение, а самое главное что у меня не заработало.
Зато заработало немного другое- в том месте 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- впрочем как вы и рекомендовали. И всё заработало как надо. А вот при вашем решение при нажатии «оформить заказ» клиенту выпадала ошибка.
вполне возможно, Ваш вариант тоже опробую через некоторое время. Кстати почему мой способ не сработал у Вас потому как у меня был opencart 3 а не ocstore может из за этого.
У меня Opencart 3.0.2.0
Павел. Опишите, что вы сделали точнее, пожалуйста, у меня так же, при нажатии «оформить заказ» клиенту выпадает ошибка.
Добрый день. а как быть, если человек при оформлении заказа выбирает пункт выдачи, но мне в письме оно не высвечивается? в итоге мне приходится звонить и переспрашивать((
не очень понял вопроса, пишите на почту, разберемся
Нормальное решение. Но работать не будет из-за одной ошибки
$mail->setHtml($this->load->view(‘mail1/order_alert‘, $data));
Убираем единицу в mail1 и все заработает
Приходит два письма, одно нормальное с html таблицой, а в другом просто код весь 🙁
вы делали по инструкции?
я уже третий сайт делаю и все норм
Да, все по инструкции
И еще исправьте в инструкции mail1/order_alert‘, $data) , потому что не срабатывает, нужно менять название папки, как писали в комментарии ниже
сейчас проверю. Спасибо!
Сообщение для администратора формируется для 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’));
Спасибо автору 😎 !
Добрый день!
В теме письма администратору приходит текст «text_subject», как его поменть? Заранее спасибо!
смотрите языковой файл либо прямо в коде письмо можно заменить на свой текст
Решение нормальное , только есть замечания.
1. Убрать из кода mail1 , прописать mail
2. Чтобы не приходило по 3 письма , а только такое же как покупателю , после 338 строчки в order.php
начиная с 339 public function alert(&$route, &$args) {
и до конца , кроме самой последней дужки }
удалить весь код
возможно, но мне три письма не приходит
Здравствуйте. Я тоже получаю по три письма после заказа с регистрацией и по два письма, когда просто регистрируюсь. Как я вас понял, вывод письма в файле: catalog/controller/mail/order.php. Как понять удалить весь код, начиная с 339 public function alert(&$route, &$args) {
Это все хорошо вот только коменты не приходят)) как исправить?
вероятно вы удалили или не добавили блок отвечающий за них, смогу посмотреть только к выходным если не забуду (сейчас аврал) подпишитесь на youtube канал я туда сброшу вам инструкцию
Попробую и я.
Здравствуйте. Я тоже получаю по три письма после заказа с регистрацией и по два письма, когда просто регистрируюсь. Как я вас понял, вывод письма в файле: catalog/controller/mail/order.php. Как понять удалить весь код, начиная с 339 public function alert(&$route, &$args) {
https://yadi.sk/i/n7rLsximDnD5ag уберите тут галочку и не будут приходить
Благодарю, решение рабочее, правда с нуля не заработало, выдавало ошибку. Начал разбираться, благодаря комментариям понял, что нужно изменить 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();