Денис Друщенко 01 августа 2016 1 4
Добрый день!
При изменении статуса заказа хочу отправлять письмо контрагенту — сообщать об изменении заказа.
Это с вашей помощью мы сделали.
Теперь при отправке этого письма хочется заполнить шаблон smarty и отправить его.
Для этого надо получить список товара по номеру заказа, чтобы заполнить таблицу в письме.
Пытаюсь сделать так:


                        $modx->switchContext('web');
                        $modx->invokeEvent('OnHandleRequest');
                        $modx->smarty->assign('order', $object->toArray());
                        
                         $response = $this->modx->runProcessor('basket/mgr/orders/products/getdata',
                            array(
                            "order_id"  => $this->object->get('id'),
                            ), array(
                            'processors_path' => MODX_CORE_PATH.'components/basket/processors/',
                            )
                            );
            $data = $response->getResponse()
     
            $modx->smarty->assign('order_data', $data);
            unset($data);
            
                        $message = $modx->smarty->fetch("message/order_submitted/contractor.tpl");
                        $subject = "Ваш заказ принят";
                        $object->Contractor->sendEmail($message, array(
                            "subject"   => $subject,
                        ));


Получаю ошибку:

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
Could not load class: OrderProduct from mysql.orderproduct.

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
No class specified for loadClass

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
Could not load class 

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
No class specified for loadClass

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
Could not load class !

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
No class specified for loadClass

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
No class specified for loadClass

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
Could not load class: OrderProduct from mysql.orderproduct.

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
OrderProduct::getSelectColumns() is not a valid static method.

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
Could not load class: OrderProduct from mysql.orderproduct.

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
Could not load class OrderProduct

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
modSiteWebGetlistProcessor

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) FROM WHERE  ( ``.`order_id` = '8' AND ``.`quantity` > '0' )' at line 1
)

[2016-08-01 09:06:54] (ERROR @ /manager/components/console/connectors/console.php)
SELECT COUNT(DISTINCT *) FROM WHERE  ( ``.`order_id` = '8' AND ``.`quantity` > '0' )  

Array
(
    [success] => 1
    [message] => 
    [count] => 0
    [total] => 0
    [limit] => 20
    [page] => 0
    [object] => Array
        (
        )

    [sum] => 0
    [original_sum] => 0
    [discount] => 0
    [quantity] => 0
    [positions] => 0
)


Подскажите, что надо сделать?
Заранее спасибо!
4 комментария
Fi1osof1
Fi1osof 01 августа 2016г в 17:03 #
Денис, компонент basket более не актуальный, надо использовать процессоры компонента shopmodx.

Во-вторых, многие данные заказа уже имеются в объекте. Сделайте в плагине вот так: $modx->log(1, print_r($object->toArray(), 1));
У вас в журнале ошибок будет типа такого:
[2016-08-01 17:00:49] (ERROR @ /manager/components/shopmodx/connectors/orders.php) Array
(
    [id] => 6
    [number_history] => 23
    [status_id] => 3
    [contractor] => 44
    [createdby] => 44
    [editedby] => 44
    [createdon] => 2016-07-27 17:23:46
    [editedon] => 2016-08-01 17:00:49
    [manager] => 
    [address] => 
    [comments] => 
    [discount] => 0
    [_OrderProducts] => Array
        (
            [6] => Array
                (
                    [id] => 6
                    [order_id] => 6
                    [product_id] => 135
                    [quantity] => 1
                    [price] => 10000
                    [currency_id] => 0
                    [_Product] => Array
                        (
                            [id] => 135
                            [type] => document
                            [contentType] => text/html
                            [pagetitle] => Toshiba Satellite C850-D1R 15,6" - красный
                            [longtitle] => 
                            [description] => 
                            [alias] => toshiba-satellite-c850-d1r-15,6-krasnyy
                            [link_attributes] => 
                            [published] => 1
                            [pub_date] => 0
                            [unpub_date] => 0
                            [parent] => 131
                            [isfolder] => 
                            [introtext] => 
                            [content] => <p>Toshiba Satellite C850-D1R оснащен множеством полезных функций, эффективная работа которых базируется на мощной начинке компьютера - процессор третьего поколения Intel® Core™ i3-3110M, оперативная память с возможностью расширения до 16 Гб, дискретная видеокарта 1 Гб и графический адаптер AMD Radeon™ HD 7610M.</p>
<p>Жесткий диск вместителен - 640 Гб, его пространства хватит на долгое время даже интенсивного использования. TFT-дисплей высокой яркости наиболее популярного размера 15,6 дюймов дает возможность и комфортно работать, и отлично отдыхать, и без труда перемещаться с ноутбуком по всему миру.</p>
<h3>Ноутбук Toshiba Satellite C850-D1R 15,6" - красный (PSCBYR-023003RU). Характеристики</h3>
<ul>
<li>Экран: 15,6" LED</li>
<li>Разрешение экрана: 1366 х 768</li>
<li>Процессор: Intel Core i3-3110M (2400 МГц)</li>
<li>Объем оперативной памяти: 4096 Мб</li>
<li>Тип оперативной памяти: DDR3-1600 МГц</li>
<li>Жесткий диск: 640 Гб (5400 rpm)</li>
<li>Графическая карта: AMD Radeon HD 7610M, дискретный</li>
<li>Размер видеопамяти: 1 Гб</li>
<li>Оптический привод: DVD Super Multi</li>
<li>Операционная система: Windows 8</li>
</ul>
<h3>Ноутбук Toshiba Satellite C850-D1R 15,6" - красный (PSCBYR-023003RU). Интерфейсы</h3>
<ul>
<li>Беспроводная связь: Bluetooth 4.0, WiFi (802.11 b/ g/ n)</li>
<li>Разъемы и порты ввода-вывода: внешний монитор, RJ-45, внешний микрофон, наушники (стерео), 2 x USB 2.0, кардридер (SD, MMC), HDMI, 1 x USB 3.0</li>
<li>Проводная связь: 10BASE-T/ 100BASE-TX</li>
</ul>
<h3>Ноутбук Toshiba Satellite C850-D1R 15,6" - красный (PSCBYR-023003RU). Прочее</h3>
<ul>
<li>Камера: встроенная веб-камера 1 Мп со встроенным микрофоном</li>
<li>Батарея: литий-ионная (до 3 часов 30 минут)</li>
<li>Габариты: 380 x 242 x 33.52 мм</li>
<li>Вес: 2.3 кг</li>
<li>Гарантия: 12 месяцев</li>
<li>Цвет: красный</li>
</ul>
<p> </p>
<p> </p>
                            [richtext] => 1
                            [template] => 3
                            [menuindex] => 3
                            [searchable] => 1
                            [cacheable] => 1
                            [createdby] => 1
                            [createdon] => 0
                            [editedby] => 1
                            [editedon] => 2016-07-29 17:05:43
                            [deleted] => 
                            [deletedon] => 0
                            [deletedby] => 0
                            [publishedon] => 0
                            [publishedby] => 3
                            [menutitle] => 
                            [donthit] => 
                            [privateweb] => 
                            [privatemgr] => 
                            [content_dispo] => 0
                            [hidemenu] => 
                            [class_key] => modDocument
                            [context_key] => web
                            [content_type] => 1
                            [uri] => catalog/noutbuki/toshiba-satellite-c850-d1r-15,6-krasnyy.html
                            [uri_override] => 0
                            [hide_children_in_tree] => 0
                            [show_in_tree] => 1
                            [properties] => 
                            [price] => 10000
                            [article] => 
                            [currency] => 
                        )

                )

            [7] => Array
                (
                    [id] => 7
                    [order_id] => 6
                    [product_id] => 159
                    [quantity] => 1
                    [price] => 19880
                    [currency_id] => 0
                    [_Product] => Array
                        (
                            [id] => 159
                            [type] => document
                            [contentType] => text/html
                            [pagetitle] => 1
                            [longtitle] => 
                            [description] => 
                            [alias] => 1
                            [link_attributes] => 
                            [published] => 
                            [pub_date] => 0
                            [unpub_date] => 0
                            [parent] => 158
                            [isfolder] => 
                            [introtext] => 
                            [content] => 
                            [richtext] => 1
                            [template] => 3
                            [menuindex] => 0
                            [searchable] => 1
                            [cacheable] => 1
                            [createdby] => 1
                            [createdon] => 0
                            [editedby] => 1
                            [editedon] => 2016-07-29 16:57:42
                            [deleted] => 
                            [deletedon] => 0
                            [deletedby] => 0
                            [publishedon] => 0
                            [publishedby] => 0
                            [menutitle] => 
                            [donthit] => 
                            [privateweb] => 
                            [privatemgr] => 
                            [content_dispo] => 0
                            [hidemenu] => 
                            [class_key] => modDocument
                            [context_key] => web
                            [content_type] => 1
                            [uri] => catalog/ballonyi/1.html
                            [uri_override] => 0
                            [hide_children_in_tree] => 0
                            [show_in_tree] => 1
                            [properties] => 
                            [price] => 19880
                            [article] => 
                            [currency] => 
                        )

                )

        )

    [positions] => 2
    [total] => 2
    [quantity] => 2
    [sum] => 29880
    [original_sum] => 29880
    [products_ids] => Array
        (
            [0] => 135
            [1] => 159
        )

    [new_object] => 
    [save_object] => 1
    [order_id] => 6
    [show_canceled] => 
    [menu] => Array
        (
            [0] => Array
                (
                    [text] => Данные клиента
                    [handler] => this.ShowContractorInfo
                )

            [1] => Array
                (
                    [text] => Фильтровать по клиенту
                    [handler] => this.FilterByContractor
                )

        )

    [status_color] => #FF00FF
    [order_num] => 
    [status_str] => Принят
    [contractor_fullname] => Николай Ланец
    [contractor_email] => n.lanets@modxclub.ru
    [contractor_phone] => 
    [contractor_address] => 
    [manager_fullname] => 
    [ip] => 
    [paysystem_name] => 
    [pay_id] => 
    [paysys_invoice_id] => 
    [pay_date] => 
    [pay_sum] => 
    [action] => updateFromGrid
    [new_status] => 3
)


Тут вам и сумма заказа, и данные товаров и прочее. Нет только картинок товаров. Если и картинки понадобятся, то да, придется тогда процессор задействовать.
Д
Денис Друщенко 02 августа 2016г в 21:53 #
Спасибо! У меня все получилось!
Fi1osof1
Fi1osof 03 августа 2016г в 23:38 #
Не за что!
Д
Денис Друщенко 02 августа 2016г в 21:55 #
Мне кажется это кому ни-будь может пригодиться.

newstatus.tpl:
{extends file="message/layout.tpl"}

{block name=body}
    
    <h3 style="margin: 20px 0 50px;">
        Номер заказа: <strong>{$order.id}</strong> 
        Новый статус заказа: <strong>{$newstatusstr}</strong>
    </h3> 
    
    {$smarty.block.child}
    
    <h3>Список товаров</h3>
    <table border="1" width="90%">
        <tbody>
            <tr>
                <th>Наименование</th>
                <th>Количество</th>
                <th>Цена</th>
                <th>Сумма</th>
            </tr>
           
            {foreach $order_data as $product}
                <tr>
                    <td><a href="{$site_url}{$product._Product.uri}">{$product._Product.pagetitle}</a></td> 
                    <td>{$product.quantity} </td>
                    <td>{$product.price|number_format:2:",":" "} {$product.currency_code}</td>
                    <td>{$summ = $product.quantity * $product.price}{$summ|number_format:2:",":" "} {$product.currency_code}</td>
                </tr>
            {/foreach}
        </tbody>
    </table>

    <br />
    <br />

    <strong>Итого: </strong> {if $order.discount}<s>{((float)$order.original_sum)|number_format:2:".":" "}</s> {$product.currency_code}<br /><strong>С учетом скидки {$order.discount}%: </strong>{/if} {((float)$order.sum)|number_format:2:".":" "} {$product.currency_code}


{/block}



Плагин UpdateOrder:
<?php

switch ($modx->event->name) {

    case 'OnShopModxOrderBeforeSave':

        // Если поле статус изменено, то фиксируем новый статус
        if ($object->isDirty('status_id')) {
            $object->set("new_status", $object->status_id);
        }

        break;

    case 'OnShopModxOrderSave':

        if ($object->new_status) {

            $arr1 = $object->get('_OrderProducts');
            $sendcont = false;
            $modx->switchContext('web');
            $modx->invokeEvent('OnHandleRequest');
            switch ($object->new_status) {
                // Принят
                case 3:
                    $sendcont = true;
                    $modx->smarty->assign('newstatusstr', 'Принят');
                    break;
                case 4:
                    $sendcont = true;
                    $modx->smarty->assign('newstatusstr', 'Доставка');
                    break;
                case 5:
                    $sendcont = true;
                    $modx->smarty->assign('newstatusstr', 'Доставлен');
                    break;
                case 6:
                    $sendcont = true;
                    $modx->smarty->assign('newstatusstr', 'Выполнен');
                    break;
                case 7:
                    $sendcont = true;
                    $modx->smarty->assign('newstatusstr', 'Отменен');
                    break;
                case 8:
                    $sendcont = true;
                    $modx->smarty->assign('newstatusstr', 'Оплачен');
                    break;
            }
            if (($object->Contractor) && ($sendcont)) {

                
                $modx->smarty->assign('order', $object->toArray());
                $modx->smarty->assign('order_data', $arr1);
                //$modx->log(1, print_r($object->toArray(), 1));



                $message = $modx->smarty->fetch("message/order_submitted/newstatus.tpl");
                $subject = "Изменение статуса заказа №-" . $object->get('id');
                $object->Contractor->sendEmail($message, array(
                    "subject" => $subject,
                ));
            }
        }

        break;
}
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.