Created
October 3, 2020 07:01
-
-
Save atsu666/de6a3333e2e2be00eba1c6336029b8fa to your computer and use it in GitHub Desktop.
php/ACMS/GET/Plugin/Schedule.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class ACMS_GET_Plugin_Schedule extends ACMS_GET | |
{ | |
//現在値 or URLコンテキスト から取得&生成する | |
var $year; //年 | |
var $month; //月 | |
var $week; //週 | |
var $day; //日 | |
//変動制の生成値 | |
var $days = array(); //日々 | |
var $cnt_day; //当月の日数 : buildDays()のみ | |
var $_unit = 0; //temporary | |
//config に格納する | |
var $unit; //月表示の折り返し 1 or 7 | |
var $forwardM; //前方月数 | |
var $backM; //後方月数 | |
var $viewmode; //デフォルトの表示 | |
var $listmode; | |
var $formatY; | |
var $formatM; | |
var $formatD; | |
var $formatW; | |
var $labels; | |
var $key; | |
var $week_label = array( | |
'JP' => array( '日', '月', '火', '水', '木', '金', '土' ), | |
//'EN' => array( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ), | |
); | |
var $weekStart; // 七曜表の始まり | |
function get() | |
{ | |
$queryDate = $this->Q->getArray('date'); | |
$this->year = @$queryDate[0] ? date('Y', mktime(0,0,0,1,1,$queryDate[0])) : date('Y'); | |
$this->month = @$queryDate[1] ? date('m', mktime(0,0,0,$queryDate[1],1,$this->year)) : date('n'); | |
$this->day = @$queryDate[2] ? date('d', mktime(0,0,0,$this->month,$queryDate[2],$this->year)) : 1; | |
$this->sep = config('schedule_label_separator'); | |
$this->layoutY = config('schedule_layout_year'); | |
$this->layoutM = config('schedule_layout_month'); | |
$this->layoutD = config('schedule_layout_days'); | |
$this->forwardM = config('schedule_forwardM'); | |
$this->backM = config('schedule_backM'); | |
$this->forwardD = config('schedule_forwardD'); | |
$this->backD = config('schedule_backD'); | |
$this->viewmode = config('schedule_viewmode'); | |
$this->formatY = config('schedule_formatY'); | |
$this->formatM = config('schedule_formatM'); | |
$this->formatD = config('schedule_formatD'); | |
$this->formatW = config('schedule_formatW'); | |
$this->unit = config('schedule_unit'); | |
$this->key = config('schedule_key'); | |
//$this->labels = configArray('schedule_label@'.$this->key); | |
$this->weekStart = config('schedule_week_start', 0); | |
$DB = DB::singleton(dsn()); | |
$SQL = SQL::newSelect('config'); | |
$SQL->addWhereOpr('config_key', 'schedule_label@'.$this->key); | |
$SQL->addWhereOpr('config_blog_id', $this->bid); | |
$labels = $DB->query($SQL->get(dsn()), 'all'); | |
foreach ( $labels as $label ) { | |
$this->labels[] = $label['config_value']; | |
} | |
$this->week_label['JP'] = configArray('week_label'); | |
$Tpl = new Template($this->tpl, new ACMS_Corrector()); | |
$this->buildModuleField($Tpl); | |
if ( count($queryDate) == 1) { //年のみ | |
$this->viewmode = 'year'; | |
} elseif ( count($queryDate) == 2 ) { //年月まで | |
$this->viewmode = 'month'; | |
} | |
switch( $this->viewmode ) { | |
case 'year': | |
$this->listmode = ( $this->layoutY == 'list' ) ? true : false; | |
$this->yearView($Tpl); | |
break; | |
case 'month': | |
$this->listmode = ( $this->layoutM == 'list' ) ? true : false; | |
$this->monthView($Tpl); | |
break; | |
case 'days': | |
$this->listmode = ( $this->layoutD == 'list' ) ? true : false; | |
$this->day = date('d'); | |
$this->daysView($Tpl); | |
break; | |
default: | |
return ''; | |
} | |
return $Tpl->get(); | |
} | |
function getWeekNum($cnt_week) | |
{ | |
return config('schedule_weekRowNo').ceil($cnt_week/7); | |
} | |
function buildDays($year, $month, $week = null) | |
{ | |
$this->cnt_day = date('t', mktime(0,0,0,$month,1,$year)); | |
$cnt_week = null; | |
$_n = 0; | |
$_w = 'w'; | |
if ( $this->weekStart == 1 ) { | |
$_n = 1; | |
$_w = 'N'; | |
} | |
for ( $n = 1; $n <= $this->cnt_day; $n++ ) { | |
// IF not listmode add Prefix Days | |
if ( $n == 1 && empty($this->listmode) ) { | |
$w = date($_w, mktime(0,0,0,$month,$n,$year)); | |
for ( ; $_n < intval($w); $_n++ ) { | |
$cnt_week ++; | |
$this->days[$this->getWeekNum($cnt_week)][] = array(); //future: 前月の数値情報? | |
} | |
} | |
/** | |
* build Day main Logic | |
*/ | |
$date = $year.'-'.$month.'-'.$n; | |
if( isset( $this->week_label[ $this->formatW ] ) ) { | |
$_w = date('w', strtotime($date)); | |
$week_label = $this->week_label[ $this->formatW ][$_w]; | |
} | |
else { | |
$week_label = date($this->formatW, strtotime($date)); | |
} | |
$cnt_week ++; | |
$this->days[$this->getWeekNum($cnt_week)][] = array( | |
'day' => date($this->formatD, mktime(0,0,0,$month,$n,$year)), | |
'id' => intval($n), | |
'week' => $week_label, | |
'weekNo' => config('schedule_weekNo').date('w', strtotime($date)), | |
'timestamp' => date('Y-m-d', mktime(0,0,0,$month,$n,$year)), | |
'url' => acmsLink(array('date' => array($year, $month, $n))), | |
); | |
// IF not listmode add Surfix Days | |
if ( $n == $this->cnt_day && empty($this->listmode) ) { | |
$w = date('w', mktime(0,0,0,$month,$n,$year)); | |
for ( $_n = 0; $_n < intval(6-$w); $_n++ ) { | |
$cnt_week ++; | |
$this->days[$this->getWeekNum($cnt_week)][] = array(); //future: 次月の数値情報? | |
} | |
} | |
} | |
} | |
function destructDays() | |
{ | |
$this->days = array(); | |
} | |
function getMonthData($year, $month) | |
{ | |
if ( $this->Post->isExists('reapply') ) { | |
$takeover = $this->Post->getArray('reapply'); | |
return array('data' => $takeover[0], 'field' => $takeover[1]); | |
} else { | |
$DB = DB::singleton(dsn()); | |
$SQL = SQL::newSelect('schedule'); | |
$SQL->addSelect('schedule_data'); | |
$SQL->addSelect('schedule_field'); | |
$SQL->addWhereOpr('schedule_id', $this->key); | |
$SQL->addWhereOpr('schedule_year', $year); | |
$SQL->addWhereOpr('schedule_month', $month); | |
$SQL->addWhereOpr('schedule_blog_id', $this->bid); | |
$row = $DB->query($SQL->get(dsn()), 'row'); | |
return array( | |
'data' => @unserialize($row['schedule_data']), | |
'field' => @unserialize($row['schedule_field']) | |
); | |
} | |
} | |
function buildMonth(&$Tpl, $month, $year) | |
{ | |
$this->buildDays($year, $month); | |
$DATA = $this->getMonthData($year, $month); | |
foreach($this->days as $weekKey => $weekRow){ | |
foreach ( $weekRow as $day ) { | |
$data = (isset($day['id']) && isset($DATA['data'][$day['id']])) ? $DATA['data'][$day['id']] : false; | |
$field = (isset($day['id']) && isset($DATA['field'][$day['id']])) ? $DATA['field'][$day['id']] : false; | |
if( !empty($this->listmode) ) { //リストモードであればここでplan | |
$this->buildPlan($Tpl, $day, $data); | |
} elseif( !empty($day) ) { | |
$this->addLabel($Tpl, $day, $data); | |
} | |
$dayBlock = array('day:loop','week:loop','month:loop','unit:loop'); | |
if ( !empty($DATA['field'][@$day['id']]) ) { //fieldが存在すればadd | |
$vars = $this->buildField($field, $Tpl, $dayBlock, null); | |
$day = array_merge($day, $vars); | |
} | |
if ( isset($day['timestamp']) ) { | |
$day += $this->buildDate($day['timestamp'], $Tpl, 'day:loop'); | |
} | |
$Tpl->add($dayBlock, $day); | |
if ( !empty($this->listmode) ) { //リストモードであればここでweek | |
$Tpl->add(array('week:loop','month:loop','unit:loop'), array('weekRowNo' =>$weekKey)); | |
} | |
} | |
if ( empty($this->listmode) ) { //リストモードでなければここでweek | |
$Tpl->add(array('week:loop','month:loop','unit:loop'), array('weekRowNo' =>$weekKey)); | |
} | |
} | |
// 月表示ならば、月送りを出力する( monthly block ) | |
$ZENGO = $this->getContext($year, $month); | |
if ( $this->viewmode == 'month' ) { | |
$nextUrl = explode('-', $ZENGO['nextM']); | |
$prevUrl = explode('-', $ZENGO['prevM']); | |
$Tpl->add(array('monthly', 'month:loop', 'unit:loop'), array( | |
'year' => date($this->formatY, mktime(0,0,0,$month,1,$year)), | |
'month' => date($this->formatM, mktime(0,0,0,$month,1,$year)), | |
'time' => date('Y-m-d', mktime(0,0,0,$month,1,$year)), | |
'nextUrl' => acmsLink(array('date' => array($nextUrl[0],$nextUrl[1]))), | |
'prevUrl' => acmsLink(array('date' => array($prevUrl[0],$prevUrl[1]))), | |
)); | |
} | |
$vars = array( | |
'year' => date($this->formatY, mktime(0,0,0,$month,1,$year)), | |
'month' => date($this->formatM, mktime(0,0,0,$month,1,$year)), | |
'time' => date('Y-m-d', mktime(0,0,0,$month,1,$year)), | |
'_year' => $year, | |
'_month' => $month, | |
'cnt_day'=> $this->cnt_day, | |
'url' => acmsLink(array('date' => array($year, $month))), | |
'mode' => $this->listmode ? 'list' : 'grid', | |
'next' => $ZENGO['nextM'], | |
'prev' => $ZENGO['prevM'], | |
); | |
if ( isset($this->week_label[$this->formatW]) ) { | |
for ( $i = 0; $i < 7; $i ++ ) { | |
$vars += array('w#'.$i => $this->week_label[$this->formatW][$i]); | |
} | |
} | |
else { | |
for ( $i = 0; $i < 7; $i ++ ) { | |
$vars += array('w#'.$i => date($this->formatW, strtotime('+'.$i.'day', strtotime('-'.date("w").'day')))); | |
} | |
} | |
// yead select | |
$year = $vars['year']; | |
$maxYear = intval($year) + 10; | |
for ( $y=2009; $y<$maxYear; $y++ ) { | |
$sYear = array('sYear' => $y); | |
if ( $y == $year ) $sYear['selected'] = config('attr_selected'); | |
$Tpl->add(array('yearSelect:loop', 'month:loop','unit:loop'), $sYear); | |
} | |
// month select | |
$month = $vars['month']; | |
for ( $m=1; $m<=12; $m++ ) { | |
$sMonth = array('sMonth' => $m); | |
if ( $m == $month ) $sMonth['selected'] = config('attr_selected'); | |
$Tpl->add(array('monthSelect:loop', 'month:loop','unit:loop'), $sMonth); | |
} | |
// add Templete | |
$Tpl->add(array('month:loop','unit:loop'), $vars); | |
$this->destructDays(); | |
$this->_unit ++; | |
if ( $this->_unit == $this->unit ) { | |
$Tpl->add('unit:loop'); | |
$this->_unit = 0; | |
} | |
} | |
function addLabel(&$Tpl, &$day, $Plan) | |
{ | |
$dayNum = $day['id']; | |
if ( is_array($Plan['item'.$dayNum]) ) { | |
// first Label on Calendar | |
$labelKey = @$Plan['label'.$dayNum][0]; | |
// first Item on Calendar | |
if ( !empty($Plan['item'.$dayNum][0]) ) { | |
$day['dayItem'] = $Plan['item'.$dayNum][0]; | |
} | |
} | |
if ( !empty($labelKey) ){ | |
foreach ( $this->labels as $chunk ) { | |
$chunk = explode($this->sep, $chunk); | |
$key = $chunk[1]; | |
$label = $chunk[0]; | |
$class = @$chunk[2]; | |
$vars = array( | |
'label' => $label, | |
'key' => $key, | |
'class' => @$class, | |
); | |
if ( $key == @$labelKey && !empty($class) ) { | |
$day['dayClass'] = $class; | |
} | |
if ( $key == @$labelKey && !empty($label) ) { | |
$day['dayLabel'] = $label; | |
} | |
} | |
} | |
} | |
function buildPlan(&$Tpl, $day, $Plan) | |
{ | |
$dayNum = $day['id']; | |
$loop = 0; | |
$loop2 = 0; | |
if (isset($Plan['item'.$dayNum]) && is_array($Plan['item'.$dayNum])) { | |
$loop = count($Plan['item'.$dayNum]); | |
} | |
if (isset($Plan['label'.$dayNum]) && is_array($Plan['label'.$dayNum])) { | |
$loop2 = count($Plan['label'.$dayNum]); | |
} | |
$loop = ($loop < $loop2) ? $loop2 : $loop; | |
$cnt = 1; | |
/** | |
* IF !!ADMIN adjust multiple plan | |
*/ | |
if ( !!ADMIN ) { | |
if ($loop == 0) $loop = 1; | |
else $cnt = 0; | |
if (property_exists($this, 'plan') && $this->plan === 'on') { | |
$loop += 1; | |
} else { | |
$loop = 1; | |
} | |
} | |
if (empty($loop)) $loop = 1; | |
for ( $i = 0; $i < $loop; $i++ ) { | |
$labelKey = @$Plan['label'.$dayNum][$i]; | |
$planName = @$Plan['item'.$dayNum][$i]; | |
$planBlock = array('plan', 'day:loop', 'week:loop', 'month:loop', 'unit:loop'); | |
$planRow = array('no' => $dayNum); | |
if ( !empty($planName) ) $planRow += array('item' => $planName); | |
if ( !empty($labelKey) ) $planRow += array('key' => $labelKey); | |
if ( !empty($this->labels) ) { | |
foreach ( $this->labels as $chunk ) { | |
$chunk = explode($this->sep, $chunk); | |
$key = $chunk[1]; | |
$label = $chunk[0]; | |
$class = @$chunk[2]; | |
$vars = array( | |
'label' => $label, | |
'key' => $key, | |
'class' => @$class, | |
); | |
$label_inner_vars = $vars; | |
$label_outer_vars = $vars; | |
/** | |
* IF !!ADMIN add label:loop / ELSE merge Plan row | |
*/ | |
if ( !!ADMIN ) { | |
if ( $key == @$labelKey && !($i == ($loop - $cnt)) ) { | |
$label_inner_vars['selected'] = config('attr_selected'); | |
} else { | |
unset($label_inner_vars['selected']); | |
unset($planRow['selected']); | |
} | |
$Tpl->add(array('label:loop', 'plan', 'day:loop','week:loop','month:loop','unit:loop'), $label_inner_vars); | |
} | |
if ( $key == @$labelKey ) $planRow += $label_outer_vars; | |
} | |
} | |
/** | |
* IF VAR IS EMPTY add var:null | |
*/ | |
if ( empty($planRow['item']) ) $Tpl->add(array('item:null', 'plan', 'day:loop', 'week:loop', 'month:loop', 'unit:loop')); | |
if ( empty($planRow['label']) ) $Tpl->add(array('label:null', 'plan', 'day:loop', 'week:loop', 'month:loop', 'unit:loop')); | |
$Tpl->add($planBlock, $planRow); | |
} | |
} | |
function yearView(&$Tpl) | |
{ | |
for ( $i = 1; $i < 13 ; $i++ ) { | |
$this->buildMonth($Tpl, $i, $this->year); | |
} | |
$DB = DB::singleton(dsn()); | |
$SQL = SQL::newSelect('schedule'); | |
$SQL->addSelect('schedule_year'); | |
$SQL->addWhereOpr('schedule_id', $this->key); | |
$SQL->addWhereOpr('schedule_year', '0000', '<>'); | |
$SQL->addWhereOpr('schedule_blog_id', $this->bid); | |
$Recently = clone $SQL; | |
$Recently->addOrder('schedule_year', 'DESC'); | |
$recentryValue = $DB->query($SQL->get(dsn()), 'one'); | |
$Past = clone $SQL; | |
$Past->addOrder('schedule_year', 'ASC'); | |
$pastValue = $DB->query($SQL->get(dsn()), 'one'); | |
$vars = array(); | |
//----------- | |
// prev link | |
if ( ($this->year - 1) >= intval($pastValue) ) { | |
$vars['prevYear'] = acmsLink(array('date' => array($this->year - 1))); | |
} | |
//----------- | |
// next link | |
if ( ($this->year + 1) <= intval($recentryValue) ) { | |
$vars['nextYear'] = acmsLink(array('date' => array($this->year + 1))); | |
} | |
$Tpl->add('year', $vars); | |
} | |
function monthView(&$Tpl) | |
{ | |
$loop = $this->forwardM + $this->backM + 1; | |
$_year = date('Y', mktime(0,0,0,$this->month - $this->backM, $this->day, $this->year)); | |
$_month = date('m', mktime(0,0,0,$this->month - $this->backM, $this->day, $this->year)); | |
for ( $i = 0; $i < $loop ; $i++ ) { | |
$year = date('Y', mktime(0,0,0,$_month+$i, $this->day, $_year)); | |
$month = date('m', mktime(0,0,0,$_month+$i, $this->day, $_year)); | |
$this->buildMonth($Tpl, $month, $year); | |
} | |
if ( fmod($loop, $this->unit) && $loop != 1 ) { | |
$Tpl->add('unit:loop'); | |
} | |
} | |
function daysView(&$Tpl) | |
{ | |
$loop = $this->forwardD + $this->backD + 1; | |
$_year = date('Y', mktime(0,0,0,$this->month, $this->day - $this->backD, $this->year)); | |
$_month = date('m', mktime(0,0,0,$this->month, $this->day - $this->backD, $this->year)); | |
$_day = date('d', mktime(0,0,0,$this->month, $this->day - $this->backD, $this->year)); | |
$now = mktime(0,0,0,$_month,$_day,$_year); | |
for ( $i = 0; $i < $loop; $i++ ) { | |
$ymd = date('Y-m-j', strtotime('+'.$i.'day', $now)); | |
$ymd = explode('-', $ymd); | |
$year = $ymd[0]; | |
$month = $ymd[1]; | |
$dayNum = $ymd[2]; | |
// sotre data | |
if ( empty($DATA[$year.$month]) ) | |
{ | |
$DATA[$year.$month] = $this->getMonthData($year, $month); | |
} | |
// store days | |
if ( empty($DAYS[$year.$month]) ) | |
{ | |
$this->buildDays($year, $month); | |
$DAYS[$year.$month][0] = ''; | |
foreach ( $this->days as $weekRow ) { | |
$DAYS[$year.$month] = array_merge($DAYS[$year.$month], $weekRow); | |
} | |
$this->destructDays(); | |
} | |
$day = $DAYS[$year.$month][$dayNum]; | |
$plan = $DATA[$year.$month]['data'][$dayNum]; | |
$field = $DATA[$year.$month]['field'][$dayNum]; | |
$this->buildPlan($Tpl, $day, $plan); | |
$this->addLabel($Tpl, $day, $plan); | |
$dayBlock = array('day:loop','week:loop','month:loop','unit:loop'); | |
if ( !empty($field) ) { //fieldが存在すればadd | |
$vars = $this->buildField($field, $Tpl, $dayBlock, null); | |
$day = array_merge($day, $vars); | |
} | |
$Tpl->add($dayBlock, array_merge($day, array( | |
'year' => date($this->formatY, mktime(0,0,0,$month,1,$year)), | |
'month' => date($this->formatM, mktime(0,0,0,$month,1,$year)), | |
'time' => date('Y-m-d', mktime(0,0,0,$month,1,$year)), | |
))); | |
$Tpl->add(array('week:loop','month:loop','unit:loop')); | |
} | |
$vars = array( | |
); | |
$Tpl->add(array('month:loop','unit:loop'), $vars); | |
} | |
function getContext($year, $month, $day = null) | |
{ | |
if ( empty($day) ) $day = 1; | |
$fmt = 'Y-m-d'; | |
$ZENGO = array( | |
'nextM' => date($fmt, mktime(0,0,0,$month + 1, $day, $year)), | |
'prevM' => date($fmt, mktime(0,0,0,$month - 1, $day, $year)), | |
'nextY' => date($fmt, mktime(0,0,0,$month, $day, $year + 1)), | |
'prevY' => date($fmt, mktime(0,0,0,$month, $day, $year - 1)), | |
'nextD' => date($fmt, mktime(0,0,0,$month, $day + 1, $year)), | |
'prevD' => date($fmt, mktime(0,0,0,$month, $day - 1, $year)), | |
); | |
return $ZENGO; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment