步骤6 使用LinedCharts转换为钻取报表
有两个方法去将子图表嵌入到父图表中去。我们或者可以通过把新的数据字符串增加到父图表的数据源,也可以仅仅把子图表的数据链接地址加到父图表中去。假如直接在父图表中嵌入子图表的数据,对于我们的例子不大合适,因为有12个月,每个月有30天,每天有24小时,这样显示起来的话会有点混乱。这里我们采用的是数据URL链接的方式,只需要在父图表中要点击的区域设置链接即可。
下面修改代码,让能够产生三种不同类型的子图表:月、日、时,代码如下:
//处理输入,分别获得年、月,日
$Type = $_GET['type'];
$Year = intval($_GET['year']);
$Month = intval($_GET['month']);
$Day = intval($_GET['day']);
//月份名称
$MonthsNames = array(null, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
switch($Type)
{
default:
case 'monthly':
$Query = "SELECT MONTH(Time) AS Value, COUNT(*) AS Total FROM `users` WHERE YEAR(Time)={$Year} GROUP BY Value";
$ResultArray = array_fill(1, 12, 0);
$ChartHeading = 'Monthly New Users for the Year: '.$Year;
$XaxisName = 'Months';
break;
case 'daily':
$Query = "SELECT DAY(Time) AS Value, count(*) AS Total FROM `users` WHERE YEAR(Time)={$Year} AND MONTH(Time)={$Month} GROUP BY Value";
$ResultArray = array_fill(1, 31, 0);
$ChartHeading = 'Daily New Users for the Month: '.$MonthsNames[$Month].'/'.$Year;
$XaxisName = 'Days';
break;
case 'hourly':
$Query = "select HOUR(Time) AS Value, count(*) AS Total FROM `users` WHERE YEAR(Time)={$Year} AND MONTH(Time)={$Month} AND DAY(Time)={$Day} GROUP BY Value";
$ResultArray = array_fill(0, 24, 0);
$ChartHeading = 'Hourly New Users for the Date: '.$Day.'/'.$MonthsNames[$Month].'/'.$Year;
$XaxisName = 'Hours';
break;
}
//连接数据库
require 'connect-to-database.php';
//查询数据库
$QueryResult = mysql_query($Query);
while($Row = mysql_fetch_assoc($QueryResult))
$ResultArray[$Row['Value']]=$Row['Total'];
//生成XML数据
$Output = '<chart caption="'.$ChartHeading.'" xAxisName="'.$XaxisName.'" yAxisName="Users" showNames="1" bgColor="E6E6E6,F0F0F0" bgAlpha="100,50" bgRatio="50,100" bgAngle="270" showBorder="1" borderColor="AAAAAA" baseFontSize="12">';
//根据月、日和时间,生成XML的主体数据
switch($Type)
{
default:
case 'monthly':
foreach($ResultArray as $MonthNumber => $value) // MonthNumber is month number (1-12)
$Output .= '<set value="'.$value.'" name="'.$MonthsNames[$MonthNumber].'" link="newchart-xmlurl-get-data.php?type=daily&year='.$Year.'&month='.$MonthNumber.'"/>';
break;
case 'daily':
foreach($ResultArray as $DayNumber => $value) // DayNumber is day (1-31)
$Output .= '<set value="'.$value.'" name="'.$DayNumber.'" link="newchart-xmlurl-get-data.php?type=hourly&year='.$Year.'&month='.$Month.'&day='.$DayNumber.'"/>';
break;
case 'hourly':
foreach($ResultArray as $HourNumber => $value) // HourNumber is hour (0-23)
$Output .= '<set value="'.$value.'" name="'.$HourNumber.'"/>';
break;
}
$Output .= '</chart>';
header('Content-type: text/xml');
//输出
echo $Output;
?>
下面我们简单解析下上面修改了的部分。
首先,设置了type这个变量来存放图表类型,这里可以是月,日或者是小时。
接着,我们建立了一个$MonthNames数组,这是用来存放每个月的用户访问数据的,注意这里设置了第0个元素是null,因为第1个元素位置代表的是1月份。
根据图表的类型,变量$Query, $ResultArray, $ChartHeading和$XAsixName都会设置为不同的值。如果$Type没有值的话,则默认选择的是月份的图表。
接下来连接数据库,执行查询语句,把结果集存放到$ResultArray中,并且生成XML文件中的头部。
XML文件的主体部分(即生成符合FusionCharts格式的XML)是根据图表的类型而有一点不同,具体为:
月份:基本都是相同的,除了link属性。Link中设定了如下的值:newchart-xmlurl-get-data.php。这里newchart指明了这里是要创建新的一个图表,xmlurl表明数据是通过url的形式去获得的,比如获得1月份的数据,则链接为newchart-xmlurl-get-data.php?type=hourly&Year=2010&Month=1。
日:跟月份也差不多,只不过链接中有day日期这个属性而已。
小时:由于查看图表的最小单位是小时,小时是最后一层的图表了,所以这里对link不做任何的设置。
重新将该文件改名保存为get-data.php,然后运行http://localhost/fcdemo/get-data.php?year=2010,即可看到如下的XML文件:
<set value="486" name="Jan" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=1"/>
<set value="443" name="Feb" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=2"/>
<set value="553" name="Mar" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=3"/>
<set value="550" name="Apr" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=4"/>
<set value="634" name="May" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=5"/>
<set value="622" name="Jun" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=6"/>
<set value="710" name="Jul" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=7"/>
<set value="772" name="Aug" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=8"/>
<set value="850" name="Sep" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=9"/>
<set value="1044" name="Oct" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=10"/>
<set value="1175" name="Nov" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=11"/>
<set value="761" name="Dec" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=12"/>
</chart>
最后,运行http://localhost/fcdemo/demo.html,即可看到如下效果图:
首先这个是显示了1-12月份的数据,而当点每个月份的柱型图时,将会显示一个新的图,即显示每个月31天的数据,如下图:
而当每天的柱型图时,又会显示一个新图表,显示一天内每个小时的用户访问数,如下图: