博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
open-flash-chart + PHP + jQuery实例
阅读量:5881 次
发布时间:2019-06-19

本文共 8327 字,大约阅读时间需要 27 分钟。

这个文章说一下open-flash-chartPHPjQuery的结合使用的例子

 

需求UI

 

 

 解释下这个需求:

1 下方是一个flash的图表

2 上方有复选框,日活跃和周活跃用户

3 右方的一周和一月的span标签选择是显示x坐标轴的时间范围,有昨天起前一周和前一月两个选择

4 点击左边的复选框和右边的span标签都会更新flash统计表

 

实现步骤:

下载open-flash-chart 2.0

这里使用的版本是:

open-flash-chart-2-Lug-Wyrm-Charmer

 

将里面的js(json.js, swfobject.js)php-ofc-libriary文件夹和open-flash-chart.swf

放到服务器目录上

 

3  html的模板使用:

 <div id="c" class="p010" style="height:280px;">

                
<
form 
name
="user_data"
 action
="#"
 
                    data-type
="platform_static"
                    data-stat-url
="ajax/aj_static_user_data.php"
                    data-stat-aid
="{
{$appinfo.aid}}"
>
                    
<
div 
class
="dataHd clearfix"
>
                        
<
div 
class
="l"
>
                            
<
input 
class
="slc reload_chart"
                            name
="dayuv"
 
                            type
="checkbox"
                            checked
="checked"
                            value
="1"
                             
/>
                            
<
label 
class
="sl"
>日活跃
</
label
>
&nbsp;&nbsp;&nbsp;
                            
<
input 
                            
class
="slc reload_chart"
 
                            name
="weekuv"
 
                            type
="checkbox"
 
                            checked
="checked"
                            value
="2"
                            
/>
                            
<
label 
class
="cgr"
>周活跃
</
label
>
                        
</
div
>
                        
<
div 
class
="r"
>
                            
<
input 
type
="hidden"
 name
="range"
 value
="week"
>
                            
<
div 
class
="mr5"
>
                                
<
span 
class
="week_month cp"
 name
="week"
>一周
</
span
>
                                
<
span 
class
="cd"
>
</
span
>
                                
<
span 
class
="week_month cp sl"
 name
="month"
>一月
</
span
>
                            
</
div
>
                        
</
div
>
                    
</
div
>
                
</
form
>
                
<
div 
id
="user_data"
 name
="flash_chart"
></
div
>
            
</
div
>

 

这个模板说明:

1 使用了form表单,这样能增加js的可复用性,form表单作为查询提交,from后面的同级目录下的div作为flash展示的div,所以必须标注id值

   这里将form的name和div的id设置的相同 

2 form表单的属性 

data-type="platform_static"  //说明只要有这个属性的form,提交就是进行flash更新

data-stat-url="ajax/aj_static_user_data.php"  //这个标注是为了标注上更新flash所提交的ajax的地址

 

 

4  javascript(jquery):

reloadLine的函数,这个函数的作用是提交表单,更新flash

function reLoadLine(id)
    {
        
var form_id = $j("form[name='" + id + "']");
        
var aj_url = form_id.attr('data-stat-url') + "?aid="+ form_id.attr('data-stat-aid') +"&"+ form_id.serialize();
        aj_url = encodeURIComponent(aj_url);
        swfobject.embedSWF(
                "open-flash-chart.swf?r="+Math.random() * 100000, id,
                "750", "250", "9.0.0", "expressInstall.swf",
                {"data-file": aj_url}, {'wmode':"transparent"}
        );

    } 

几个说明:

 1 使用id作为参数是表示值需要将id传入,就可以将对应的flash进行更新

 2 aj_url = encodeURIComponent(aj_url);  //作为swf传入的url必须进行urlencode

 3 "open-flash-chart.swf?r="+Math.random() * 100000  //这个后面的随机数必须加上,否则有的浏览器会由于缓存的问题而无法更新

 4 {"data-file": aj_url}  //说明取数据去aj_url中取,后面会说明这个ajax如何写

 5 {'wmode':"transparent"} // 这个是表示将flash置于最底层

 6 页面已经导入了json.js, swfobject.js. 并将jquery的换为j

 

5 javascript绑定事件:

$j('.reload_chart').change(
function(event){
    
var target = event.currentTarget;
    
var form_id = 
j(target).parents('form[data-type=platform_static]').attr('name');     reLoadLine(form_id); });j(target).parents('form[data-type=platform_static]').attr('name');     reLoadLine(form_id); });j('.week_month').click(
function(event){
    event.preventDefault();
    
var target = event.currentTarget;
            
    
if($j(target).hasClass('sl'))
    {
        
//
change the page show
        
j(target).removeClass(sl);j(target).removeClass(′sl′);j(target).nextAll('.week_month').addClass('sl');
        $j(target).prevAll('.week_month').addClass('sl');
                
        
//
change hidden input
        
var rangeValue = 
j(target).attr(name);j(target).attr(′name′);j(target).parent().prevAll("input[name=range]").val(rangeValue);
                
        
var form_id = $j(target).parents('form[data-type=platform_static]').attr('name');
        reLoadLine(form_id);
    }
});

这个熟悉jquery的同学一看就明白了

就是有一点,再强调一下,这边的jjqueryj相当于jquery中的

 

6 aj_static_user_data.phpExpandedBlockStart.gif

<?php
include 'ofc-library/open-flash-chart.php';
class ajax
{
    
//
Get param
    
private 
$range = 
$_REQUEST['range'];
    
private 
$dayuv = 
$_REQUEST['dayuv'];
    
private 
$weekuv = 
$_REUEST['weekuv'];
    
    
    
function run()
    {
        
switch(
$this->
range)
        {
            
case "week":
                
$this->endDate = 
date("Y-m-d", 
strtotime('-1 day'));
                
$this->startDate = 
date("Y-m-d", 
strtotime('-8 day'));
                
break;
            
case "month":
                
$this->endDate = 
date("Y-m-d", 
strtotime('-1 day'));
                
$this->startDate = 
date("Y-m-d", 
strtotime('-30 day'));
                
break;
        }
        
        
$data = 
$this->aGetFadeData(
$this->startDate, 
$this->endDate);
        
        
//
获取line和max
        
foreach(
$data 
as 
$key=>
$value)
        {
            
$dayuvs[] = 
$value['dayuv'];
            
$weekuvs[] = 
$value['weekuv'];
        }
        
$max = 0;
        
$lines = 
array();
        
if(
$this->dayuv)
        {
            
$lines[] = 
array
                    'values' => 
$dayuvs,
                    'color' => "#336699",
                    );        
            
$max = 
max(
$max
max(
$dayuvs));
        }
        
if(
$this->weekuv)
        {
            
$lines[] = 
array
                    'values' => 
$weekuvs,
                    'color' => "#336699",
                    );
            
$max = 
max(
$max
max(
$weekuvs));
        }
        
        
//
获取lable
        
$lables = 
array_keys(
$data);
        
echo 
$this->lines(
$lines
$lables
$max);
        
exit;
    }
    
    
/*
*
     *  创造直线图
     *  @param arrLinesParams    = array (
     *                              'linename'    = array('values', 'colour'),
     *                                  ....
     *                          )    : 此为一个图表中所要展示的几条线,其中键linename为此线的名称,values:为线上各关键节点组成的数组
     *                              colour:线条颜色,没有默认值请填写如:#008B8B
     *  @param arrXLabels:X@paramarrXLabels:X轴的坐标,按照所选日期取值∗@paramintYmax    : 几组直线节点数值中的最大值,确定Y轴所用
     *  @return JSON str
     
*/
    
public 
function lines(
$arrLinesParams
$arrXLabels
$intYmax
    {
        
foreach (
$arrLinesParams 
as 
$linename=>
$lineParam) {
            
            
$line    = 
new line();    
            
$line    -> set_values(
$lineParam['values']);
            
$line    -> set_colour(
$lineParam['color']);
            
$line    -> set_width(2);
        
                
            
$dot    = 
new solid_dot();
            
$dot    -> size(3)
                    -> halo_size(1)
                    -> colour(
$lineParam['colour'])
                    -> tooltip('#val#');    
            
$line    -> set_default_dot_style(
$dot);
            
            
$this->arrLine[]    = 
$line;
        }
        
        
//
x为时间
        
foreach(
$arrXLabels 
as &
$item)
        {
            
$item = 
substr(
$item, 6);
        }
        
        
$jsonData    = 
$this->getJsonData(
$this->arrLine, 
$arrXLabels
$intYmax + 2);
        
$this->arrLine    = 
array();
//
置空
        
return 
$jsonData;
    }
    
    
/*
*
     * 利用open_flash_chart创造多条直线
     * @return jsondata
     
*/
    
protected 
function getJsonData(
$arrLine
$arrXLabels
$intYmax){
        
        
$chart    = 
new open_flash_chart();
        
$t        = 
$this->set_Tooltip();
        
$chart    -> set_tooltip(
$t);
        
$chart    -> set_bg_colour('#FFFFFF');
        
$x_Axis    = 
$this->setX_Axis(
$arrXLabels);
        
$y_Axis    = 
$this->setY_Axis(
$intYmax);
        
$chart    ->set_x_axis(
$x_Axis);
        
$chart    ->set_y_axis(
$y_Axis);
                
        
foreach (
$arrLine 
as 
$key=>
$value) {
            
            
$chart->add_element(
$value);
        }
        
        
$jsonData    = 
$chart->toPrettyString();
        
        
return 
$jsonData;
    }
    
    
/*
*
     * 设置x轴
     * @return Object x
     
*/
    
protected 
function setX_Axis(
$arrLabels) {
        
        
$x_labels    = 
$this->setX_labels(
$arrLabels);
        
        
$count = 
count(
$arrLabels);
        
if(
$count > 10)
        {
            
$x_labels->visible_steps(
intval(
$count / 7));    
        }
        
        
$x    = 
new x_axis();
        
        
$x    ->colour('#C0C0C0')
            ->grid_colour('#E0E0E0')
            ->set_labels(
$x_labels);
            
        
    
            
        
return 
$x;
    }
    
    
/*
*
     * 设置y轴
     * @return Object y
     
*/
    
protected 
function setY_Axis(
$intYmax) {
        
        
$y_labels    = 
new x_axis_labels();
        
$y_labels    ->set_colour('#696969');
        
        
$intYStep    = 
$intYmax / 5;
        
        
$y    = 
new y_axis();
        
$y    ->set_colour('#C0C0C0');
        
$y    ->set_grid_colour('#E0E0E0');
        
$y    ->set_range(0, 
$intYmax
$intYStep);
        
$y    ->set_labels(
$y_labels);
            
        
return 
$y;
    }
    
    
/*
*
     * 设置x轴的坐标刻度
     * @return Object $x
     
*/
    
protected 
function setX_labels(
$arrLabels    = 
array()) {
        
        
$x    = 
new x_axis_labels();
        
$x    ->set_colour('#696969');
        
$x    ->set_steps(1);
        
$x    ->set_labels(
$arrLabels);
        
        
return 
$x;
    }
    
    
    
    
    
/*
*
     * 设置x轴刻印文字
     * @return Object x
     
*/
    
protected 
function setX_Legend() {
        
        
$x    = 
new x_legend('');
        
$x    ->set_style( '{font-size: 20px; color: #778877}' );
        
return 
$x;
    }
    
    
/*
*
     * 设置y轴刻印文字
     * @return Object x
     
*/
    
protected 
function setY_Legend() {
        
        
$y    = 
new y_legend('');
        
$y    ->set_style( '{font-size: 20px; color: #778877}' );
        
return 
$y;
    }
    
    
/*
*
     * 设置tooltip,值框属性
     * @return Object t
     
*/
    
protected 
function set_Tooltip() {
        
        
$t    = 
new tooltip();
        
$t    ->set_shadow( 
false );
        
$t    ->set_stroke( 1 );
        
$t    ->set_colour( '#6E604F' );
        
$t    ->set_background_colour( '#BDB396' );
        
$t    ->set_title_style( "{font-size: 14px; color: #CC2A43;}" );
        
$t->set_body_style( "{font-size: 10px; font-weight: bold; color: #9932CC;}" );
        
        
return 
$t;
    }
    
    
/*
*
    * 获取虚假数据
    
*/
    
private 
function aGetFadeData(
$startDate
$endDate)
    {
        
$ret = 
array();
        
$dates = 
$this->aGetCdateKeys(
$startDate
$endDate);
        
$model = 
array(
            'dayuv' => 1,
            'weekuv' => 2,
        );
        
foreach(
$dates 
as 
$date)
        {
            
$ret[
$date] = 
$model;
        }
        
return 
$ret;
    }
    
    
/*
*
    * 获取from到to之间的所有时间
    
*/
    
private 
function aGetCdateKeys(
$from
$to)
    {
        
$ret = 
array();
        
$endTime = 
strtotime(
$to);
        
$startTime = 
strtotime(
$from);
        
        
$time = 
$startTime;
        
while(
$time <= 
$endTime)
        {
            
//
入ret
            
$ret[] = 
date("Y-m-d", 
$time);
            
            
//
递增
            
$time = 
strtotime("+1 day", 
$time);
        }
        
return 
$ret;
    }
}
$ajax = 
new ajax();
$ajax->run()

 这个php有点长,是根据open-flash-chart 2.0的教程改写的

注意点:

1 必须导入正确的ofc-library/open-flash-chart.php 

2 最后的json使用toPrettyString生成 

 

至此,完成open-flash-chart 和 jquery 和 php 的结合使用

 

碰到的问题 

在写的过程中,经常会碰到错误:

"Open Flash Chart IO ERROR Loading test data 

 或者

"can not find y-32.txt"等类型的错误

 最可能的情况是:ajax返回的数据错误,这个可以用fidder调试出来,特别查看里面值为null的字段

 

另外抱怨一下:open-flash-chart的文档真的错误很多,哎~毕竟是免费的 

 

参考资料:

 

 

 

作者:yjf512(轩脉刃)

出处:http://www.cnblogs.com/yjf512/

本文版权归yjf512和cnBlog共有,欢迎转载,但未经作者同意必须保留此段声明  

你可能感兴趣的文章
Ubuntu 设置当前用户sudo免密码
查看>>
ionic 调用手机的打电话功能
查看>>
怎么使用阿里云直播服务应用到现在主流直播平台中
查看>>
判断点是否在三角形内
查看>>
知行合一
查看>>
jmeter插件之jsonpath提取响应结果和做断言
查看>>
推荐系统那点事 —— 基于Spark MLlib的特征选择
查看>>
linux 下RTL8723/RTL8188调试记录(命令行)【转】
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
那些年追过的......写过的技术博客
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
CSS魔法堂:Transition就这么好玩
查看>>
解决win7远程桌面连接时发生身份验证错误的方法
查看>>
C/C++ 多线程机制
查看>>
Boost在vs2010下的配置
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>