У меня знакомый попросил сделать такую штуку. У него интернет магазин букетов и он хотел просматривать старые заказы и отправлять клиентам уведомления, типа вот чувак ты у меня заказывал букет год назад, не хочешь ли повторить, тем более что у нас столько нового и интересного появилось. И я недолго думая согласился, тем более что в джумшоппинг есть стандартный механизм оповещения клиента о изменении статуса заказа.
1. Идем в шаблон отображения списка заказов в админке.
..administrator/components/com_jshopping/views/orders/tmpl/list.php
Тут ставим в принципе куда нравится, я решил поставить рядом с кнопкой изменить статус
224 строка добавляем строчки отображающие нашу кнопку
<input class="button btn btn-small" type="button" name="" value="Напомнить" onclick="SendNotify('<?php echo $row->order_id; ?>');" />
После этого добавляем свою строчку в js, которая вызывается при нажатии нашей кнопки
Файл ../administrator/components/com_jshopping/js/functions.js
псоле 45 строки добавляем свою функцию
function SendNotify(orderId){
location.href = 'index.php?option=com_jshopping&controller=orders&task=sendNotify&order_id=' + orderId;
}
Она по сути перекидывает нас на новый контроллер SendNotifу, основанный на стандартных механизмах. Добавляем этот контроллер
..administrator/components/com_jshopping/controllers/Orders.php
Ищем там стандартный контроллео send (примерно 499 строка), после него вставляем свой, немного модифицированный
function sendNotify(){
$order_id = JRequest::getInt("order_id");
$order = JSFactory::getTable('order', 'jshop');
$order->load($order_id);
JSFactory::loadLanguageFile($order->getLang());
$checkout = JSFactory::getModel('checkout', 'jshop');
$checkout->sendOrderNotify($order_id, 1);
JSFactory::loadAdminLanguageFile();
$this->setRedirect("index.php?option=com_jshopping&controller=orders");
}
Тут мы по сути поменяли только то что берем новую модель и после выполнения действия остаемся на странице с заказами, а не уходим в заказ.
Теперь осталось немного поковырятся в файле отправки. ../public_html/components/com_jshopping/models/checkout.php
После 35 строки добавляем функцию
function sendOrderNotify($order_id, $manuallysend = 0){
$model = JSFactory::getModel('orderMail', 'jshop');
$model->setData($order_id, $manuallysend);
return $model->sendnot();
}
Она практически идентична стандартной, но возвращает новую модель.
В это же папке открываем ordermail.php, в районе 174 строки добавляем нашу новую функцию
public function sendnot(){
$jshopConfig = JSFactory::getConfig();
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onBeforeSendEmailsOrder',
array(&$this->order, &$this->listVendors, &$this->file_generete_pdf_order, &$this->admin_send_order, &$this));
$message_client = $this->getNotify('client');
$message_admin = $this->getNotify('admin');
$this->loadMessageForListVendors();
if ($this->getGeneretePdf()){
$this->order->generatePdf($this->file_generete_pdf_order);
}
$sendnot = array();
//send mail client
if ($this->order->email){
$sendnot['client'] = $this->sendNotify('client', $this->order->email, $message_client);
}
//$dispatcher->trigger('onAfterSendEmailsOrder', array(&$this->order, &$this, &$send));
return $sendnot;
}
Она по сути практически дублирует стандартную. И немного ниже добавляем собственно отправку (у меня 236 строка)
public function sendNotify($type, $recipient, $message, $vendor = null){
$app = JFactory::getApplication();
$jshopConfig = JSFactory::getConfig();
$dispatcher = JDispatcher::getInstance();
$mailfrom = $app->getCfg('mailfrom');
$fromname = $app->getCfg('fromname');
$pdfsend = $this->getPdfSend();
$manuallysend = $this->getManuallysend();
$subject = $this->getSubjectMail($type, $this->order);
$pdfsendtype = $this->getPdfSendType($type);
$mailer = JFactory::getMailer();
$mailer->setSender(array($mailfrom, $fromname));
$mailer->addRecipient($recipient);
$mailer->setSubject($subject);
$mailer->setBody($message);
$mailer->isHTML(true);
$dispatcher->trigger($this->getSendMailTriggerType($type),
array(&$mailer, &$this->order, &$manuallysend, &$pdfsend, &$vendor, &$this->vendors_send_message, &$this->vendor_send_order));
return $mailer->Send();
}
Эта функция собственно отправит наше письмо, но нужно еще кое что поменять. Нам нужно заполнить наше письмо. В райне 87 строки добавляем свою функцию, которая заполняет письмо
public function getNotify($type, $products = null, $show_customer_info = 1, $show_weight_order = 1, $show_total_info = 1, $show_payment_shipping_info = 1){
$jshopConfig = JSFactory::getConfig();
$dispatcher = JDispatcher::getInstance();
$liveurlhost = JURI::getInstance()->toString(array("scheme",'host', 'port'));
if ($type=='client'){
$client = 1;
}else{
$client = 0;
}
if (is_null($products)){
$products = $this->order->products;
}
$view = $this->getView('checkout');
$view->setLayout("ordernotify");
$view->assign('client', $client);
$view->assign('show_customer_info', $show_customer_info);
$view->assign('show_weight_order', $show_weight_order);
$view->assign('show_total_info', $show_total_info);
$view->assign('show_payment_shipping_info', $show_payment_shipping_info);
$view->assign('config_fields', $this->config_fields);
$view->assign('count_filed_delivery', $this->count_filed_delivery);
$view->assign('order_email_descr', $this->order_email_descr);
$view->assign('order_email_descr_end', $this->order_email_descr_end);
$view->assign('config', $jshopConfig);
$view->assign('order', $this->order);
$view->assign('products', $products);
$view->assign('show_percent_tax', $this->show_percent_tax);
$view->assign('hide_subtotal', $this->hide_subtotal);
$view->assign('noimage', $jshopConfig->noimage);
$view->assign('text_total',$this->text_total);
$view->assign('liveurlhost',$liveurlhost);
if ($type=='vendor'){
$dispatcher->trigger('onBeforeCreateTemplateOrderPartMail', array(&$view));
}else{
$dispatcher->trigger('onBeforeCreateTemplateOrderMail', array(&$view));
}
return $view->loadTemplate();
}
Тут тоже конечно полно лишнего но время было уже около 12, лень разбираться было. Теперь осталось добавить свой шаблон письма.
../com_jshopping/templates/default/checkout идем туда и создаем файл ordernotify.php
Это и есть наш шаблон. Там уже пишем что угодно, это будет тело письма. В принципе все, механизм работает, но нужно немного допилить. Для начала меняем наш заголовок письма.
В ordermail.php в созданной нами функции sendNotify меняем строку создания заголовка $subject = $this->getSubjectMail($type, $this->order);
письма на свою
$subject = $this->getSubjectNotify($type, $this->order);
Ну и собственно создаем эту самую свою. Примерно 209 строка. Тут сами уже придумываете что писать
public function getSubjectNotify($type, $order){
$subject = sprintf(_JSHOP_NEW_ORDER, $order->order_number, $order->f_name." ".$order->l_name);
extract(js_add_trigger(get_defined_vars(), "after"));
return $subject;
}
В моем случае фраза могла быть жестко прописана в коде и я не стал ничего выдумывать.
$subject = "Уважаемый покупатель. За время вашего отсутствия у нас появилось много нового!";
Ну теперь осталось переделать шаблон письма, но там уже на что фантазия богата. Вроде бы все, удачи!