Main menu

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

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 = "Уважаемый покупатель. За время вашего отсутствия у нас появилось много нового!";

Ну теперь осталось переделать шаблон письма, но там уже на что фантазия богата. Вроде бы все, удачи!