Виджет "статистика minishop2"



Установка:
1. Загрузить файл в core / components / minishop2 / elements / widgets
2. Открыть Панели / Создать виджет
3. Имя: ms2_stat (или какое хотите).
Тип: файл
Путь к файлу: [[++ core_path]] компоненты / minishop2 / элементы / виджеты / widget.ms2_stat.php
4. Панель / Добавить виджет / ms2_stat (или то что указали в п.3)
<?php

/*

Статистика заказов

*/

$modx->addPackage('minishop2', MODX_CORE_PATH.'components/minishop2/model/');

$q_where = "`date` + INTERVAL ".date('j')." DAY > NOW()";

$chunkArr = array(
    'lang' => $modx->config['manager_language'],
    'new_count' => $modx->getCount('msOrder',array('status' => 1),$q_where),
    'canceled_count' => $modx->getCount('msOrder',array('status' => 4),$q_where),
    'done_count' => $modx->getCount('msOrder',array('status' => 2),$q_where),
    'all_count' => $modx->getCount('msOrder')
);
$pages = $modx->getCollection('msOrder', array('status' => 1));

$current_month = date('n');

$months = array(
	'1' => 'Январь',
	'2' => 'Февраль',
	'3' => 'Март',
	'4' => 'Апрель',
	'5' => 'Май',
	'6' => 'Июнь',
	'7' => 'Июль',
	'8' => 'Август',
	'9' => 'Сентябрь',
	'10' => 'Октябрь',
	'11' => 'Ноябрь',
	'12' => 'Декабрь',
);

$stat_month = array();
$sql = "
SELECT month(`createdon`) AS `order_month`, count(*) AS `order_count`, SUM(cart_cost) AS order_cost
FROM ".$modx->getTableName('msOrder')."
WHERE year(`createdon`) = ".date('Y')." 
GROUP BY month(`createdon`)
ORDER BY month(`createdon`)
";
$stmt = $modx->prepare($sql);
if ($stmt && $stmt->execute()) {
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        $stat_month[] = array("name"=>$months[$row['order_month']],"count"=>$row['order_count'],"cost"=>$row['order_cost']);
    }
    $stmt->closeCursor();
}

$chunkArr['stat_month'] = json_encode($stat_month);

$tpl = <<<EOT
<script type="text/javascript">
Ext.chart.Chart.CHART_URL = 'assets/ext3/resources/charts.swf';
Ext.onReady(function(){
	
    var store = new Ext.data.JsonStore({
        fields: ['categorytitle', 'total'],
        data: [{
            categorytitle: 'Новые ([[+new_count]])',
            total: [[+new_count]]
        },{
            categorytitle: 'Оплаченые ([[+done_count]])',
            total: [[+done_count]]
        },{
            categorytitle: 'Отмененны ([[+canceled_count]])',
            total: [[+canceled_count]]
        ]}
    });
    
    new Ext.Panel({
        width: 300,
        height: 250,
        title: 'Статистика за этот месяц',
        renderTo: 'ms2_stat',
        border: false,
        items: {
            store: store,
            xtype: 'piechart',
            dataField: 'total',
            categoryField: 'categorytitle',
            series: [{
                style: {
                    colors: ["#99CCFF", "#CCFFCC", "#FF99CC"]
                }
            ]},
            extraStyle:{
                legend:{
                    display: 'bottom',
                    padding: 5,
                    font:{
                        family: 'Tahoma',
                        size: 11
                    }
                }
            }
        }
    });
    
    var store2 = new Ext.data.JsonStore({
        fields:['name', 'count', 'cost'],
        data: [[+stat_month]]
    });
    
    new Ext.Panel({
        title: 'Статистика по месяцам',
        renderTo: 'ms2_stat2',
        //width:500,
        height:250,
        layout:'fit',
        border: false,
        items: {
            xtype: 'linechart',
            store: store2,
            xField: 'name',
            yField: 'count',
			yField: 'cost',
            border: false,
			listeners: {
				itemclick: function(o){
                /*
					var rec = store2.getAt(o.index);
                    MODx.msg.status({
                        title: 'Item Selected',
                        message: 'You chose: '+rec.get('name'),
                        delay: 3
                    });
                */
				}
			},
            series: [{
                type: 'column',
                displayName: 'Кол-во заказов за',
                yField: 'count',
                style: {
                    image:'bar.gif',
                    mode: 'stretch',
                    color:0x99BBE8
                }
            },{
                type:'line',
                displayName: 'Кол-во заказов за',
                yField: 'count',
                style: {
                    color: 0x15428B
                }
            },{
                type: 'column',
                displayName: 'Доход за',
                yField: 'cost',
                style: {
                    image:'bar.gif',
                    mode: 'stretch',
                    color:0x4db848
                }
            },{
                type:'line',
                displayName: 'Доход за',
                yField: 'cost',
                style: {
                    color: 0x2c6829
                }
            ]}
        }
    });
    
});
</script>

<table width="100%">
    <col width="*">
    <col width="30">
    <col width="*">
    <col width="*">
    <tr>        
        <td> </td>
        <td>
            <div id="ms2_stat"></div>
        </td>
        <td>
            <div id="ms2_stat2"></div>
        </td>
    </tr>
    <tr>
        <td> </td>
        <td>
            <p style="color:#000;">Всего заказов: <b>[[+all_count]]</b></p>
        </td>
        <td> </td>
    </tr>
</table>
EOT;

$chunk = $modx->newObject('modChunk');
$chunk->fromArray(array('name'=>"INLINE-".uniqid(),'snippet'=>$tpl));
$chunk->setCacheable(false);

$output = $chunk->process($chunkArr);

return $output;
Github: github.com/tanaevr/ms2_widget_stat

Update (13.10.2014):
1. Убрал LIMIT в выборке чтобы показывались сразу весь период статистики.
2. Добавил вывод графика оборота ( спасибо Ilya Ev ).
Роман Танаев
10 октября 2014, 07:09
modx.pro
16
4 487
+5

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

Василий Столейков
10 октября 2014, 12:22
0
Круто! Полезный виджет! Спасибо!
    Виталий Валерьевич
    10 октября 2014, 18:59
    0
    Возможно имеет смысл оформить в pull-реквест и внедрить по умолчанию в функционал minishop-а?
      Ilya Ev
      10 октября 2014, 19:00
      0
      График что-то не рисуется( только «Всего заказов: 195»
      Ilya Ev
      10 октября 2014, 21:04
      +1
      а если немного поправить

      $sql = "
      SELECT month(`createdon`) AS `order_month`, count(*) AS `order_count` , SUM(cart_cost) AS order_cost
      FROM ".$modx->getTableName('msOrder')."
      WHERE year(`createdon`) = ".date('Y')." 
      GROUP BY month(`createdon`)
      ORDER BY month(`createdon`)
      LIMIT 12
      ";
      $stmt = $modx->prepare($sql);
      if ($stmt && $stmt->execute()) {
          while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
      $fullname=$months[$row['order_month']]."\n".ceil($row['order_cost']);
              $stat_month[] = array("name"=>$fullname,"count"=>$row['order_count']);
          }
          $stmt->closeCursor();
      }
      То и оборот за месяц можно посмотреть, может будет полезно
        Богдан
        11 октября 2014, 18:06
        0
        Отличное решение! А как сделать, чтобы отображались два графика (наложенные друг на друга на одной диаграмме) — по обороту и по количеству заказов?
        Сергей Федоров
        19 октября 2014, 10:33
        0
        Возможно я что-то не так делаю, но если я указываю тип: «Файл» и указываю путь, то получаю 500 ошибку на главной системы управления. Если выбираю тип «Встроенный PHP», то все в порядке, но не прорисовываются графики: monosnap.com/image/hqpyhAMaO9HxxyyzBfNSsmS3m09tCW, хотя код полностью ваш брал: pastebin.com/ut4JG4n3

        Заранее спасибо за ответ!
        Кирилл
        12 октября 2018, 16:03
        0
        Спасибо вам ОГРОМНЕЙШЕЕ за такой прекрасный widget. Ломал голову как для второго admina сделать только просмотр только статистики заказов. СПАСИБО!
          Кирилл
          12 октября 2018, 16:43
          0
          Подскажите ПОЖАЛУЙСТА как сделать также только Orders вынести в dashboard или widget только для просмотра manager или admin.

          Заранее спасибо.
            Кирилл
            12 октября 2018, 22:22
            0
            Решил вопрос по другому кому интересно:

            Для manager сделал custom policy template

            dashboard пустой для него и доступ в настройках policy к components

            Получается у manager есть доступ только к Orders minishop где он может:

            — редактировать заказ

            — сохранять заказ

            — выставлять статус заказа

            + удобно с messages

            тоесть ты с админки отправляешь manager сообщение (если у него постоянно занято)

            сообщение такого рода

            проверьте статутс заказа ID такой то

            он смотрит оплату выставляет статус заказа (проплачен, отменён, отклонён) в minishop orders ( в полном его оригинальном компоненте ), как по мне очень удобно







            Отдельное спасибо artemblog за урок на youtube
            MODx Revo настройка прав пользователей
              Pavel
              24 декабря 2021, 09:34
              0
              Подскажите пожалуйста. Не рисуются графики. Текс есть, Всего заказов есть. А графиков нет. В чем может быть проблема?
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                24