Echart.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. /*
  3. * FecShop file.
  4. *
  5. * @link http://www.fecshop.com/
  6. * @copyright Copyright (c) 2016 FecShop Software LLC
  7. * @license http://www.fecshop.com/license/
  8. */
  9. namespace fecshop\services\helper;
  10. use fecshop\services\Service;
  11. /**
  12. * Format services.
  13. * @author Terry Zhao <2358269014@qq.com>
  14. * @since 1.0
  15. */
  16. /**
  17. * 二次开发说明:
  18. * 本文件是对echart的封装,将数据传递进函数,出来echart的html 格式,可以很方便的使用。
  19. * 使用方法:Yii::$service->helper->echart->xxx(), xxx代表该类下的方法。
  20. * 使用该方法前,您需要加载echart js,对于appadmin已经加载,可以参看文件:@fecshop/app/appadmin/theme/base/default/layouts/dashboard.php 41行处
  21. * echart3 下载地址:http://echarts.baidu.com/download3.html
  22. * appadmin因为是后台,在上面下载的是完整的
  23. * 如果您想在前台入口,譬如appfront, apphtml5使用,可以选择比较小的js文件下载
  24. * 目前只有appadmin是默认加载了js,如果您想在前天入口,譬如appfront, apphtml5使用,您可以自行加载
  25. * 自行加载:进入到模板路径,将下载的js文件放到./assets/js下面,在layouts文件夹找到相应的layouts文件,添加设置即可,具体的方式您可以参考:@fecshop/app/appadmin/theme/base/default/layouts/dashboard.php
  26. */
  27. class Echart extends Service
  28. {
  29. protected $i = 0;
  30. /**
  31. * @param $data | Array, 用来展示图标的数据。 - 折线
  32. * $data = [
  33. * '最高气温' => [
  34. * '周1' => 11,
  35. * '周2' => 3,
  36. * '周3' => 15,
  37. * '周4' => 55,
  38. * '周5' => 43,
  39. * '周6' => 77,
  40. * '周7' => 11,
  41. * ],
  42. * '最低气温' => [
  43. * '周1' => 1,
  44. * '周2' => 3,
  45. * '周3' => 5,
  46. * '周4' => 5,
  47. * '周5' => 3,
  48. * '周6' => 7,
  49. * '周7' => 1,
  50. * ],
  51. *
  52. * ];
  53. * @param $yPrex | String, 在Y轴的值加一个后缀,譬如问题加 °C
  54. * @param $legend | boolean, 是否显示 legend
  55. * @param $title | String,标题
  56. * @param $width | Int,图表的长度
  57. * @param $height | Int,图标的高度
  58. * @return string 返回X-Y线性图表
  59. *
  60. */
  61. public function getLine($data, $legend = false, $yPrex = '', $width = 1100, $height = 400, $title = '')
  62. {
  63. $this->i++;
  64. $div_id = "main_".$this->i;
  65. $legendArr = [];
  66. $xAxis = [];
  67. $series = [];
  68. $legendStr = '';
  69. if (is_array($data)) {
  70. foreach ($data as $key => $info) {
  71. $legendArr[] = '\''.$key.'\'';
  72. if (is_array($info)) {
  73. foreach ($info as $x => $y) {
  74. $xAxis[] = $x;
  75. }
  76. }
  77. }
  78. }
  79. $legendStr = implode(',', $legendArr);
  80. $xAxis = array_unique($xAxis);
  81. sort($xAxis);
  82. $xAxisArr = [];
  83. foreach ($xAxis as $s) {
  84. $xAxisArr[] = '\''.$s.'\'';
  85. }
  86. $xAxisStr = implode(',', $xAxisArr);
  87. // 计算series
  88. $seriesArr = [];
  89. if (is_array($data)) {
  90. foreach ($data as $key => $info) {
  91. if (is_array($info)) {
  92. $arr = [];
  93. foreach ($xAxis as $s) {
  94. if (isset($info[$s]) && $info[$s]) {
  95. $arr[] = $info[$s];
  96. } else {
  97. $arr[] = 0;
  98. }
  99. }
  100. $s = implode(',', $arr);
  101. $seriesArr[] = "
  102. {
  103. name:'".$key."',
  104. type:'line',
  105. data:[".$s."],
  106. smooth: true,
  107. markPoint: {
  108. data: [
  109. {type: 'max', name: '最大值'},
  110. {type: 'min', name: '最小值'}
  111. ]
  112. },
  113. markLine: {
  114. data: [
  115. {type: 'average', name: '平均值'}
  116. ]
  117. }
  118. }
  119. ";
  120. }
  121. }
  122. }
  123. $seriesArr = implode(',', $seriesArr);
  124. $str = "
  125. <div id='".$div_id."' style='width: ".$width."px;height:".$height."px;'></div>
  126. <script type=\"text/javascript\">
  127. // 基于准备好的dom,初始化echarts实例
  128. var myChart = echarts.init(document.getElementById('".$div_id."'));
  129. // 指定图表的配置项和数据
  130. var option = {
  131. title: {
  132. text: '".$title."'
  133. },
  134. tooltip: {
  135. trigger: 'axis'
  136. },";
  137. if ($legend) {
  138. $str .= "
  139. legend: {
  140. data:[".$legendStr."]
  141. },
  142. ";
  143. }
  144. $str .="
  145. toolbox: {
  146. show: false,
  147. feature: {
  148. dataZoom: {
  149. yAxisIndex: 'none'
  150. },
  151. dataView: {readOnly: false},
  152. magicType: {type: ['line', 'bar']},
  153. restore: {},
  154. saveAsImage: {}
  155. }
  156. },
  157. dataZoom: [{}, { type: 'inside' }],
  158. xAxis: {
  159. type: 'category',
  160. boundaryGap: false,
  161. data: [".$xAxisStr."]
  162. },
  163. yAxis: {
  164. type: 'value',
  165. axisLabel: {
  166. formatter: '{value} ".$yPrex."'
  167. }
  168. },
  169. series: [
  170. ".$seriesArr."
  171. ]
  172. };
  173. // 使用刚指定的配置项和数据显示图表。
  174. myChart.setOption(option);
  175. </script>
  176. ";
  177. return $str;
  178. }
  179. }