miniShop2: счетчик проданных товаров / уведомления

Здравствуйте, уважаемые MODX-профессионалы.

Есть пара вопросов, а именно по miniShop2.

В интернет-магазине, есть товары от пользователей и при их продаже (при статусе «Отправлен») нужно отправлять E-mail уведомление, типа «Ваш товар продан в количестве 1шт...».

И нужно это сделать в 2 этапа: счетчик проданных товаров и уведомление.

1) Счетчик проданных товаров:
Прочитал заметку bezumkin.ru/modx/minishop2/msearch2/1805/ и, как сделать счетчик количества проданных товаров, чтобы при статусе «Отправлен» в базу отправлялось +1?

2) E-mail уведомления:
Реализация хранения адреса видится либо через TV, либо через таблицу в MySQL базе. Что проще.
А вот функция отправки уведомления о проданном товаре, трудно сказать. Для менеджеров и пользователя есть, но с целым прайс-листом. Хотя, может и он сойдет.
Думаю, что это реализовывается доработкой 3-ёх файлов: «resolve.settings.php», «msorderstatus.map.inc.php», «minishop2.class.php», а именно добавлением новых событий/функций (не совсем понятно каких).

Возможно, есть более оптимальное решение, подскажите?

Заранее спасибо.
marked
08 октября 2013, 18:13
modx.pro
4
2 918
0

Комментарии: 9

Василий Наумкин
09 октября 2013, 06:44
0
Все это можно сделать плагином на событие msOnChangeOrderStatus.
    marked
    29 октября 2013, 19:49
    0
    Вопрос снова актуален и я бы хотел попросить вашей помощи, так как слабо разбираюсь в структуре MS2 и MODX.

    Задача та же, а именно:
    Главное — добавить количество проданных товаров из заказа в таблицу 'modx_ms2_products'.'sold' при статусе «отправлен».
    И крайне желательно уведомить по почте, которую надо взять из 'modx_ms2_products'.'notify'.

    Поля добавлены и работают по инструкции.

    Сам зашел в тупик на данном моменте (и уже который час пытаюсь подобраться к товарам в заказе):
    <?php
    // Switch Event
    switch ($modx->event->name) {
    
        // Get Event Name
    	case 'msOnChangeOrderStatus':
    	
    		// If Status = Received
    		if ($status = 3) {
    		
    			// 1 - SendMail to Test@Mail ('modx_ms2_products'.'notify')
    			$mailto = 'admin@localhost';
    			$subject = 'Тема письма';
    			$body = 'Содержимое письма';
    			$modx->getService('mail', 'mail.modPHPMailer');
    			$modx->mail->setHTML(true);
    			$modx->mail->set(modMail::MAIL_BODY, $body);
    			$modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
    			$modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
    			$modx->mail->set(modMail::MAIL_SUBJECT, trim($subject));
    			$modx->mail->address('to', trim($mailto));
    			$modx->mail->send();
    			$modx->mail->reset();
    
    			// 2 - Add count to 'modx_ms2_products'.'sold'  
    			//  ;_;
    			
    		}
    	break;
    }
    Б… код будет исправлен. Самому неловко.

    Очень надеюсь на поддержку программистов.
    marked
    30 октября 2013, 14:53
    0
    Василий, большое спасибо за приведенную ссылку!

    Пока что решил отложить почтовые уведомления, так как не могу дойти до свойств товара и начался рандом.
    Как же взять/взаимодействовать с колонками (sold и notify) из msProductData? Подскажите кто-нибудь, пожалуйста.
    Код, который выводит в лог цену товара и 2 пустых значения при изменении статуса на «Отправлен»:

    switch ($modx->event->name) {
      // Get Event Name
      case 'msOnChangeOrderStatus':
        // If Status is Received
        if ($status === 3) {
          // Configure
          $modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true);
          $modx->getService('pdofetch');
          $modx->getService('minishop2');
          $modx->getService('error','error.modError');
          $modx->setLogLevel(modX::LOG_LEVEL_INFO);
          $modx->setLogTarget('FILE');
          // Get Order
          $id = $order->get('id');
          $products = $order->getMany('Products');
          // Get Items: Price / Sold / Email
          foreach ($products as $product) {
            $modx->log(modX::LOG_LEVEL_INFO, print_r($product->get('price'), $id));   // OK
            $modx->log(modX::LOG_LEVEL_INFO, print_r($product->get('sold'), $id));    // EMPTY
            $modx->log(modX::LOG_LEVEL_INFO, print_r($product->get('notify'), $id));  // EMPTY
          }
          die();
        }
      break;
    }

    В лог выдает, помимо значений, ошибки от «json_decode» и «pdoFetch». Напутал в разделе «Configure»?

    Заранее спасибо.
      marked
      08 ноября 2013, 20:30
      1
      0
      C задачей справился и, как здесь принято, решил поделиться наработкой из плагина.

      Userful:
      // Если событие - "msOnChangeOrderStatus"
      case 'msOnChangeOrderStatus':
      
          // Если статус - "Отправлен"
          if ($status == 3) {
      
              // Настройка
              $modx->getService('error','error.modError');
              $modx->getService('mail', 'mail.modPHPMailer');
              
              // Лог ведется в "Отчёты" > "Журнал ошибок"
              $modx->setLogLevel(modX::LOG_LEVEL_INFO);
              $modx->setLogTarget('FILE');
      
              // Переменные
              $id = $order->get('id');
              $products = $order->getMany('Products');
      
              // Информация о заказе
              $modx->log(modX::LOG_LEVEL_INFO, '==============================');
              $modx->log(modX::LOG_LEVEL_INFO, '            Заказ #' . $id);
              $modx->log(modX::LOG_LEVEL_INFO, '==============================');
      
              // Вывод списка покупок из заказа
              foreach ($products as $item) {
      
                  // Переменные
                  $product = $item->getOne('Product');
                  $count = $item->get('count');
      
                  // Информация о товаре
                  $modx->log(modX::LOG_LEVEL_INFO, 'Товар: "' . $product->get('pagetitle') . '" (#' . $product->get('id') . ')');
                  $modx->log(modX::LOG_LEVEL_INFO, 'Цена: ' . $product->get('price') . ' руб.');
                  $modx->log(modX::LOG_LEVEL_INFO, 'Количество: ' . $count . ' шт.');
      
                  // Отправка письма
                  $email = 'E-mail';
                  $subject = 'Тема письма';
                  $body = 'Содержимое письма';
                  $modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
                  $modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
                  $modx->mail->set(modMail::MAIL_SUBJECT, trim($subject));
                  $modx->mail->set(modMail::MAIL_BODY, $body);
                  $modx->mail->setHTML(true);
                  $modx->mail->address('to', trim($email));
                  $modx->mail->send();
                  $modx->mail->reset();    
          }
          // Сброс
          die();
      }

      Тему можно считать «закрытой».
        Евгений Кузнецов
        02 декабря 2013, 20:56
        0
        Но «счетчика проданных товаров» тут не увидел. (чтобы отнимался Count)…
          Alex Alex
          Alex Alex
          19 июля 2014, 19:39
          0
          Тема актуальна, как сделать такой счетчик?
            marked
            20 июля 2014, 00:50
            0
            Основа плагина — gist.github.com/artbelov/486a3f447ebdc1e395ae
              Евгений Ц.
              26 апреля 2020, 17:34
              0
              Я сделал через TV, плагин на событие msOnCreateOrder
              <?php
              $products = $msOrder->getMany('Products');
              foreach ($products as $item) {
                  $product = $item->getOne('Product');
                  $product_id = $product->id;
                  $product_qty = $item->count;
                  $res = $modx->getObject('modResource',$product_id);
                  $count = $res->getTVValue('ProductSalesQty');
                  $count = $count + $product_qty;
                  $res->setTVValue('ProductSalesQty', $count);
              }
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              9