cakaphp与open flash chart整合

时间: 2009-9-27 - 分类: PHP - 评论: 1 - 阅读: 1,146 次

最近的接了个工单系统的外快,小项目,1个人2个月搞定。cakephp传说是不错的,但是从来没用过,所以打算就用cakephp,一试果然很爽,一个晚上我就可以上手了,php的框架,以及灵活性,果然是比java好太多了。啊,废话说太多了,这个系统需要一个图形报表,开源的漂亮的图形报表,显然是open flash chart了,完美。

更完美的是,cakephp提供了open flash chart的helper,自己只要调用就行了~~~http://bakery.cakephp.org/articles/view/flashcharthelper-version-3 不过事情总是没有想象的那么顺利,官方整合的这个open flash chart在使用过程中还是发现了一些问题。这里记录一下分享。

先上几张无码高清图:

1

2

3

具体如何整合open flash chart我就不多废话了,请直接参考官方的文档,很详细。我在使用过程中碰到的几个问题以及解决方法记录在这里。如果你也在使用过程中碰到一下的问题,你可以打开你的cakephp工程下面app/views/helpers/flash_char.php这个helper的源代码,参照我下面做的修改。

1.IE6经典的缓存问题

算是被这个bug吓出一身冷汗,还以为open flash chart在IE下不能用了。状况是:图表在首次打开IE6进去后可以正常看到,但是这个时候再点击其他的图表,就出错了,IE8,firefox等浏览器不会有此问题,想来想去不清楚问题所在。后来用httpwatch抓包分析了下,发现IE6第二次不会重新加载图表。shit,又是IE6缓存问题造成的。要解决IE6的缓存问题,当然就是每次请求的时候请求地址后面附带一个随机数。这里我们就要对flash的加载地址后面附带随机数了。

public function render($width = null, $height = null, $chartId = 'default', $domId = false) {
 if (! is_null ( $width )) {
 $this->settings ['width'] = $width;
 }
 if (! is_null ( $height )) {
 $this->settings ['height'] = $height;
 }
 $this->Chart = new open_flash_chart ( );
 //hack for IE cache bug! 给请求地址后面加上一个时间戳
 $this->swf .= '?t=' . mktime ();
 return $this->Flash->renderSwf ( $this->swf, $this->settings ['width'], $this->settings ['height'], $domId, array ('flashvars' => array ('get-data' => 'get_data_' . $chartId ) ) );
 }

2.无法设置默认点样式

这些bug其实不能都怪提供这个helper的作者不小心,因为我觉得open flash chart本身提供的api确实太混乱了,命名又不是非常有规则,导致这边会遗漏掉一些属性设置项。

这个bug的状况是:官方的open flash chart可以设置图表上面点的样式,但是helper上面设置了却无效。查看源代码发现设置点样式的set_default_dot_style方法被遗漏了。。需要自己给它补上:

foreach ( $options as $key => $setting ) {
 switch ($key) {
 case 'line_style' :
 $line_style = new line_style ( $setting [0], $setting [1] );
 $element->line_style ( $line_style );
 break;
 //line的默认点样式无法设置!,方法遗漏,补上。
 case 'default_dot_style' :
 $default_dot = new dot ( );
 foreach ( $setting as $k => $v ) {
 $default_dot->$k ( $v );
 }
 $element->set_default_dot_style ( $default_dot );
 break;
 default :
 $set_method = 'set_' . $key;
 if (is_array ( $setting )) {
 $element->$set_method ( $setting [0], $setting [1] );
 } else {
 $element->$set_method ( $setting );
 }
 break;
 }
 }

补充一点:这个bug只有线状图才会这样,因为其他图的设置点样式的方法是通用的,但是设置线状图的方法是独特的。

3.visible_steps跟rotate属性无法生效

visible_steps属性设置的是横坐标上面间隔多少个坐标是可视的,当横坐标上面的点非常非常密集的时候,就需要间隔显示了,比如1-100,就不显示100个数字了,而是每10个显示一个。rotate属性设置是倾斜度,有些坐标文字比较长,比如说日期,2009年10月20日,这样一个横坐标长度好多个字,这个时候可以通过rotete属性来设置倾斜显示的角度。但是,这个属性也不能生效。

看了下源代码,原因在于:大部分的属性设置,open flash chart都提供了很规范的set方法来实现,但是偏偏这2个属性却是直接调用的,那cakephp这个help都是按照set模式来实现的,所以这2个属性就被忽略了。而且还会报错,因为方法不存在。这个hack也是比较生硬的,只能硬编码:

foreach ( $labelsOptions as $key => $setting ) {
 $set_method = 'set_' . $key;
 //BUG! without this,will skip the visible_steps config。默认都是set方法,但是这2个方法特殊,是直接调用。
 if (in_array ( $key, array ('visible_steps', 'rotate' ) )) {
 $set_method = $key;
 }
 $x_axis_label->$set_method ( $setting );
 }

总结下:整体上,这些bug的来源主要还是因为open flash chart官方的实现比较凌乱的关系,写这个cakephp open flash chart helper的人,还是挺强大的,整理了这么好的东西出来。确实不容易。

标签:

1个评论

  1. 惊鸿 - 2009年10月10日 10:33 上午

    顶一下

发表评论