coder思维

科学尚未普及

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

php程序员,习惯地想到了用jpgraph 来做报表。

但是,jpgraph 乱码的问题我就没办法完全搞定,文件编码用utf-8

首先,在 jpgraph_ttf.inc.php

 

看到三个中文字体的定义,然后创建图片的时候,设置标题使用的中文字体

运行的时候发现报错:找不到字体bkai00mp.ttf

继续到 jpgraph_ttf.inc.php 找 bkai00mp.ttf

将bkai00mp.ttf改成simsun.ttc宋体,bkai00mp.ttf是什么字体我就不知道了

然后图片中文显示正常了

可是,后面的问题由来了。

创建线条,无论怎么设置字体,依然是中文乱码

不知道怎么回事,不深入研究了,找找别的办法


q群交流,tony推荐用Highcharts,百度百科的介绍:Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习、个人网站和非商业用途使用。目前HighCharts支持的图表类型有曲线图、区域图、柱状图、饼状图、散状点图和综合图表。

下载一看,果然是好东西,做报表统计、曲线图之类的功能完美、强大

最终效果图:

yii,c中的代码:

    //x 轴
        $day_30 = strtotime(date('Y-m-d',strtotime('-29 day'))); //最近三十天的时间戳
        $day_arr = array(); //最近30天日期数组
        $tmp_day_30 = $day_30;
        for($i=1;$i<=30;$i++){
            if($i==1){
                $day_arr[] = date('m-d',$tmp_day_30);
            }else{
                $tmp_day_30 = $tmp_day_30+24*3600;
                $day_arr[] = date('m-d',$tmp_day_30);
            }
        }
        // end x 轴
        // y 轴
        $db = Yii::app()->db;
        //所有的订单
        $sql = "select date_format(FROM_UNIXTIME(created),'%m-%d') as created,count(goods_name) as c
                from tb_order_info where created>='$day_30'
                group by date_format(FROM_UNIXTIME(created),'%m-%d')"
;
        $order = $db->createCommand($sql)->queryAll();
        $order_arr = $this->_createY($day_arr,$order);
        //各个产品的
        $every_arr = array();
        $allGoods = Goods::model()->findAll();
        foreach($allGoods as $v){
            $sql_1 = "select date_format(FROM_UNIXTIME(created),'%m-%d') as created,count(goods_name) as c
                from tb_order_info where created>='$day_30' and goods_id='{$v->id}'
                group by date_format(FROM_UNIXTIME(created),'%m-%d')"
;
            $every_arr[$v->id] = $this->_createY($day_arr,$db->createCommand($sql_1)->queryAll());
        }

        //end Y 轴
        $this->render('chart',array(
            'order_list'=>json_encode($order_arr),
            'day_list'=>json_encode($day_arr),
            'every_arr'=>$every_arr,
            'allGoods'=>$allGoods,
        ));

sql查询的时候,遇到不少麻烦,统计查询的sql忘记的差不多了,复习了半天

created 是时间戳,group by 分类统计的时候,要先将时间戳转换成想要的时间格式:date_format(FROM_UNIXTIME(created),'%m-%d')

将查询到的订单数组,组合:

/**
     * 生成Y轴
     * @param array $day_arr X 轴 日期
     * @param array $order 订单
     * @return array
     */

    private function _createY($day_arr, $order){
        $order_arr = array();
        foreach($day_arr as $v){
            $order_arr[$v] = 0;
            foreach($order as $v2){
                if($v==$v2['created']){
                    $order_arr[$v] = intval($v2['c']);
                }
            }
        }
        return array_values($order_arr);
    }

 

按照时间的顺序,排好三十天内每天的下单数量

 

view的代码:

<?php
/* @var $this OrderInfoController */
/* @var $day_list x轴时间 */
/* @var $order_list Y轴数量 */
/* @var $every_arr 各个产品的Y轴数量 */
/* @var $allGoods 所有产品 */

Yii::app()->clientScript->registerCoreScript('jquery');
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/highcharts/highcharts.js');
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/highcharts/modules/exporting.js');
?>
<script type="text/javascript">
    $(function () {
        $('#order').highcharts({
            chart: {
                type: 'line',
                marginRight: 130,
                marginBottom: 50
            },
            title: {
                text: '最近30天下单统计',
                x: -20 //center
            },
            subtitle: {
                text: '',
                x: -20
            },
            xAxis: {
                categories: <?=$day_list?>
            },
            yAxis: {
                title: {
                    text: '数量'
                },
                plotLines: [{
                    value: 0,
                    width: 1,
                    color: '#808080'
                }]
            },
            tooltip: {
                valueSuffix: '个'
            },
            legend: {
                layout: 'vertical',
                align: 'right',
                verticalAlign: 'top',
                x: -10,
                y: 100,
                borderWidth: 0
            },
            series: [
                {
                name: '所有产品',
                data: <?=$order_list?>
                },
                <?php foreach($allGoods as $v): ?>
                {
                name: '<?=$v->title?>',
                data: <?=json_encode($every_arr[$v->id])?>
                },
                <?php endforeach; ?>

            ]
        });
    });

</script>
<div id="order"></div>

 





posted on 2013-05-24 10:40  浩琪  阅读(222)  评论(0)    收藏  举报