$yearmon = sprintf( '%04d%02d', $y, $m );
$day_year = sprintf( '%04d', $y );
$day_mon = sprintf( '%02d', $m );
$day_last = (int) date( 't', mktime( 0, 0, 0, $m, 1, $y ) );
$day_start = 1;
$dispMonth = intval( $day_year ) . '年' . intval( $day_mon ) . '月';
$list = new dailyBread_mp3_ListControl();
$list->ConnectDB( $yearmon );
$first = sprintf( '%04d%02d%02d', $y, $m, 1 );
$jsFirst = json_encode( $first );
$zipMonUrl = esc_url( $this->baseurl . 'mode=log&modeex=zipmonmp3&dateid=' . $yearmon );
$returnUrl = esc_url( site_url( '/wp-admin/admin.php?page=ubf-hp-admin-mp3-config' ) );
$dbList = $list->getDbMp3List();
$leftRows = '';
for ( $d = $day_start; $d <= $day_last; $d++ ) {
$dd = sprintf( '%04d%02d%02d', $y, $m, $d );
$disp = sprintf( '%02d/%02d', $m, $d );
// 1日詳細画面との整合性を優先し、最終成果物 datatype(10/100) のみを参照
$mp3Row = $this->_findStageRow( $dbList, $dd, [ 10 ] );
$mp4Row = $this->_findStageRow( $dbList, $dd, [ 100 ] );
$ytRow = $this->_findStageRow( $dbList, $dd, [ 11000 ] );
$b22 = $mp3Row ? DailybreadMpxYoutubeStatus::mp3BadgeHtml( $mp3Row, $dd ) : '✕';
$b23 = $mp4Row ? DailybreadMpxYoutubeStatus::mp4BadgeHtml( $mp4Row, $dd ) : '✕';
$mp3Elapsed = $this->_elapsedLabel( $mp3Row );
$mp4Elapsed = $this->_elapsedLabel( $mp4Row );
$ytElapsed = $this->_elapsedLabel( $ytRow );
// YouTube バッジ
$ytStatus = $list->GetYouTubeUploadedStatus( $dd );
if ( strpos( $ytStatus, '〇' ) !== false ) {
$bYT = '✅';
} elseif ( strpos( $ytStatus, '未アップロード' ) !== false ) {
$bYT = '✕';
} else {
$bYT = '❌';
}
// 確認済みバッジ
$bConf = $this->_badgeConfirm( $dbList, $dd, '101' );
// ダブルチェックバッジ
$bDbl = $this->_badgeConfirm( $dbList, $dd, '102' );
// 左ペイン行
$onclick = 'onclick="mvSelectDay(\'' . $dd . '\')"';
$leftRows .= '
' . "\n";
$leftRows .= '| ' . $disp . ' | ';
$leftRows .= '' . $b22 . ' ' . esc_html( $mp3Elapsed ) . ' | ';
$leftRows .= '' . $b23 . ' ' . esc_html( $mp4Elapsed ) . ' | ';
$leftRows .= '' . $bYT . ' ' . esc_html( $ytElapsed ) . ' | ';
$leftRows .= '' . $bConf . ' | ';
$leftRows .= '' . $bDbl . ' | ';
$leftRows .= "
\n";
}
// ── HTML 出力 ──
// 全画面固定オーバーレイ(WordPress のページ枠を覆う)
echo '';
// ── ヘッダー(1行に集約) ──
echo '
'; // /ヘッダー行
// 2ペインレイアウト(ヘッダー行の残り高さをすべて使用)
echo '
';
// ── 左ペイン ──
echo '
';
echo '
日付一覧
';
echo '
';
echo '';
echo '| 日付 | ';
echo 'MP3 | ';
echo 'MP4 | ';
echo 'Youtube | ';
echo '確認 | ';
echo 'W確認 | ';
echo '
';
echo '';
echo $leftRows;
echo '
';
echo '
'; // /左ペイン
// ── 右ペイン: iframe で日付ページをそのまま表示 ──
echo '
';
echo '
';
echo '
'
. '← 左の日付をクリックしてください
';
echo '
'; // /右ペイン
echo '
'; // /flex
echo '
'; // /mvMonthWrap
// CSS
echo '';
// JavaScript(esc_jsは&をHTMLエンティティ化するのでURLには使わない)
$jsBaseUrl = site_url( '/daily_bread_audio/?mode=dateid&dateid=' );
echo <<
(function(){
var _baseUrl = "{$jsBaseUrl}";
function mvSelectDay(dd) {
// 左ペインのハイライト
document.querySelectorAll('#mvDateTbody tr').forEach(function(tr){ tr.classList.remove('mvRowSel'); });
var row = document.getElementById('mvRow_' + dd);
if (row) { row.classList.add('mvRowSel'); row.scrollIntoView({block:'nearest'}); }
// 右ペイン: iframeのsrcを変えるだけ
var msg = document.getElementById('mvRightMsg');
var frame = document.getElementById('mvRightFrame');
if (msg) msg.style.display = 'none';
if (!frame) return;
frame.style.display = 'block';
frame.src = _baseUrl + dd;
// iframe読み込み後にWPヘッダー/フッターをCSSで非表示
frame.onload = function() {
try {
var doc = frame.contentDocument || frame.contentWindow.document;
// WPヘッダー/フッターを非表示
var s = doc.createElement('style');
s.textContent = '#wpadminbar,#header,#footer,.footer_main,.header_main,.av-header-area,'
+ '.sidebar_tab,#side-tabbed-widget-area { display:none !important; }'
+ 'body { overflow-y:auto !important; margin:0 !important; padding:0 !important; }'
+ '#main, .container_wrap { margin:0 !important; padding:8px 16px !important; }';
doc.head.appendChild(s);
// タイトル右に日付を表示
var yr = dd.substring(0,4), mo = dd.substring(4,6), dy = dd.substring(6,8);
var dateStr = yr + '年' + parseInt(mo) + '月' + parseInt(dy) + '日';
var h = doc.querySelector('h1,h2,h3');
if (h) {
var badge = doc.createElement('span');
badge.style.cssText = 'margin-left:14px; font-size:0.82em; color:#1a3c6e;'
+ ' font-weight:normal; background:#e8f0fb; border-radius:4px; padding:2px 8px;';
badge.textContent = dateStr;
h.appendChild(badge);
}
} catch(e) {}
};
}
window.mvSelectDay = mvSelectDay;
document.addEventListener('DOMContentLoaded', function(){ mvSelectDay({$jsFirst}); });
})();
ENDJS;
}
private function _toInline( string $html ): string {
$html = preg_replace( '##i', ' ', $html );
$html = preg_replace( '#]*>#i', '', $html );
$html = preg_replace( '#
#i', ' ', $html );
$html = preg_replace( '/ {2,}/', ' ', $html );
return trim( $html );
}
/**
* datatype 候補順で最初に見つかったDB行を返す
*/
private function _findStageRow( array $dbList, string $dispDate, array $datatypeCandidates ): ?object {
foreach ( $datatypeCandidates as $dt ) {
$key = $dispDate . '_' . (string) $dt;
if ( array_key_exists( $key, $dbList ) && is_object( $dbList[ $key ] ) ) {
return $dbList[ $key ];
}
}
return null;
}
/**
* DB行から経過時間ラベルを返す(完了時のみ時間、実行中は文言、未登録は-)
*/
private function _elapsedLabel( ?object $row ): string {
if ( ! $row ) return '-';
$sec = DailybreadMpxYoutubeStatus::calcElapsedSecondsFromRow( $row );
if ( $sec > 0 ) {
return DailybreadMpxYoutubeStatus::formatSecondsJa( $sec );
}
$started = mb_strlen( (string) ( $row->makestarttime ?? '' ) ) > 0;
$stopped = mb_strlen( (string) ( $row->makestoptime ?? '' ) ) > 0;
if ( $started && ! $stopped ) return '実行中';
return '-';
}
/**
* 確認済み列用バッジ(makestarttimeに値あり→✅、なし→✕)
*/
private function _badgeConfirm( array $dbList, string $dispDate, string $datatype ): string {
$key = $dispDate . '_' . $datatype;
if ( ! array_key_exists( $key, $dbList ) ) {
return '
✕';
}
$row = $dbList[ $key ];
if ( mb_strlen( (string)( $row->makestarttime ?? '' ) ) > 0 ) {
return '
✅';
}
return '
✕';
}
/**
* 左ペイン用ステータスバッジ HTML
*/
private function _badge( array $dbList, string $dispDate, string $datatype ): string {
$key = $dispDate . '_' . $datatype;
if ( ! array_key_exists( $key, $dbList ) ) {
return '
✕';
}
$row = $dbList[ $key ];
if ( mb_strlen( (string)( $row->makestoptime ?? '' ) ) > 0 ) {
return '
✅';
}
if ( mb_strlen( (string)( $row->makestarttime ?? '' ) ) > 0 ) {
return '
⚡';
}
return '
✕';
}
/**
* DB行からステータスラベルを返す
*/
private function _statusLabel( object $row ): string {
if ( mb_strlen( (string)( $row->makestoptime ?? '' ) ) > 0 ) {
return '完了';
}
if ( mb_strlen( (string)( $row->makestarttime ?? '' ) ) > 0 ) {
return '実行中/開始済';
}
return '未登録';
}
}
?>
2023_UBF_ISBC – 大学生聖書読み宣教会
2023 UBF ISBC(International Summer Bible Conference)

祈りの力(2022年 夏修養会)
2023年日本UBF夏修養会
Scroll to top