1 авг. 2016 г., 11:24

Получить список товара по номеру заказа в плагине

Добрый день! При изменении статуса заказа хочу отправлять письмо контрагенту — сообщать об изменении заказа. Это с вашей помощью мы сделали. Теперь при отправке этого письма хочется заполнить шаблон 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 )
Подскажите, что надо сделать? Заранее спасибо!
Денис, компонент 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 )
Тут вам и сумма заказа, и данные товаров и прочее. Нет только картинок товаров. Если и картинки понадобятся, то да, придется тогда процессор задействовать.
Спасибо! У меня все получилось!
Мне кажется это кому ни-будь может пригодиться.
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; }

Добавить комментарий