Урок 29 Меняем шаблон письма админу на Opencart 3
В одном из уроков мы уже разбирались, как отправить уведомление администратору о смене статуса заказа. Сегодня же я хотел остановиться на одном недочете, на мой взгляд, который есть в 3 опенкарте.
Уверен, раз вы читаете данную статью, Вы заметили, что в третьем опенкарте письмо о заказе, которое приходит администратору, сократили до безобразия, в отличии от того же ocstore 2.3, где письмо содержит подробную информацию.
Кто то может сказать, что достаточно сообщения о том, что есть заказ и его детали можно посмотреть в админке. Возможно, однако это с ПК может и относительно удобно, однако со смартфона работать в админ панели ocstore то еще удовольствие. А если еще и интернет «тугой»… В общем Вы поняли. Гораздо удобнее сразу на почте увидеть всю необходимую информацию о заказе и оперативно связаться с клиентом для уточнения деталей.
Изобретать велосипед мы не будем, хотя можно было бы. Пойдем по пути наименьшего сопротивления и сделаем все буквально за несколько минут. Изменения будут вноситься только в двух файлах:
- контроллер
- шаблон
Рекомендую сделать резервные копии этих файлов, чтобы можно было быстро откатиться если что то сделаете не правильно.
Поехали?
Открываем файл контроллера
1 |
/catalog/controller/mail/order.php |
Сначала необходимо убрать часть кода, который ранее отправлял письмо администратору, чтобы не было дублей писем. Для этого необходимо удалить код с 333 по 472 строку включительно. Начинается он со строк
1 2 |
// Admin Alert Mail public function alert(&$route, &$args) { |
Далее в этом же файле примерно на 276 строке сразу после
1 2 3 4 5 6 |
$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(); |
Вставляем
1 2 3 4 5 6 |
$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('ЗДЕСЬ_УКАЖИТЕ_ОГЛАВЛЕНИЕ_ПИСЬМА'), ENT_QUOTES, 'UTF-8')); $mail->setHtml($this->load->view('mail/order_alert', $data)); $mail->send(); |
Пропишите нужную тему письма для идентификации. Например, Письмо с сайта www…
С контроллером закончили. Теперь необходимо изменить содержание письма о заказе, которое будет приходить на почту администратора магазина, а соответственно переходим к правке шаблона письма. Открываем файл
1 |
/catalog/view/theme/yourtheme/template/mail/order_alert.twig |
По сути мы перенесем в него содержимое файла
1 |
/catalog/view/theme/yourtheme/template/mail/order_add.twig |
с одним отличием, а именно удалим строку
<p style=»margin-top: 0px; margin-bottom: 20px;»>{{ text_greeting }}</p>
1 |
<p style="margin-top: 0px; margin-bottom: 20px;">{{ text_greeting }}</p> |
Теперь сохраняем и заливаем измененный файлы. Не забываем обновлять модификаторы и чистить кеш. Это крайне важно на 3 линейке опенкарта. Если все сделано правильно, то после оформления заказа Вы должны увидеть следующее сообщение на почте
P.S. Задали вопрос, что пропал комментарий к заказу от покупателя. Виду того что мы используем шаблон письма, которое приходит покупателю, в нем отсутствует комментарий к заказу. Для того, чтобы Вам приходил комментарий необходимо сделать доработки в контроллере и шаблоне. Начнем с контроллера
1 |
/catalog/controller/mail/order.php |
Находим первое вхождение примерно на 265 строке
1 |
$mail = new Mail($this->config->get('config_mail_engine')); |
И перед ним добавляем
1 |
$data['comment'] = strip_tags($order_info['comment']); |
В этом же файле находим фрагмент кода
1 |
$data['text_greeting'] = sprintf($language->get('text_greeting'), $order_info['store_name']); |
и под ним добавляем
1 |
$data['text_comment'] = $this->language->get('text_comment'); |
Все. С контроллером закончили, переходим к шаблону письма.
1 |
/catalog/view/theme/yourtheme/template/mail/order_alert.twig |
добавьте код.
1 2 3 4 5 |
{% if comment %} {{ text_comment }} {{ comment }} {% endif %} |
Ну и соответственно стилистически уже подгоните под свои потребности.
Изменяем письмо админу на opencart 3: Вариант 2
Метод описанный выше, может сработать не на всех сборках, особенно если шаблон не стандартный. Ниже дам еще один вариант.
Открываем файл контроллера
1 |
/catalog/controller/mail/order.php |
И меняем строчку
1 |
public function alert(&$route, &$args) { |
на следующий код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
public function alert(&$route, &$args) { if (isset($args[0])) { $order_id = $args[0]; } else { $order_id = 0; } if (isset($args[1])) { $order_status_id = $args[1]; } else { $order_status_id = 0; } if (isset($args[2])) { $comment = $args[2]; } else { $comment = ''; } if (isset($args[3])) { $notify = $args[3]; } else { $notify = ''; } $order_info = $this->model_checkout_order->getOrder($order_id); $order_products = $this->model_checkout_order->getOrderProducts($order_id); $download_status = false; // Load the language for any mails that might be required to be sent out $language = new Language($order_info['language_code']); $language->load($order_info['language_code']); $language->load('mail/order_add'); // HTML Mail $data['title'] = sprintf($language->get('text_subject'), $order_info['store_name'], $order_info['order_id']); $data['text_greeting'] = ''; $data['text_link'] = ''; $data['text_download'] = ''; $data['text_order_detail'] = $language->get('text_order_detail'); $data['text_instruction'] = $language->get('text_instruction'); $data['text_order_id'] = $language->get('text_order_id'); $data['text_date_added'] = $language->get('text_date_added'); $data['text_payment_method'] = $language->get('text_payment_method'); $data['text_shipping_method'] = $language->get('text_shipping_method'); $data['text_email'] = $language->get('text_email'); $data['text_telephone'] = $language->get('text_telephone'); $data['text_ip'] = $language->get('text_ip'); $data['text_order_status'] = $language->get('text_order_status'); $data['text_payment_address'] = $language->get('text_payment_address'); $data['text_shipping_address'] = $language->get('text_shipping_address'); $data['text_product'] = $language->get('text_product'); $data['text_model'] = $language->get('text_model'); $data['text_quantity'] = $language->get('text_quantity'); $data['text_price'] = $language->get('text_price'); $data['text_total'] = $language->get('text_total'); $data['text_footer'] = ''; $data['logo'] = $order_info['store_url'] . 'image/' . $this->config->get('config_logo'); $data['store_name'] = $order_info['store_name']; $data['store_url'] = $order_info['store_url']; $data['customer_id'] = ''; $data['link'] = ''; $data['download'] = ''; $data['order_id'] = $order_info['order_id']; $data['date_added'] = date($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'], 'lastname' => $order_info['payment_lastname'], 'company' => $order_info['payment_company'], 'address_1' => $order_info['payment_address_1'], 'address_2' => $order_info['payment_address_2'], 'city' => $order_info['payment_city'], 'postcode' => $order_info['payment_postcode'], 'zone' => $order_info['payment_zone'], 'zone_code' => $order_info['payment_zone_code'], 'country' => $order_info['payment_country'] ); $data['payment_address'] = str_replace(array("\r\n", "\r", "\n"), '<br />', preg_replace(array("/\s\s+/", "/\r\r+/", "/\n\n+/"), '<br />', 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'], 'lastname' => $order_info['shipping_lastname'], 'company' => $order_info['shipping_company'], 'address_1' => $order_info['shipping_address_1'], 'address_2' => $order_info['shipping_address_2'], 'city' => $order_info['shipping_city'], 'postcode' => $order_info['shipping_postcode'], 'zone' => $order_info['shipping_zone'], 'zone_code' => $order_info['shipping_zone_code'], 'country' => $order_info['shipping_country'] ); $data['shipping_address'] = str_replace(array("\r\n", "\r", "\n"), '<br />', preg_replace(array("/\s\s+/", "/\r\r+/", "/\n\n+/"), '<br />', trim(str_replace($find, $replace, $format)))); $order_info = $this->model_checkout_order->getOrder($order_id); if ($order_info && !$order_info['order_status_id'] && $order_status_id && in_array('order', (array)$this->config->get('config_mail_alert'))) { $this->load->language('mail/order_alert'); // HTML Mail $data['text_received'] = $this->language->get('text_received'); $data['text_order_id'] = $this->language->get('text_order_id'); $data['text_date_added'] = $this->language->get('text_date_added'); $data['text_order_status'] = $this->language->get('text_order_status'); $data['text_product'] = $this->language->get('text_product'); $data['text_total'] = $this->language->get('text_total'); $data['text_comment'] = $this->language->get('text_comment'); $data['order_id'] = $order_info['order_id']; $data['date_added'] = date($this->language->get('date_format_short'), strtotime($order_info['date_added'])); $order_status_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_status WHERE order_status_id = '" . (int)$order_status_id . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'"); if ($order_status_query->num_rows) { $data['order_status'] = $order_status_query->row['name']; } else { $data['order_status'] = ''; } $this->load->model('tool/upload'); $data['products'] = array(); $order_products = $this->model_checkout_order->getOrderProducts($order_id); foreach ($order_products as $order_product) { $option_data = array(); $order_options = $this->model_checkout_order->getOrderOptions($order_info['order_id'], $order_product['order_product_id']); foreach ($order_options as $order_option) { if ($order_option['type'] != 'file') { $value = $order_option['value']; } else { $upload_info = $this->model_tool_upload->getUploadByCode($order_option['value']); if ($upload_info) { $value = $upload_info['name']; } else { $value = ''; } } $option_data[] = array( 'name' => $order_option['name'], 'value' => (utf8_strlen($value) > 20 ? utf8_substr($value, 0, 20) . '..' : $value) ); } $data['products'][] = array( 'name' => $order_product['name'], 'model' => $order_product['model'], 'quantity' => $order_product['quantity'], 'option' => $option_data, 'price' => $this->currency->format($order_product['price'] + ($this->config->get('config_tax') ? $order_product['tax'] : 0), $order_info['currency_code'], $order_info['currency_value']), 'total' => html_entity_decode($this->currency->format($order_product['total'] + ($this->config->get('config_tax') ? ($order_product['tax'] * $order_product['quantity']) : 0), $order_info['currency_code'], $order_info['currency_value']), ENT_NOQUOTES, 'UTF-8') ); } $data['vouchers'] = array(); $order_vouchers = $this->model_checkout_order->getOrderVouchers($order_id); foreach ($order_vouchers as $order_voucher) { $data['vouchers'][] = array( 'description' => $order_voucher['description'], 'amount' => html_entity_decode($this->currency->format($order_voucher['amount'], $order_info['currency_code'], $order_info['currency_value']), ENT_NOQUOTES, 'UTF-8') ); } $data['totals'] = array(); $order_totals = $this->model_checkout_order->getOrderTotals($order_id); foreach ($order_totals as $order_total) { $data['totals'][] = array( 'title' => $order_total['title'], 'text' => $this->currency->format($order_total['value'], $order_info['currency_code'], $order_info['currency_value']), 'value' => html_entity_decode($this->currency->format($order_total['value'], $order_info['currency_code'], $order_info['currency_value']), ENT_NOQUOTES, 'UTF-8') ); } $data['comment'] = strip_tags($order_info['comment']); $mail = new Mail($this->config->get('config_mail_engine')); $mail->parameter = $this->config->get('config_mail_parameter'); $mail->smtp_hostname = $this->config->get('config_mail_smtp_hostname'); $mail->smtp_username = $this->config->get('config_mail_smtp_username'); $mail->smtp_password = html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'); $mail->smtp_port = $this->config->get('config_mail_smtp_port'); $mail->smtp_timeout = $this->config->get('config_mail_smtp_timeout'); $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_add', $data)); $mail->send(); // Send to additional alert emails $emails = explode(',', $this->config->get('config_mail_alert_email')); foreach ($emails as $email) { if ($email && filter_var($email, FILTER_VALIDATE_EMAIL)) { $mail->setTo($email); $mail->send(); } } } } public function originalAlert(&$route, &$args) { |
ВАЖНО! Меняем именно строчку а не всю функцию. Обновляем модификаторы. Больше никаких манипуляций делать не нужно!
Все супер, только общий комментарий к заказу перестал приходить после этих изменений
Здравствуйте. Чуть позже гляну.
Внес дополнения в статью, которые помогут Вам решить проблему.
Спасибо огромное! Все получилось!
Превосходно!
Удаление куска «// Admin Alert Mail» привело к тому, что на рабочую почту перестали приходить сообщения.
Пришлось только в указанное Вами место вставить 6строк. (order.php)
Замена кода в order_alert привело к тому, что на почту админа приходит HTML код письма.
«Памажите люди добрыя»
Здравствуйте. В уроке мы кроме удаления куска кода отправляющего оповещение админу, добавили код, который отправляет админу письмо нового формата. Пересмотрите, возможно Вы что то сделали не верно.
Результат. В order_alert поменял две строчки. Письма приходят и админу и покупателю. Покупателю — с его-же комментариями. Да и бог с ним. Пусть читает, что написал.
от души бро
Здравствуйте, опенкарт 3.0.2.0 сделал все по статье, но в итоге админу вообще перестали письма приходить.. а клиенту приходят такие же письма как и были.
а и вот еще, в моей теме не было папки /catalog/view/theme/yourtheme/template/mail я ее скопировал с дефолтного шаблона, пробовал править и в дефолтном шаблоне, ничего не помогло..
Здравствуйте. Данный метод не на всех сборках срабатывает. Сделал дополнение.