class admin_blog_mainAnalyticsWidgetContainer extends admin_blog_mainBaseWidgetContainer
{
private $db; // DB接続オブジェクト
+ private $startDate; // 集計期間(開始)
+ private $endDate; // 集計期間(終了)
private $calcTypeArray; // 集計タイプ
private $termTypeArray; // 期間タイプ
private $calcType; // 選択中の集計タイプ
private $termType; // 選択中の期間タイプ
private $yTickValueArray; // Y軸の最大値リスト
+ private $dateKeyArray; // 日付データ取得用キー
private $maxViewCount; // コンテン参照数最大値
private $graphDataArray; // グラフ用データ(X軸値をキー、Y軸値を値とする連想配列)
const TERM_TYPE_ALL = '_all'; // 全データ表示選択
// 集計タイプ
$this->calcTypeArray = array(
array( 'name' => '日単位', 'value' => 'day'),
- array( 'name' => '時間単位', 'value' => 'hour'),
array( 'name' => '月単位', 'value' => 'month'),
+ array( 'name' => '時間単位', 'value' => 'hour'),
array( 'name' => '週単位', 'value' => 'week')
);
function _assign($request, &$param)
{
// 集計開始日を取得
- if (empty($startDate)){
+ if (empty($this->startDate)){
if ($this->calcType == 'week'){ // 週単位で集計の場合
switch ($this->termType){ // 期間タイプ
case 'month':
- $startDate = date(self::DATE_KEY_FORMAT, strtotime("$endDate -28 day")); // 1ヶ月前
+ $this->startDate = date(self::DATE_KEY_FORMAT, strtotime("$this->endDate -28 day")); // 1ヶ月前
break;
case '3month':
- $startDate = date(self::DATE_KEY_FORMAT, strtotime("$endDate -86 day")); // 3ヶ月前
+ $this->startDate = date(self::DATE_KEY_FORMAT, strtotime("$this->endDate -86 day")); // 3ヶ月前
break;
case '6month':
- $startDate = date(self::DATE_KEY_FORMAT, strtotime("$endDate -172 day")); // 6ヶ月前
+ $this->startDate = date(self::DATE_KEY_FORMAT, strtotime("$this->endDate -172 day")); // 6ヶ月前
break;
case '1year':
- $startDate = date(self::DATE_KEY_FORMAT, strtotime("$endDate -1 year")); // 1年前
+ $this->startDate = date(self::DATE_KEY_FORMAT, strtotime("$this->endDate -1 year")); // 1年前
break;
case self::TERM_TYPE_ALL: // すべてのデータのとき
- $startDate = NULL;
+ $this->startDate = NULL;
break;
}
} else {
switch ($this->termType){ // 期間タイプ
case 'month':
- $startDate = date(self::DATE_KEY_FORMAT, strtotime("$endDate -30 day")); // 1ヶ月前
+ $this->startDate = date(self::DATE_KEY_FORMAT, strtotime("$this->endDate -30 day")); // 1ヶ月前
break;
case '3month':
- $startDate = date(self::DATE_KEY_FORMAT, strtotime("$endDate -90 day")); // 3ヶ月前
+ $this->startDate = date(self::DATE_KEY_FORMAT, strtotime("$this->endDate -90 day")); // 3ヶ月前
break;
case '6month':
- $startDate = date(self::DATE_KEY_FORMAT, strtotime("$endDate -180 day")); // 6ヶ月前
+ $this->startDate = date(self::DATE_KEY_FORMAT, strtotime("$this->endDate -180 day")); // 6ヶ月前
break;
case '1year':
- $startDate = date(self::DATE_KEY_FORMAT, strtotime("$endDate -1 year")); // 1年前
+ $this->startDate = date(self::DATE_KEY_FORMAT, strtotime("$this->endDate -1 year")); // 1年前
break;
case self::TERM_TYPE_ALL: // すべてのデータのとき
- $startDate = NULL;
+ $this->startDate = NULL;
break;
}
}
// 集計終了日
- $endDate = date(self::DATE_KEY_FORMAT); // 本日を含める
+ $this->endDate = date(self::DATE_KEY_FORMAT); // 本日を含める
} else {
// 開始日が設定されている場合は日数分取得
}
-
- // 集計グラフ用データ取得
- $this->db->getContentViewCountByDate(blog_mainCommonDef::VIEW_CONTENT_TYPE, ''/*すべてのコンテンツ対象*/, $startDate, $endDate, array($this, 'contentViewCountLoop'));
// 集計タイプメニュー作成
$this->createCalcTypeMenu();
// ##### 集計グラフ作成 #####
+ // 集計グラフ用データ取得
+ $this->db->getAllContentViewCountByDate(blog_mainCommonDef::VIEW_CONTENT_TYPE, $this->startDate, $this->endDate, array($this, 'contentViewCountLoop'));
+
// X軸ラベル作成
$xTitleArray = array();
$yValueArray = array();
- $date = $startDate;
- $endTimestamp = strtotime($endDate);
+ $this->dateKeyArray = array(); // 日付データ取得用キー
+ $date = $this->startDate;
+ $dateTimestamp = strtotime($this->startDate);
+ $startTimestamp = $dateTimestamp;
+ $endTimestamp = strtotime($this->endDate);
while (true){
- $dateTimestamp = strtotime($date);
if ($dateTimestamp > $endTimestamp) break;
+ $this->dateKeyArray[] = $date; // 日付データ取得用キー
// グラフ用のデータ作成
$xTitleArray[] = date('n/j', $dateTimestamp); // X軸タイトル。表示フォーマットに変換。
} else {
$yValueArray[] = 0;
}
-
- $date = date(self::DATE_KEY_FORMAT, strtotime("$date 1 day")); // 次の日に更新
+ $dateTimestamp = strtotime("$date 1 day");
+ $date = date(self::DATE_KEY_FORMAT, $dateTimestamp); // 次の日に更新
}
- $xTitleArray = array_map(create_function('$a','return "\'" . $a . "\'";'), $xTitleArray);
- $graphDataXStr = '[' . implode(', ', $xTitleArray) . ']';
+ $graphDataXStr = '[' . implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $xTitleArray)) . ']';
$graphDataYStr = '[' . implode(', ', $yValueArray) . ']';
// グラフY座標最大値取得
}
}
- // ##### 上位コンテンツを取得 #####
- $this->db->getTopContentByDateRange(blog_mainCommonDef::VIEW_CONTENT_TYPE, $startDate, $endDate, self::DEFAULT_LIST_COUNT, 1/*先頭ページ*/, $this->_langId, array($this, 'contentListLoop'));
+ // ##### 上位コンテンツ一覧を作成 #####
+ // 上位コンテンツを取得
+ $this->db->getTopContentByDateRange(blog_mainCommonDef::VIEW_CONTENT_TYPE, $this->startDate, $this->endDate, self::DEFAULT_LIST_COUNT, 1/*先頭ページ*/, $this->_langId, array($this, 'contentListLoop'));
+
+ // X軸タイトル作成
+ $xTitleCount = count($xTitleArray);
+ for ($i = 0; $i < $xTitleCount; $i++){
+ $row = array(
+ 'date' => $this->convertToDispString($xTitleArray[$i]) // X軸タイトル
+ );
+ $this->tmpl->addVars('datelist', $row);
+ $this->tmpl->parseTemplate('datelist', 'a');
+ }
// ライブラリパス
$libDir = '';
$libInfo = $this->gPage->getScriptLibInfo(self::LIB_JQPLOT);
if (!empty($libInfo)) $libDir = $libInfo['dir'];
- $this->tmpl->addVar("_widget", "lib_dir", $libDir);
+ $this->tmpl->addVar('_widget', 'lib_dir', $libDir);
// 値を埋め込む
- $this->tmpl->addVar("draw_graph", "x_ticks", $graphDataXStr); // グラフX軸タイトル
- $this->tmpl->addVar("draw_graph", "y_values", $graphDataYStr); // グラフY軸値
- $this->tmpl->addVar("draw_graph", "y_max", $yMax); // グラフY座標最大値
+ $this->tmpl->addVar('_widget', 'start_date', $this->convertToDispDate($this->startDate)); // 集計期間(開始)
+ $this->tmpl->addVar('_widget', 'end_date', $this->convertToDispDate($this->endDate)); // 集計期間(終了)
+ $this->tmpl->addVar('draw_graph', 'x_ticks', $graphDataXStr); // グラフX軸タイトル
+ $this->tmpl->addVar('draw_graph', 'y_values', $graphDataYStr); // グラフY軸値
+ $this->tmpl->addVar('draw_graph', 'y_max', $yMax); // グラフY座標最大値
}
/**
* 集計タイプ選択メニュー作成
*/
function contentListLoop($index, $fetchedRow, $param)
{
+ $contentId = $fetchedRow['vc_content_id'];
+ $viewData = $this->getContentViewData($contentId);
+
+ // アクセス数一覧を作成
+ $this->tmpl->clearTemplate('countlist');
+ $dateKeyCount = count($this->dateKeyArray);
+ for ($i = 0; $i < $dateKeyCount; $i++){
+ $dateKey = $this->dateKeyArray[$i];
+ $accessCount = $viewData[$dateKey];
+ if (!isset($accessCount)) $accessCount = 0;
+
+ $menurow = array(
+ 'count' => $accessCount
+ );
+ $this->tmpl->addVars('countlist', $menurow);
+ $this->tmpl->parseTemplate('countlist', 'a');
+ }
+
// echo $fetchedRow['be_name'] . '-' . $fetchedRow['vc_content_id'].'-[' .$fetchedRow['total'].'] ';
+
$row = array(
'name' => $this->convertToDispString($fetchedRow['be_name']) // 名前
);
$this->tmpl->parseTemplate('itemlist', 'a');
return true;
}
+ /**
+ * コンテンツごとのアクセス数データを取得
+ *
+ * @param int $contentId コンテンツID
+ * @return array 集計データ
+ */
+ function getContentViewData($contentId)
+ {
+ $total = 0;
+ $viewData = array();
+ $ret = $this->db->getContentViewCountByDate(blog_mainCommonDef::VIEW_CONTENT_TYPE, $contentId, $this->startDate, $this->endDate, $rows);
+ if ($ret){
+ $rowCount = count($rows);
+ for ($i = 0; $i < $rowCount; $i++){
+ $row = $rows[$i];
+ $date = date(self::DATE_KEY_FORMAT, strtotime($row['vc_date']));
+ $dayTotal = $row['total'];
+ $viewData[$date] = $dayTotal; // 日単位のアクセス数
+ $total += $dayTotal;
+ }
+ $viewData['total'] = $total; // 総アクセス数
+ }
+ return $viewData;
+ }
}
?>
class blog_analyticsDb extends BaseDb
{
/**
+ * 全コンテンツの参照数を日付範囲で取得
+ *
+ * @param string $typeId コンテンツタイプ
+ * @param date $startDate 集計期間、開始日(NULL=先頭からすべて)
+ * @param date $endDate 集計期間、終了日(NULL=最後まですべて)
+ * @param function $callback コールバック関数
+ * @return なし
+ */
+ function getAllContentViewCountByDate($typeId, $startDate, $endDate, $callback)
+ {
+ $params = array();
+ $queryStr = 'SELECT vc_date, SUM(vc_count) AS total FROM _view_count ';
+ $queryStr .= 'WHERE vc_type_id = ? '; $params[] = $typeId; // データタイプ
+
+ // 日付範囲
+ if (!empty($startDate)){
+ $queryStr .= 'AND ? <= vc_date ';
+ $params[] = $startDate;
+ }
+ if (!empty($endDate)){
+ $queryStr .= 'AND vc_date <= ? ';
+ $params[] = $endDate;
+ }
+
+ // 日付でソート
+ $queryStr .= 'GROUP BY vc_date ';
+ $queryStr .= 'ORDER BY vc_date';
+
+ $this->selectLoop($queryStr, $params, $callback);
+ }
+ /**
* コンテンツの参照数を日付範囲で取得
*
- * @param string $typeId コンテンツタイプ
- * @param string $contentId コンテンツID(空の場合はすべての集計)
- * @param date $startDate 集計期間、開始日(NULL=先頭からすべて)
- * @param date $endDate 集計期間、終了日(NULL=最後まですべて)
- * @param function $callback コールバック関数
- * @return なし
+ * @param string $typeId コンテンツタイプ
+ * @param string $contentId コンテンツID
+ * @param date $startDate 集計期間、開始日(NULL=先頭からすべて)
+ * @param date $endDate 集計期間、終了日(NULL=最後まですべて)
+ * @param array $rows 取得した行データ
+ * @return bool true=取得、false=取得せず
*/
- function getContentViewCountByDate($typeId, $contentId, $startDate, $endDate, $callback)
+ function getContentViewCountByDate($typeId, $contentId, $startDate, $endDate, &$rows)
{
$params = array();
$queryStr = 'SELECT vc_date, SUM(vc_count) AS total FROM _view_count ';
$queryStr .= 'GROUP BY vc_date ';
$queryStr .= 'ORDER BY vc_date';
- $this->selectLoop($queryStr, $params, $callback);
+ $retValue = $this->selectRecords($queryStr, $params, $rows);
+ return $retValue;
}
/**
* 指定期間の参照が多い順にコンテンツを取得