前回はプロジェクト全体のリファクタリングを行いました。
今回はindex.phpファイル内のパーツごとの切り分けを行っていきます。
index.php内プログラムの切り分け
切り分けの流れとしては以下の通りです。
1:切り分けプログラム保管ファイルの新規作成
2:index.phpから切り取って上記で作成したファイルに貼り付け
3:切り取られた部分にファイル読み込み記述を追加
まずはプロジェクトディレクトリ直下のcomponentフォルダの中にindexフォルダを作成します。
ファイル冒頭から順番にファイル分割していきます。
セッションやパラメータ処理のプログラム部分
「アプリプロジェクト」→「component」→「index」の階層ができたら、indexフォルダの中に「session-param-handler.php」という名前のファイルを作成し、以下の部分をindex.phpから切り取ってきます。
<?php //冒頭に追加
//リセットボタンイベント
if (isset($_POST['record_reset'])) :
unset($_SESSION['r_date'], $_SESSION['r_title'], $_SESSION['r_amount'], $_SESSION['r_type'], $_SESSION['r_spendingcat'], $_SESSION['r_paymentMethod']);
header('location: ./index.php');
endif;
//入力途中情報管理
if (isset($_SESSION['r_date']) && isset($_SESSION['r_title']) && isset($_SESSION['r_amount']) && isset($_SESSION['r_type']) && isset($_SESSION['r_spendingCat']) && isset($_SESSION['r_paymentMethod'])) :
$r_date = $_SESSION['r_date'];
if ($_SESSION['r_title'] !== 'undefined') :
$r_title = $_SESSION['r_title'];
endif;
$r_amount = $_SESSION['r_amount'];
$r_type = $_SESSION['r_type'];
$r_spendingCat = $_SESSION['r_spendingCat'];
$r_paymentMethod = $_SESSION['r_paymentMethod'];
endif;
//月データ検索パラメータ処理
if (isset($_GET['search_month'])) :
$search_month = $_GET['search_month'];
$_SESSION['search_month'] = $search_month;
else :
$search_month = date('Y-m');
endif;
//カレンダーパラメータ処理
if (isset($_GET['ym'])) :
$ym = $_GET['ym'];
$_SESSION['ym'] = $ym;
else :
$ym = date('Y-m');
endif;
//月データ検索セッション処理
if (isset($_SESSION['search_month'])) :
$search_month = $_SESSION['search_month'];
endif;
//カレンダーセッション処理
if (isset($_SESSION['ym'])) :
$ym = $_SESSION['ym'];
endif;
//グラフ月選択パラメータ処理
if (isset($_GET['graph_month'])) :
$graph_month = $_GET['graph_month'];
$_SESSION['graph_month'] = $graph_month;
else :
$graph_month = date('Y-m');
endif;
//グラフ月選択セッション処理
if (isset($_SESSION['graph_month'])) :
$graph_month = $_SESSION['graph_month'];
else :
$graph_month = date('Y-m');
endif;
//詳細モーダル追加ボタン送信
if (isset($_POST['specific_register']) && $_POST['specific_register'] === '追加') :
$specific_register_date = filter_input(INPUT_POST, 'specific_register_date', FILTER_SANITIZE_SPECIAL_CHARS);
$r_date = $specific_register_date;
endif;
//絞り込み検索送信処理
if (isset($_POST['detail-search'])) :
$filtering_title = filter_input(INPUT_POST, 'filtering-title', FILTER_SANITIZE_SPECIAL_CHARS);
$filtering_spendingcat = filter_input(INPUT_POST, 'filtering-spendingcat', FILTER_SANITIZE_NUMBER_INT);
$filtering_incomecat = filter_input(INPUT_POST, 'filtering-incomecat', FILTER_SANITIZE_NUMBER_INT);
$filtering_paymentmethod = filter_input(INPUT_POST, 'filtering-paymentmethod', FILTER_SANITIZE_NUMBER_INT);
$filtering_credit = filter_input(INPUT_POST, 'filtering-credit', FILTER_SANITIZE_NUMBER_INT);
$filtering_qr = filter_input(INPUT_POST, 'filtering-qr', FILTER_SANITIZE_NUMBER_INT);
endif;
切り取ってきたプログラムの冒頭に「<?php」を追加すれば完了です。
index.phpの切り取り部分に以下を追記します。
include_once('./component/index/session-param-handler.php');
操作完了モーダルプログラム部分
(1) data-operation.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りdata-operation.phpに貼り付けます。
<!-- 操作完了コンテンツ -->
<?php if ($_GET['dataOperation'] && ($_GET['dataOperation'] === 'delete' || $_GET['dataOperation'] === 'update' || $_GET['dataOperation'] === 'error' || $_GET['dataOperation'] === 'numberError')) : ?> <section class="p-section p-section__full-screen" id="doneOperateBox">
<div class="p-message-box <?php echo ($_GET['dataOperation'] === 'error' || $_GET['dataOperation'] === 'numberError') ? 'line-red' : 'line-blue'; ?>">
<p id="doneText">
<?php
if ($_GET['dataOperation'] === 'error') :
echo '正しく処理されませんでした';
elseif ($_GET['dataOperation'] === 'delete') :
echo '削除しました';
elseif ($_GET['dataOperation'] === 'update') :
echo '更新しました';
elseif ($_GET['dataOperation'] === 'numberError') :
echo '負の金額は入力できません';
endif;
?>
</p>
<button class="c-button <?php echo ($_GET['dataOperation'] === 'error' || $_GET['dataOperation'] === 'numberError') ? 'c-button--bg-darkred' : 'c-button--bg-blue'; ?>" onclick="onClickOkButton('');">OK</button>
</div>
</section>
<?php endif; ?>
<!-- //操作完了コンテンツ -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/data-operation.php');
?>
カレンダー詳細モーダルプログラム部分
続いてカレンダーの日付セルを押下すると表示される詳細モーダル部分です。
(1) calendar-detail.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りcalendar-detail.phpに貼り付けます。
<!-- カレンダー日別収支詳細表示 -->
<?php if (isset($_GET['detail'])) : ?>
<section class="p-section p-section__full-screen" id="detailModalBox">
<div class="p-detail-box">
<?php
$param_date = $_GET['detail'];
$title_date = date('Y年n月j日', strtotime($param_date));
?>
<form action="" method="POST" class="p-form--calendar-modal">
<input type="hidden" name="specific_register_date" value="<?php echo $param_date; ?>">
<input type="submit" name="specific_register" value="追加" id="detailModalAdd" class="c-button c-button--bg-blue add" onclick="onClickDetailModalAdd();">
</form>
<!--タイトル出力-->
<p class="p-detail-box__title">
<?php echo $title_date; ?>
</p>
<!--詳細データ抽出-->
<?php
$sql = 'SELECT records.id, records.date, records.title, records.amount, spending_category.name, income_category.name, records.type, payment_method.name, creditcard.name, qr.name, records.memo
FROM records
LEFT JOIN spending_category ON records.spending_category = spending_category.id
LEFT JOIN income_category ON records.income_category = income_category.id
LEFT JOIN payment_method ON records.payment_method = payment_method.id
LEFT JOIN creditcard ON records.creditcard = creditcard.id
LEFT JOIN qr ON records.qr = qr.id
WHERE records.date=? AND records.user_id = ?';
$stmt = $db->prepare($sql);
$stmt->bind_param('si', $param_date, $user_id);
sql_check($stmt, $db);
$stmt->store_result();
$count = $stmt->num_rows();
$stmt->bind_result($id, $date, $title, $amount, $spending_cat, $income_cat, $type, $payment_method, $credit, $qr, $memo);
if ($count > 0) :
while ($stmt->fetch()) :
?>
<div class="p-detail-box__content">
<div class="outline">
<p>
<?php echo $title; ?>
<span>
<?php
if ($type === 0 && $spending_cat !== null) {
echo '(' . $spending_cat . ')';
} elseif ($type === 1 && $income_cat !== null) {
echo '(' . $income_cat . ')';
} else {
echo '(不明)';
}
?>
</span>
</p>
<p class="<?php echo $type === 0 ? 'text-red' : 'text-blue'; ?>"><?php echo $type === 0 ? '-¥' . number_format($amount) : '+¥' . number_format($amount); ?></p>
</div>
<?php if ($type === 0) : ?>
<p class="detail">
<?php
echo ($payment_method != '') ? $payment_method : '不明';
if ($credit !== null || $qr !== null) {
echo '/' . $credit . $qr;
}
?>
</p>
<?php endif; ?>
<div class="p-detail-box__editbutton">
<form action="./record-edit.php" method="POST">
<input type="hidden" name="record_id" value="<?php echo h($id); ?>">
<input type="submit" class='c-button c-button--bg-green edit fas' value="編集">
</form>
<a class='c-button c-button--bg-red delete' id="delete<?php echo h($id); ?>Calendar" href='./delete.php?id=<?php echo h($id); ?>&from=index' onclick="deleteConfirm('<?php echo h($title); ?>','delete<?php echo h($id); ?>Calendar');"> 削除 </a>
</div>
</div>
<?php endwhile; ?>
<?php else : ?>
<div class="p-detail-box__content nodata">
<p>データなし</p>
</div>
<?php endif; ?>
<?php
if (isset($_GET['ym'])) :
$ym = $_GET['ym'];
endif;
if (isset($_GET['page_id'])) :
$page_id = $_GET['page_id'];
endif;
if (isset($_GET['ym']) && isset($_GET['page_id'])) :
$detail_ok_link = './index.php?ym=' . $ym . '&page_id=' . $page_id;
elseif (isset($_GET['ym'])) :
$detail_ok_link = './index.php?ym=' . $ym;
elseif (isset($_GET['page_id'])) :
$detail_ok_link = './index.php?page_id=' . $page_id;
else :
$detail_ok_link = './index.php';
endif;
?>
<a class="c-button c-button--bg-blue" href="<?php echo $detail_ok_link; ?>">OK</a>
</div>
</section>
<?php endif; ?>
<!-- カレンダー日別収支詳細表示 -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/data-operation.php');
//以下1行追記
include_once('./component/index/calendar-detail.php');
?>
収支データ入力プログラム部分
(1) record-input.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りrecord-input.phpに貼り付けます。
<!-- 収支データ入力 -->
<section class="p-section p-section__records-input js-switch-content fade-in" data-tab="tab-1">
<form class="p-form p-form--input-record" name="recordInput" action="./record-create.php" method="POST">
<input type="hidden" name="input_time" id="input_time" value="<?php echo date("Y/m/d-H:i:s"); ?>">
<div class="p-form__flex-input">
<p>日付</p>
<div class="p-form--input-record__dateinput u-flex-box">
<span onclick="onChangeInputDate('past');"><</span>
<input type="date" name="date" id="date" value="<?php echo (isset($r_date) ? $r_date : date("Y-m-d")); ?>" required>
<span onclick="onChangeInputDate('future');">></span>
</div>
</div>
<div class="p-form__flex-input">
<p>タイトル</p>
<input type="text" name="title" id="title" maxlength="15" value="<?php echo $r_title; ?>" required>
</div>
<?php
$sql = 'SELECT COUNT(title), title FROM records WHERE user_id =? GROUP BY title ORDER BY COUNT(title) DESC, input_time DESC LIMIT 5';
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $user_id);
$stmt->execute();
$stmt->store_result();
$count = $stmt->num_rows();
$stmt->bind_result($count, $title);
?>
<?php if ($count > 0) : ?>
<div class="p-form__flex-input p-form__often-use-title">
<p>よく使う<br>タイトル</p>
<ul class="u-flex-box">
<?php while ($stmt->fetch()) : ?>
<li onclick="onChangeTitle('<?php echo h($title); ?>')"><?php echo h($title); ?></li>
<?php endwhile; ?>
</ul>
</div>
<?php endif; ?>
<div class="p-form__flex-input">
<p>金額</p>
<input type="number" name="amount" id="amount" step="1" maxlength="7" value="<?php echo $r_amount; ?>" required>
</div>
<div class="p-form__flex-input type">
<input id="spending" type="radio" name="type" value="0" onchange="onRadioChangeType(0);" <?php echo (isset($_SESSION['r_type']) && $r_type == 0) ? 'checked' : ''; ?> required>
<label for="spending">支出 </label>
<input type="radio" name="type" id="income" value="1" onchange="onRadioChangeType(1);" <?php echo (isset($_SESSION['r_type']) && $r_type == 1) ? 'checked' : ''; ?>>
<label for="income">収入 </label>
</div>
<div class="u-js__show-switch flex p-form__flex-input sp-change-order" id="spendingCategoryBox">
<p class="long-name">支出カテゴリー</p>
<select name="spending_category" id="spendingCategory">
<option value="0">選択してください</option>
<?php
$stmt_spendingcat = $db->prepare('SELECT id, name FROM spending_category WHERE user_id=?');
$stmt_spendingcat->bind_param('i', $user_id);
sql_check($stmt_spendingcat, $db);
$stmt_spendingcat->bind_result($id, $name);
while ($stmt_spendingcat->fetch()) :
?>
<option value="<?php echo h($id); ?>" <?php echo $r_spendingCat == $id ? 'selected' : ''; ?>><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
<a class="c-button c-button--bg-gray" href="./item-edit.php?editItem=0" onclick="onClickCatEdit('spendingcatEdit');">編集 追加</a>
</div>
<div class="u-js__show-switch flex p-form__flex-input sp-change-order" id="incomeCategoryBox">
<p class="long-name">収入カテゴリー</p>
<select name="income_category" id="incomeCategory">
<option value="0">選択してください</option>
<?php
$stmt_incomecat = $db->prepare('SELECT id, name FROM income_category WHERE user_id=?');
$stmt_incomecat->bind_param('i', $user_id);
sql_check($stmt_incomecat, $db);
$stmt_incomecat->bind_result($id, $name);
while ($stmt_incomecat->fetch()) :
?>
<option value="<?php echo h($id); ?>"><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
<a class="c-button c-button--bg-gray" href="./item-edit.php?editItem=1">編集 追加</a>
</div>
<div id="paymentMethodBox" class="u-js__show-switch flex p-form__flex-input sp-change-order">
<p class="long-name">支払い方法</p>
<select name="payment_method" id="paymentMethod" onchange="hasChildSelect('2', creditSelectBox, qrChecked);hasChildSelect('3', qrSelectBox, creditChecked);">
<option value="0">選択してください</option>
<?php
$fixedPaymentMethod = ['現金', 'クレジットカード', 'スマホ決済'];
$fixedPaymentMethod_id = ['', 'radioCredit', 'radioQr'];
for ($i = 0; $i < 3; $i++) : ?>
<option value="<?php echo $i + 1; ?>" id="<?php echo $fixedPaymentMethod_id[$i]; ?>" <?php echo $r_paymentMethod == $i + 1 ? 'selected' : ''; ?>><?php echo $fixedPaymentMethod[$i]; ?></option>
<?php endfor; ?>
<?php
$stmt_paymethod = $db->prepare('SELECT id, name FROM payment_method WHERE id>3 AND user_id=?');
$stmt_paymethod->bind_param('i', $user_id);
sql_check($stmt_paymethod, $db);
$stmt_paymethod->bind_result($id, $name);
while ($stmt_paymethod->fetch()) : ?>
<option value="<?php echo h($id); ?>" <?php echo $r_paymentMethod == $id ? 'selected' : ''; ?>><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
<a class="c-button c-button--bg-gray" href="./item-edit.php?editItem=2" onclick="onClickCatEdit('paymentmethodEdit');">編集 追加</a>
</div>
<div class="u-js__show-switch flex p-form__flex-input sp-change-order" id="creditSelectBox">
<p class="long-name">クレジットカード</p>
<div class="p-form__item-box">
<select name="credit">
<option value="0">選択しない</option>
<?php
$stmt_credit = $db->prepare('SELECT id, name FROM creditcard WHERE user_id=?');
$stmt_credit->bind_param('i', $user_id);
sql_check($stmt_credit, $db);
$stmt_credit->bind_result($id, $name);
while ($stmt_credit->fetch()) :
?>
<option value="<?php echo h($id); ?>"><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
</div>
<a class="c-button c-button--bg-gray" href="./item-edit.php?editItem=3" onclick="onClickCatEdit('creditEdit');">編集 追加</a>
</div>
<div class="u-js__show-switch flex p-form__flex-input sp-change-order" id="qrSelectBox">
<p class="long-name">スマホ決済種類</p>
<div class="p-form__item-box">
<select name="qr">
<option value="0">選択しない</option>
<?php
$stmt_qr = $db->prepare('SELECT id, name FROM qr WHERE user_id=?');
$stmt_qr->bind_param('i', $user_id);
sql_check($stmt_qr, $db);
$stmt_qr->bind_result($id, $name);
while ($stmt_qr->fetch()) :
?>
<option value="<?php echo h($id); ?>"><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
</div>
<a class="c-button c-button--bg-gray" href="./item-edit.php?editItem=4" onclick="onClickCatEdit('qrEdit');">編集 追加</a>
</div>
<div>
<textarea name="memo" id="" cols="45" rows="5" placeholder="入力収支の詳細"></textarea>
</div>
<input class="c-button c-button--bg-blue" type="submit" name="record_create" value="登録">
</form>
<form action="" method="POST">
<input type="submit" class="c-button c-button--bg-gray reset" name="record_reset" value="リセット">
</form>
</section>
<!-- 収支データ入力 -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/record-input.php');
?>
カレンダープログラム部分
(1) calendar.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りcalendar.phpに貼り付けます。
<!-- カレンダー -->
<section class="p-section p-section__calendar js-switch-content fade-in" data-tab="tab-2">
<?php
$base_date = strtotime($ym); //パラメータもしくは現在の年月のタイムスタンプ
$prev = date('Y-m', strtotime('-1 month', $base_date)); //前月取得
$next = date('Y-m', strtotime('+1 month', $base_date)); //次月取得
$calendar_title = date('Y-m', $base_date); //カレンダータイトル
$max_view = 10;
if (!isset($_GET['page_id'])) :
$page_id = 1;
$page_param = $page_id - 1;
$calendar_link_prev = '?ym=' . $prev;
$calendar_link_next = '?ym=' . $next;
$calendar_link_now = '?ym=' . date('Y-m');
else :
$page_id = $_GET['page_id'];
$page_param = ($page_id - 1) * $max_view;
$calendar_link_prev = '?ym=' . $prev . '&page_id=' . $page_id;
$calendar_link_next = '?ym=' . $next . '&page_id=' . $page_id;
$calendar_link_now = '?ym=' . date('Y-m') . '&page_id=' . $page_id;
endif;
?>
<div class="p-monthsearch">
<a href="<?php echo $calendar_link_prev; ?>"><</a>
<input type="month" id="calendarMonth" value="<?php echo $calendar_title; ?>" onchange="onChangeMonth('ym', 'calendarMonth');">
<a href="<?php echo $calendar_link_next; ?>">></a>
<a href="<?php echo $calendar_link_now; ?>">今月</a>
</div>
<div class="p-calendar__sum">
<?php
$sql = 'SELECT (SELECT SUM(amount) FROM records WHERE type=0 AND date LIKE ? AND user_id=?)AS spending_sum, (SELECT SUM(amount) FROM records WHERE type=1 AND date LIKE ? AND user_id=?)AS income_sum FROM records WHERE user_id=? LIMIT 1';
$stmt = $db->prepare($sql);
$ym_param = $ym . '%';
$stmt->bind_param('sisii', $ym_param, $user_id, $ym_param, $user_id, $user_id);
sql_check($stmt, $db);
$stmt->bind_result($month_spending_sum, $month_income_sum);
$stmt->fetch();
?>
<p>
支出合計<span class="pc_only">:</span><br class="sp_only">
<span class="text-red">-¥<?php echo number_format($month_spending_sum); ?></span>
</p>
<p>
収入合計<span class="pc_only">:</span><br class="sp_only">
<span class="text-blue">¥<?php echo number_format($month_income_sum); ?></span>
</p>
<p>
<?php
$month_sum = $month_income_sum - $month_spending_sum;
$abs_month_sum = abs($month_sum);
if ($month_sum < 0) {
$sign = '-';
$class = 'text-red';
} else {
$sign = '';
$class = 'text-blue';
}
?>
収支合計<span class="pc_only">:</span><br class="sp_only">
<span class="<?php echo $class; ?>">
<?php echo $sign . '¥' . number_format($abs_month_sum); ?>
</span>
</p>
<?php $stmt->close(); ?>
</div>
<table class="p-calendar">
<tr>
<th>日</th>
<th>月</th>
<th>火</th>
<th>水</th>
<th>木</th>
<th>金</th>
<th>土</th>
</tr>
<?php
//表示中の月の日数を取得
$day_count = date('t', $base_date);
//曜日取得(日曜日なら0、月曜日なら1・・・土曜日なら6が入る)
$youbi = date('w', $base_date);
//カレンダー配列の初期化
$weeks = [];
$week = '';
//初週の空セルの作成($youbiに格納されている数だけ空のtdタグを$weekに追加)
$week .= str_repeat('<td></td>', $youbi);
//日毎のデータ抽出(1日から表示月の末尾まで繰り返す)
for ($day = 1; $day <= $day_count; $day++, $youbi++) {
//YYYY-mm-dd形式の文字列生成(セルの日付とリンクパラメータ、SQLのbind_paramに使用)
if ($day < 10) :
$date = $ym . '-' . '0' . $day;
else :
$date = $ym . '-' . $day;
endif;
//詳細表示のリンク生成
if (isset($_GET['ym']) || isset($_GET['page_id']) || isset($_GET['search_month'])) :
$detail_url = $_SERVER['REQUEST_URI'] . '&detail=' . $date;
else :
$detail_url = $_SERVER['REQUEST_URI'] . '?detail=' . $date;
endif;
//データ抽出
$sql = 'SELECT (SELECT SUM(amount) FROM records WHERE type=0 AND user_id=? AND date=?)AS spending_sum, (SELECT SUM(amount) FROM records WHERE type=1 AND user_id=? AND date=?)AS income_sum FROM records WHERE user_id=? AND date=? LIMIT 1';
$stmt = $db->prepare($sql);
$stmt->bind_param('isisis', $user_id, $date, $user_id, $date, $user_id, $date);
sql_check($stmt, $db);
$stmt->bind_result($spending_sum, $income_sum);
$stmt->fetch();
//セル内HTML変数格納
$cel_link = '<a href="' . $detail_url . '">';
$cel_spending = '<span class="text-red">-¥' . number_format($spending_sum) . '</span>';
$cel_income = '<span class="text-blue">¥' . number_format($income_sum) . '</span>';
$close_a = '</a>';
//日付セルの中身生成
if ($spending_sum > 0 && $income_sum > 0) :
//支出と収入の両方が存在するとき
$cel_content = $cel_link . $cel_spending . $cel_income . $close_a;
elseif ($spending_sum > 0 && ($income_sum == null || $income_sum == 0)) :
//支出のみ存在するとき
$cel_content = $cel_link . $cel_spending . $close_a;
elseif (($spending_sum == null || $spending_sum == 0) && $income_sum > 0) :
//収入のみ存在するとき
$cel_content = $cel_link . $cel_income . $close_a;
else :
//どちらも存在しないとき
$cel_content = $cel_link . $close_a;
endif;
//$weekにセルを追加
if (date('w', strtotime($date)) === '0') :
$week .= '<td class="sunday">' . $day . '<br>' . $cel_content . '</td>';
elseif (date('w', strtotime($date)) === '6') :
$week .= '<td class="saturday">' . $day . '<br>' . $cel_content . '</td>';
else :
$week .= '<td>' . $day . '<br>' . $cel_content . '</td=>';
endif;
//抽出結果の初期化
$spending_sum = null;
$income_sum = null;
$stmt->close();
//週末、月末の処理
if ($youbi % 7 == 6 || $day == $day_count) :
$weeks[] = '<tr>' . $week . '</tr>';
$week = '';
endif;
}
// 出力
foreach ($weeks as $week) {
echo $week;
}
?>
</table>
</section>
<!-- カレンダー -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/record-input.php');
//以下1行追記
include_once('./component/index/calendar.php');
?>
収支データ一覧内 月切り替えプログラム部分
(1) month-search.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りmonth-search.phpに貼り付けます。
<!-- 月検索 -->
<div class="p-monthsearch center">
<?php
$base_date = strtotime($search_month); //パラメータもしくは現在の年月のタイムスタンプ
$prev = date('Y-m', strtotime('-1 month', $base_date)); //前月取得
$next = date('Y-m', strtotime('+1 month', $base_date)); //次月取得
$search_link_prev = '?search_month=' . $prev . '#all-data';
$search_link_next = '?search_month=' . $next . '#all-data';
$search_link_now = '?search_month=' . date('Y-m') . '#all-data';
?>
<a href="<?php echo $search_link_prev; ?>"><</a>
<input type="month" id="searchMonth" value="<?php echo $search_month; ?>" onchange="onChangeMonth('search_month', 'searchMonth');">
<a href="<?php echo $search_link_next; ?>">></a>
<a href="<?php echo $search_link_now; ?>">今月</a>
</div>
<!-- //月検索 -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/month-search.php');
?>
収支データ一覧内 絞り込み検索プログラム部分
(1) filtering-search.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りfiltering-search.phpに貼り付けます。
<!-- 絞り込み検索 -->
<a href="#modal" class="p-banner c-button c-button--bg-blue js-detail-search">絞り込み検索</a>
<form method="POST" class="p-form--detail-search remodal" data-remodal-id="modal">
<button data-remodal-action="close" class="remodal-close"></button>
<div class="p-form__flex-input">
<p>タイトルキーワード</p>
<input type="text" name="filtering-title" maxlength="15" value='<?php echo h($filtering_title); ?>'>
</div>
<div class="p-form__flex-input">
<p>支出カテゴリー</p>
<select name="filtering-spendingcat" id="">
<option value="0">選択してください</option>
<?php
$sql = 'SELECT id, name FROM spending_category WHERE user_id = ?';
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $user_id);
sql_check($stmt, $db);
$stmt->bind_result($id, $name);
while ($stmt->fetch()) : ?>
<option value='<?php echo h($id); ?>' <?php echo $filtering_spendingcat == $id ? 'selected' : ''; ?>><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
<i class="fa-solid fa-angle-down"></i>
</div>
<div class="p-form__flex-input">
<p>収入カテゴリー</p>
<select name="filtering-incomecat" id="">
<option value="0">選択してください</option>
<?php
$sql = 'SELECT id, name FROM income_category WHERE user_id = ?';
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $user_id);
sql_check($stmt, $db);
$stmt->bind_result($id, $name);
while ($stmt->fetch()) : ?>
<option value='<?php echo h($id); ?>' <?php echo $filtering_incomecat == $id ? 'selected' : ''; ?>><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
<i class="fa-solid fa-angle-down"></i>
</div>
<div class="p-form__flex-input">
<p>支払い方法</p>
<select name="filtering-paymentmethod" id="">
<option value="0">選択してください</option>
<?php
$sql = 'SELECT id, name FROM payment_method WHERE user_id = 0 OR user_id = ?';
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $user_id);
sql_check($stmt, $db);
$stmt->bind_result($id, $name);
while ($stmt->fetch()) : ?>
<option value='<?php echo h($id); ?>' <?php echo $filtering_paymentmethod == $id ? 'selected' : ''; ?>><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
<i class="fa-solid fa-angle-down"></i>
</div>
<div class="p-form__flex-input">
<p>クレジットカード</p>
<select name="filtering-credit" id="">
<option value="0">選択してください</option>
<?php
$sql = 'SELECT id, name FROM creditcard WHERE user_id = ?';
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $user_id);
sql_check($stmt, $db);
$stmt->bind_result($id, $name);
while ($stmt->fetch()) : ?>
<option value='<?php echo h($id); ?>' <?php echo $filtering_credit == $id ? 'selected' : ''; ?>><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
<i class="fa-solid fa-angle-down"></i>
</div>
<div class="p-form__flex-input">
<p>スマホ決済</p>
<select name="filtering-qr" id="">
<option value="0">選択してください</option>
<?php
$sql = 'SELECT id, name FROM qr WHERE user_id = ?';
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $user_id);
sql_check($stmt, $db);
$stmt->bind_result($id, $name);
while ($stmt->fetch()) : ?>
<option value='<?php echo h($id); ?>' <?php echo $filtering_qr == $id ? 'selected' : ''; ?>><?php echo h($name); ?></option>
<?php endwhile; ?>
</select>
<i class="fa-solid fa-angle-down"></i>
</div>
<input type="submit" class="c-button c-button--bg-blue" name="detail-search" value="絞り込み検索" onclick="onRemoveSearchModal();">
<input type="submit" class="c-button c-button--bg-gray" name="detail-reset" value="絞り込みリセット" onclick="onRemoveSearchModal();">
</form>
<?php if (isset($_POST['detail-search'])) : ?>
<div class="p-search-word">
<p>絞り込み中:
<!-- タイトルキーワードが空欄でなければ送信された値を出力 -->
<?php if ($filtering_title != null) : ?>
<span><?php echo h($filtering_title); ?></span>
<?php endif; ?>
<?php
//以下1行移動させる
$filter_value = [$filtering_spendingcat, $filtering_incomecat, $filtering_paymentmethod, $filtering_credit, $filtering_qr];
//選択項目テーブルリスト配列
$table_list = ['spending_category', 'income_category', 'payment_method', 'creditcard', 'qr'];
?>
<?php
for ($i = 0; $i < count($filter_value); $i++) :
//各選択項目の値が0(選択してください)以外なら以下を実行
if ($filter_value[$i] !== '0') :
$sql = "SELECT name FROM {$table_list[$i]} WHERE id=?";
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $filter_value[$i]);
$count = sql_check($stmt, $db);
$stmt->bind_result($name);
$stmt->fetch();
echo '<span>' . h($name) . '</span>';
$stmt->close();
endif;
endfor;
?>
</p>
</div>
<?php endif; ?>
<!-- 絞り込み検索 -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/month-search.php');
//以下1行追記
include_once('./component/index/filtering-search.php');
?>
画面表示用テーブルプログラム部分
(1) search-result-pc.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りsearch-result-pc.phpに貼り付けます。
<!-- 画面表示用テーブル -->
<table class="p-table p-table--record-output" id="all-data">
<!-- 貯蓄額出力行 -->
<tr class="p-table__join-row">
<?php
//支出収支金額の抽出
$sql = "SELECT (SELECT SUM(amount) FROM records WHERE type = 0 AND user_id = ?)AS spending, (SELECT SUM(amount) FROM records WHERE type = 1 AND user_id = ?)AS income FROM records WHERE user_id = ? LIMIT 1";
$stmt = $db->prepare($sql);
$stmt->bind_param('iii', $user_id, $user_id, $user_id);
sql_check($stmt, $db);
$stmt->bind_result($spending_amount, $income_amount);
while ($stmt->fetch()) :
$sum = $income_amount - $spending_amount;
endwhile;
//貯蓄額の計算
$all_sum = $initial_savings + $sum;
$abs_all_sum = abs($all_sum);
if ($all_sum < 0) :
$sign = "-";
else :
$sign = '';
endif;
?>
<th colspan="6">現在の貯蓄額<span class=""><?php echo $sign . '¥' . number_format($abs_all_sum); ?></span></th>
</tr>
<!-- タイトル行 -->
<tr class="p-table__head">
<th>収支日</th>
<th>タイトル</th>
<th>収入</th>
<th>支出</th>
<th>支出詳細</th>
<th>操作</th>
</tr>
<!-- 収支データ出力 -->
<?php
$add_where_month = 'WHERE records.date LIKE ? AND records.user_id = ?';
$add_where_date = 'WHERE records.date = ? AND records.user_id = ?';
//絞り込み検索時のSQL条件文追加処理
if (isset($_POST['detail-search'])) :
//タイトルキーワードのWHERE文作成
$add_sql_title = add_sql_title($filtering_title);
//タイトルキーワードのWHERE文を追加
$add_where_month .= $add_sql_title;
$add_where_date .= $add_sql_title;
//選択項目のカラム配列
$filter_column = ['records.spending_category', 'records.income_category', 'records.payment_method', 'records.creditcard', 'records.qr'];
//繰り返し構文で上記2つの配列を使用しながら、選択項目のWHERE分を作成し追加する
for ($i = 0; $i < count($filter_column); $i++) :
$add_sql = add_sql_item($filter_column[$i], $filter_value[$i]);
$add_where_month .= $add_sql;
$add_where_date .= $add_sql;
endfor;
endif;
$add_order = ' ORDER BY date DESC, input_time DESC ';
$add_limit = 'LIMIT ?, ?';
$sql_dataoutput = 'SELECT records.id, records.date, records.title, records.amount,
spending_category.name, income_category.name, records.type,
payment_method.name, creditcard.name, qr.name, records.memo, records.input_time
FROM records
LEFT JOIN spending_category ON records.spending_category = spending_category.id
LEFT JOIN income_category ON records.income_category = income_category.id
LEFT JOIN payment_method ON records.payment_method = payment_method.id
LEFT JOIN creditcard ON records.creditcard = creditcard.id
LEFT JOIN qr ON records.qr = qr.id ';
$stmt_dataoutput = $db->prepare($sql_dataoutput . $add_where_month . $add_order . $add_limit);
$month_param = $search_month . '%';
$stmt_dataoutput->bind_param('siii', $month_param, $user_id, $page_param, $max_view);
sql_check($stmt_dataoutput, $db);
$stmt_dataoutput->store_result();
$count = $stmt_dataoutput->num_rows();
$stmt_dataoutput->bind_result(
$id,
$date,
$title,
$amount,
$spending_category,
$income_category,
$type,
$paymentmethod,
$credit,
$qr,
$memo,
$input_time
);
while ($stmt_dataoutput->fetch()) : ?>
<tr class="p-table__item item<?php echo h($id); ?> <?php echo $memo !== '' ? 'hasmemo' : ''; ?>">
<td> <?php echo date('Y/m/d', strtotime($date)); ?> </td>
<td>
<?php echo h($title); ?>
<span>
<?php
if ($type === 0 && $spending_category !== null) :
echo '(' . h($spending_category) . ')';
elseif ($type === 1 && $income_category !== null) :
echo '(' . $income_category . ')';
else :
echo '(不明)';
endif;
?>
<i class="fa-regular fa-message" onclick="showMemo('<?php echo h($memo); ?>');"></i>
</span>
</td>
<td>
<?php echo $type === 1 ? '¥' . number_format(h($amount)) : ''; ?>
</td>
<td>
<?php echo $type === 0 ? '¥' . number_format($amount) : ''; ?>
<span>
<?php
if ($type === 0 && $paymentmethod !== null) {
echo '(' . h($paymentmethod) . ')';
} else if ($type === 1) {
echo "";
} else {
echo "(不明)";
}
?>
</span>
</td>
<td>
<?php echo $paymentmethod === "クレジットカード" ? h($credit) : '' ?>
<?php echo $paymentmethod === "スマホ決済" ? h($qr) : '' ?>
</td>
<td>
<form action="./record-edit.php" method="POST">
<input type="hidden" name="record_id" value="<?php echo h($id); ?>">
<input type="submit" class='c-button c-button--bg-green edit fas' id="" value="">
</form>
<a class='c-button c-button--bg-red delete' id="delete<?php echo h($id); ?>" href='./delete.php?id=<?php echo h($id); ?>&from=index' onclick="deleteConfirm('<?php echo h($title); ?>', 'delete<?php echo h($id); ?>');">
<i class="fa-regular fa-trash-can"></i>
</a>
</td>
</tr>
<?php endwhile; ?>
<?php if ($count === 0) : ?>
<tr class="nodata">
<td colspan="6">データがありません</td>
</tr>
<?php endif; ?>
<!-- //収支データ出力 -->
<!-- 合計金額行 -->
<tr class="p-table__foot">
<th colspan="2">合計金額 </th>
<?php
$sql = 'SELECT (SELECT SUM(amount) FROM records WHERE type=1 AND user_id = ? AND date LIKE ?) AS income, (SELECT SUM(amount) FROM records WHERE type=0 AND user_id = ? AND date LIKE ?) AS spending FROM records WHERE user_id = ? AND date LIKE ? LIMIT 1';
$stmt->prepare($sql);
$stmt->bind_param('isisis', $user_id, $month_param, $user_id, $month_param, $user_id, $month_param);
sql_check($stmt, $db);
$stmt->bind_result($income_search, $spending_search);
while ($stmt->fetch()) :
$sum_search = $income_search - $spending_search;
endwhile;
$abs_sum_search = abs($sum_search);
if ($sum_search >= 0) :
$sign_search = '';
$class = 'text-blue';
else :
$sign_search = '-';
$class = 'text-red';
endif;
?>
<th class="text-blue">
<?php echo '¥' . number_format($income_search); ?>
</th>
<th class="text-red">
<?php echo '-¥' . number_format($spending_search); ?>
</th>
<th colspan="2" class="<?php echo $class; ?>">
合計 <?php echo $sign_search . '¥' . number_format($abs_sum_search); ?>
</th>
</tr>
<!-- //合計金額行 -->
</table>
<!-- 画面表示用テーブル -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/search-result-pc.php');
?>
エクセル出力用テーブルプログラム部分
(1) search-result-excel.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りsearch-result-excel.phpに貼り付けます。
<!-- エクセル出力用テーブル -->
<table class="p-table p-table--hide" id="table">
<!-- タイトル行 -->
<tr>
<th>収支日</th>
<th>タイトル</th>
<th>カテゴリー</th>
<th>収入</th>
<th>支出</th>
<th>支払い方法</th>
<th>クレジットカード</th>
<th>スマホ決済</th>
</tr>
<!-- 収支データ出力 -->
<?php
$stmt = $db->prepare($sql_dataoutput . $add_where_month . $add_order);
$stmt->bind_param('si', $month_param, $user_id);
sql_check($stmt, $db);
$stmt->store_result();
$count = $stmt->num_rows();
$stmt->bind_result(
$id,
$date,
$title,
$amount,
$spending_category,
$income_category,
$type,
$paymentmethod,
$credit,
$qr,
$memo,
$input_time
); ?>
<?php while ($stmt->fetch()) : ?>
<tr>
<td><?php echo date($date); ?></td>
<td><?php echo h($title); ?></td>
<td>
<?php
if ($type === 0 && $spending_category !== null) {
echo h($spending_category);
} else if ($type === 1 && $income_category !== null) {
echo h($income_category);
} else {
echo "不明";
}
?>
</td>
<td>
<?php echo $type === 1 ? $amount : ''; ?>
</td>
<td>
<?php echo $type === 0 ? $amount : ''; ?>
</td>
<td><?php echo $type === 0 ? $paymentmethod : ''; ?></td>
<td>
<?php echo $paymentmethod === "クレジットカード" ? h($credit) : '' ?>
</td>
<td>
<?php echo $paymentmethod === "スマホ決済" ? h($qr) : '' ?>
</td>
</tr>
<?php endwhile; ?>
<!-- //収支データ出力 -->
</table>
<!-- エクセル出力用テーブル -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/search-result-pc.php');
//以下1行追記
include_once('./component/index/search-result-excel.php');
?>
スマホ表示用プログラム部分
(1) search-result-sp.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りsearch-result-sp.phpに貼り付けます。
<!-- 総貯蓄額 -->
<p class="p-sp-data-box__head">現在の貯蓄額<span class=""><?php echo $sign . '¥' . number_format($abs_all_sum); ?></span></p>
<!-- //総貯蓄額 -->
<ul class="p-sp-data-box__item-sum">
<li>収入<br><span class="text-blue"><?php echo '¥' . number_format($income_search); ?></span></li>
<li>支出<br><span class="text-red"><?php echo '-¥' . number_format($spending_search); ?></span></li>
<li>合計<br><span class="<?php echo $class; ?>"><?php echo $sign_search . '¥' . number_format($abs_sum_search); ?></span></li>
</ul>
<!-- トグルボタン -->
<div class="p-togglebutton-box">
<label for="toggleStyle" class="u-flex-box">
<span>日付ごとまとめて表示 </span>
<div>
<input type="checkbox" id="toggleStyle" onchange="onChangeListView();">
<div class="circle"></div>
<div class="button"></div>
</div>
</label>
</div>
<!-- トグルボタン -->
<!-- 収支データ出力 -->
<?php
//月データ日付まとめで表示
$date_list = array();
$count_list = array();
$week_list = ['日', '月', '火', '水', '木', '金', '土'];
$sql = 'SELECT COUNT(*), date FROM records WHERE user_id = ? AND date LIKE ?';
if (isset($_POST['detail-search'])) :
$add_sql_title = add_sql_title($filtering_title);
$sql .= $add_sql_title;
for ($i = 0; $i < count($filter_column); $i++) :
$add_sql = add_sql_item($filter_column[$i], $filter_value[$i]);
$sql .= $add_sql;
endfor;
endif;
$sql .= ' GROUP BY date ORDER BY date DESC';
$stmt = $db->prepare($sql);
$stmt->bind_param('is', $user_id, $month_param);
$stmt->execute();
$stmt->store_result();
$count = $stmt->num_rows();
$stmt->bind_result($count_item, $date_item);
while ($stmt->fetch()) :
$date_list[] = $date_item;
$count_list[] = $count_item;
endwhile;
?>
<?php if ($count > 0) : ?>
<div id="groupView" class="p-sp-data-box__groupview hide">
<?php for ($i = 0; $i < count($date_list); $i++) :
$search_date = $date_list[$i];
$create_week = date('w', strtotime($search_date));
$day_of_week = $week_list[$create_week];
?>
<div class="p-toggledate-tab js-toggle" id="date<?php echo h($search_date); ?>" onclick="onClickDataBanner('<?php echo $search_date; ?>');">
<p class="date">
<?php echo date('n月j日', strtotime($date_list[$i])); ?>
<span class="day-of-week">(<?php echo ($day_of_week); ?>)</span>
</p>
<p class="count">( <?php echo h($count_list[$i]); ?>件 )</p>
</div>
<div class="p-sp-data-box__frame hide" id="item<?php echo $search_date; ?>">
<?php
$stmt_dataoutput = $db->prepare($sql_dataoutput . $add_where_date);
$stmt_dataoutput->bind_param('si', $search_date, $user_id);
sql_check($stmt_dataoutput, $db);
$stmt_dataoutput->bind_result(
$id,
$date,
$title,
$amount,
$spending_category,
$income_category,
$type,
$paymentmethod,
$credit,
$qr,
$memo,
$input_time
);
while ($stmt_dataoutput->fetch()) :
?>
<div class="p-sp-data-box item<?php echo h($id); ?>">
<div class="u-flex-box p-sp-data-box__overview <?php echo $memo !== '' ? 'hasmemo' : ''; ?>">
<p> <?php echo h($title); ?>
<span>
<?php
if ($type === 0 && $spending_category !== null) {
echo '(' . h($spending_category) . ')';
} else if ($type === 1 && $income_category !== null) {
echo '(' . h($income_category) . ')';
} else {
echo "(カテゴリー不明)";
}
?>
<i class="fa-regular fa-message" onclick="showMemo('<?php echo h($memo); ?>')"></i> </span>
</p>
<p class="<?php echo $type === 0 ? 'text-red' : 'text-blue' ?>">
<?php echo h($type) === "0" ? '-¥' . number_format($amount) : ''; ?>
<?php echo h($type) === "1" ? '+¥' . number_format($amount) : ''; ?>
</p>
</div>
<div class="p-sp-data-box__detail">
<p>
<?php
//支払い方法の出力
if ($type === 0 && $paymentmethod !== null) {
echo '支払い方法:' . h($paymentmethod);
} else if ($type === 1) {
echo "";
} else {
echo "支払い方法:不明";
}
?>
</p>
<?php if ($paymentmethod === "クレジットカード" || $paymentmethod === "スマホ決済") : ?>
<p>
<?php
//クレジット、スマホ決済の詳細出力
if ($paymentmethod === "クレジットカード") {
if ($credit !== null) {
echo 'カード種類:' . h($credit);
} else {
echo "カード種類:不明";
}
} else if ($paymentmethod === "スマホ決済") {
if ($qr !== null) {
echo 'スマホ決済種類:' . h($qr);
} else {
echo "スマホ決済種類:不明";
}
}
?>
</p>
<?php endif; ?>
</div>
<div class="u-flex-box p-sp-data-box__button">
<form action="./record-edit.php" method="post">
<input type="hidden" name="record_id" value="<?php echo h($id); ?>">
<input type="submit" class="c-button c-button--bg-green edit" id="" value="編 集">
</form>
<a class="c-button c-button--bg-red delete" id="delete<?php echo h($id); ?>Group" href='./delete.php?id=<?php echo h($id); ?>;' onclick="deleteConfirm('<?php echo h($title); ?>', 'delete<?php echo h($id); ?>Group');">削 除</a>
</div>
</div>
<?php endwhile; ?>
</div>
<?php endfor; ?>
</div>
<div id="allView" class="p-sp-data-box__allview">
<?php
//月データそのまま表示
$stmt_dataoutput = $db->prepare($sql_dataoutput . $add_where_month . $add_order . $add_limit);
$stmt_dataoutput->bind_param('siii', $month_param, $user_id, $page_param, $max_view);
sql_check($stmt_dataoutput, $db);
$stmt_dataoutput->bind_result(
$id,
$date,
$title,
$amount,
$spending_category,
$income_category,
$type,
$paymentmethod,
$credit,
$qr,
$memo,
$input_time
); ?>
<?php while ($stmt_dataoutput->fetch()) : ?>
<div class="p-sp-data-box item<?php echo h($id); ?>">
<div class="u-flex-box p-sp-data-box__overview <?php echo $memo !== '' ? 'hasmemo' : ''; ?>">
<p> <?php echo h($title); ?>
<span>
<?php
if ($type === 0 && $spending_category !== null) {
echo '(' . h($spending_category) . ')';
} else if ($type === 1 && $income_category !== null) {
echo '(' . h($income_category) . ')';
} else {
echo "(カテゴリー不明)";
}
?>
<i class="fa-regular fa-message" onclick="showMemo('<?php echo h($memo); ?>');"></i> </span>
</p>
<p class="<?php echo $type === 0 ? 'text-red' : 'text-blue' ?>">
<?php echo h($type) === "0" ? '-¥' . number_format($amount) : ''; ?>
<?php echo h($type) === "1" ? '+¥' . number_format($amount) : ''; ?>
</p>
</div>
<div class="p-sp-data-box__detail">
<p><?php echo date('Y/m/d', strtotime($date)); ?></p>
<p>
<?php
//支払い方法の出力
if ($type === 0 && $paymentmethod !== null) {
echo '支払い方法:' . h($paymentmethod);
} else if ($type === 1) {
echo "";
} else {
echo "支払い方法:不明";
}
?>
</p>
<?php if ($paymentmethod === "クレジットカード" || $paymentmethod === "スマホ決済") : ?>
<p>
<?php
//クレジット、スマホ決済の詳細出力
if ($paymentmethod === "クレジットカード") {
if ($credit !== null) {
echo 'カード種類:' . h($credit);
} else {
echo "カード種類:不明";
}
} else if ($paymentmethod === "スマホ決済") {
if ($qr !== null) {
echo 'スマホ決済種類:' . h($qr);
} else {
echo "スマホ決済種類:不明";
}
}
?>
</p>
<?php endif; ?>
</div>
<div class="u-flex-box p-sp-data-box__button">
<form action="./record-edit.php" method="post">
<input type="hidden" name="record_id" value="<?php echo h($id); ?>">
<input type="submit" class="c-button c-button--bg-green edit" id="" value="編 集">
</form>
<a class="c-button c-button--bg-red delete" id="delete<?php echo h($id); ?>All" href='./delete.php?id=<?php echo h($id); ?>&from=index' onclick="deleteConfirm('<?php echo h($title); ?>', 'delete<?php echo h($id); ?>All');">削 除</a>
</div>
</div>
<?php endwhile; ?>
<!-- ページネーション -->
<div class="p-pagenation">
<?php if ($page_id > 1 && isset($_GET['ym'])) : ?>
<a class="prev" href="./index.php?ym=<?php echo $ym; ?>&page_id=<?php echo ($page_id - 1); ?>#data-table_sp">前へ</a>
<?php elseif ($page_id > 1 && !isset($_GET['ym'])) : ?>
<a class="prev" href="./index.php?page_id=<?php echo ($page_id - 1); ?>#data-table_sp">前へ</a>
<?php endif; ?>
<?php if ($page_id < $pages && isset($_GET['ym'])) : ?>
<a class="next" href="./index.php?ym=<?php echo $ym; ?>&page_id=<?php echo ($page_id + 1); ?>#data-table_sp">次へ</a>
<?php elseif ($page_id < $pages && !isset($_GET['ym'])) : ?>
<a class="next" href="./index.php?page_id=<?php echo ($page_id + 1); ?>#data-table_sp">次へ</a>
<?php endif; ?>
</div>
<!-- ページネーション -->
</div>
<?php else : ?>
<div class="p-sp-data-box nodata">
<p>データがありません</p>
</div>
<?php endif; ?>
<!-- //収支データ出力 -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/search-result-pc.php');
//以下1行追記
include_once('./component/index/search-result-excel.php');
?>
選択項目円グラフプログラム部分
(1) item-pie-chart.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りitem-pie-chart.phpに貼り付けます。
<h3 class="pc_only">収支レポート</h3>
<div class="p-monthsearch center">
<?php
$base_date = strtotime($graph_month); //パラメータもしくは現在の年月のタイムスタンプ
$prev = date('Y-m', strtotime('-1 month', $base_date)); //前月取得
$next = date('Y-m', strtotime('+1 month', $base_date)); //次月取得
if (!isset($_GET['page_id'])) :
$page_id = 1;
$graph_link_prev = '?graph_month=' . $prev . '#report';
$graph_link_next = '?graph_month=' . $next . '#report';
$graph_link_now = '?graph_month=' . date('Y-m') . '#report';
else :
$page_id = $_GET['page_id'];
$graph_link_prev = '?graph_month=' . $prev . '&page_id=' . $page_id . '#report';
$graph_link_next = '?graph_month=' . $next . '&page_id=' . $page_id . '#report';
$graph_link_now = '?graph_month=' . date('Y-m') . '&page_id=' . $page_id . '#report';
endif;
?>
<a href="<?php echo $graph_link_prev; ?>"><</a>
<input type="month" id="graphMonth" value="<?php echo $graph_month; ?>" onchange="onChangeMonth('graph_month', 'graphMonth');">
<a href="<?php echo $graph_link_next; ?>">></a>
<a href="<?php echo $graph_link_now; ?>">今月</a>
</div>
<div class="p-calendar__sum center">
<?php
$sql = 'SELECT (SELECT SUM(amount) FROM records WHERE type=0 AND date LIKE ? AND user_id=?)AS spending_sum, (SELECT SUM(amount) FROM records WHERE type=1 AND date LIKE ? AND user_id=?)AS income_sum FROM records WHERE user_id=? LIMIT 1';
$stmt = $db->prepare($sql);
$graph_month_param = $graph_month . '%';
$stmt->bind_param('sisii', $graph_month_param, $user_id, $graph_month_param, $user_id, $user_id);
sql_check($stmt, $db);
$stmt->bind_result($month_spending_sum, $month_income_sum);
$stmt->fetch();
?>
<p>
支出合計<span class="pc_only">:</span><br class="sp_only">
<span class="text-red">-¥<?php echo number_format($month_spending_sum); ?></span>
</p>
<p>
収入合計<span class="pc_only">:</span><br class="sp_only">
<span class="text-blue">¥<?php echo number_format($month_income_sum); ?></span>
</p>
<p>
<?php
$month_sum = $month_income_sum - $month_spending_sum;
$abs_month_sum = abs($month_sum);
if ($month_sum < 0) {
$sign = '-';
$class = 'text-red';
} else {
$sign = '';
$class = 'text-blue';
}
?>
収支合計<span class="pc_only">:</span><br class="sp_only">
<span class="<?php echo $class; ?>">
<?php echo $sign . '¥' . number_format($abs_month_sum); ?>
</span>
</p>
<?php $stmt->close(); ?>
</div>
<!-- グラフタブ -->
<ul class="p-graph-list" id="graphTab">
<li class="is-active" data-tab="graph-1">支出<br class="sp_only">カテゴリー</li>
<li data-tab="graph-2">収入<br class="sp_only">カテゴリー</li>
<li data-tab="graph-3">クレジット<br class="sp_only">カード</li>
<li data-tab="graph-4">スマホ<br class="sp_only">決済</li>
</ul>
<!-- グラフタブ -->
<!-- 支出カテゴリーグラフ -->
<div class="p-section__report__graph-box js-graph-content is-active" id="graph-1" data-tab="graph-1">
<?php
$amount_sum = array();
$item_id = array();
$item_list = array();
$sql = 'SELECT SUM(records.amount) as sum, spending_category.id, spending_category.name
FROM records
LEFT JOIN spending_category ON records.spending_category = spending_category.id
WHERE records.type=0 AND records.user_id=? AND records.date LIKE ?
GROUP BY records.spending_category
ORDER BY sum DESC';
$stmt = $db->prepare($sql);
$stmt->bind_param('is', $user_id, $graph_month_param);
$stmt->execute();
$stmt->store_result();
$count = $stmt->num_rows();
$stmt->bind_result($amount, $id, $item);
while ($stmt->fetch()) :
$amount_sum[] = $amount;
if (is_null($item)) :
$item_list[] = '不明';
$item_id[] = '';
else :
$item_list[] = $item;
$item_id[] = $id;
endif;
endwhile;
$json_spendingcat_amount = json_encode($amount_sum);
$json_spendingcat_item = json_encode($item_list);
?>
<?php if ($count !== 0) : ?>
<table class="p-table--graph">
<tr class="head">
<th>項目名</th>
<th>金額</th>
</tr>
<?php
for ($i = 0; $i < count($item_list); $i++) : ?>
<tr>
<?php if ($item_list[$i] !== '不明') : ?>
<td>
<a href="./item-report.php?year=<?php echo mb_substr($graph_month, 0, 4); ?>&item=<?php echo $item_id[$i]; ?>&num=0">
<?php echo $item_list[$i]; ?>
</a>
</td>
<?php else : ?>
<td class="unknown">
<?php echo $item_list[$i]; ?>
</td>
<?php endif; ?>
<?php if ($item_list[$i] !== '不明') : ?>
<td>
<a href="./item-report.php?year=<?php echo mb_substr($graph_month, 0, 4); ?>&item=<?php echo $item_id[$i]; ?>&num=0">
<?php echo '¥' . number_format($amount_sum[$i]); ?>
</a>
</td>
<?php else : ?>
<td class="unknown">
<?php echo '¥' . number_format($amount_sum[$i]); ?>
</td>
<?php endif; ?>
</tr>
<?php endfor; ?>
</table>
<?php else : ?>
<p>データがありません</p>
<?php endif; ?>
</div>
<!-- 支出カテゴリーグラフ -->
<!-- 収入カテゴリーグラフ -->
<div class="p-section__report__graph-box js-graph-content" id="graph-2" data-tab="graph-2">
<?php
$amount_sum = array();
$item_id = array();
$item_list = array();
$sql = 'SELECT SUM(records.amount) as sum, income_category.id, income_category.name
FROM records
LEFT JOIN income_category ON records.income_category = income_category.id
WHERE records.type=1 AND records.user_id=? AND records.date LIKE ?
GROUP BY records.income_category
ORDER BY sum DESC';
$stmt = $db->prepare($sql);
$stmt->bind_param('is', $user_id, $graph_month_param);
$stmt->execute();
$stmt->store_result();
$count = $stmt->num_rows();
$stmt->bind_result($amount, $id, $item);
while ($stmt->fetch()) :
$amount_sum[] = $amount;
if (is_null($item)) :
$item_list[] = '不明';
$item_id[] = '';
else :
$item_list[] = $item;
$item_id[] = $id;
endif;
endwhile;
$json_incomecat_amount = json_encode($amount_sum);
$json_incomecat_item = json_encode($item_list);
?>
<?php if ($count !== 0) : ?>
<table class="p-table--graph">
<tr class="head">
<th>項目名</th>
<th>金額</th>
</tr>
<?php
for ($i = 0; $i < count($item_list); $i++) : ?>
<tr>
<?php if ($item_list[$i] !== '不明') : ?>
<td>
<a href="./item-report.php?year=<?php echo mb_substr($graph_month, 0, 4); ?>&item=<?php echo $item_id[$i]; ?>&num=1">
<?php echo $item_list[$i]; ?>
</a>
</td>
<?php else : ?>
<td class="unknown">
<?php echo $item_list[$i]; ?>
</td>
<?php endif; ?>
<?php if ($item_list[$i] !== '不明') : ?>
<td>
<a href="./item-report.php?year=<?php echo mb_substr($graph_month, 0, 4); ?>&item=<?php echo $item_id[$i]; ?>&num=1">
<?php echo '¥' . number_format($amount_sum[$i]); ?>
</a>
</td>
<?php else : ?>
<td class="unknown">
<?php echo '¥' . number_format($amount_sum[$i]); ?>
</td>
<?php endif; ?>
</tr>
<?php endfor; ?>
</table>
<?php else : ?>
<p>データがありません</p>
<?php endif; ?>
</div>
<!-- 収入カテゴリーグラフ -->
<!-- クレジットグラフ -->
<div class="p-section__report__graph-box js-graph-content" id="graph-3" data-tab="graph3">
<?php
$amount_sum = array();
$item_id = array();
$item_list = array();
$sql = 'SELECT SUM(records.amount) as sum, creditcard.id, creditcard.name
FROM records
LEFT JOIN creditcard ON records.creditcard = creditcard.id
WHERE records.type=0 AND records.payment_method = 2 AND records.user_id=? AND records.date LIKE ?
GROUP BY records.creditcard
ORDER BY sum DESC';
$stmt = $db->prepare($sql);
$stmt->bind_param('is', $user_id, $graph_month_param);
$stmt->execute();
$stmt->store_result();
$count = $stmt->num_rows();
$stmt->bind_result($amount, $id, $item);
while ($stmt->fetch()) :
$amount_sum[] = $amount;
if (is_null($item)) :
$item_list[] = '不明';
$item_id[] = '';
else :
$item_list[] = $item;
$item_id[] = $id;
endif;
endwhile;
$json_credit_amount = json_encode($amount_sum);
$json_credit_item = json_encode($item_list);
?>
<?php if ($count !== 0) : ?>
<table class="p-table--graph">
<tr class="head">
<th>項目名</th>
<th>金額</th>
</tr>
<?php
for ($i = 0; $i < count($item_list); $i++) : ?>
<tr>
<?php if ($item_list[$i] !== '不明') : ?>
<td>
<a href="./item-report.php?year=<?php echo mb_substr($graph_month, 0, 4); ?>&item=<?php echo $item_id[$i]; ?>&num=2">
<?php echo $item_list[$i]; ?>
</a>
</td>
<?php else : ?>
<td class="unknown">
<?php echo $item_list[$i]; ?>
</td>
<?php endif; ?>
<?php if ($item_list[$i] !== '不明') : ?>
<td>
<a href="./item-report.php?year=<?php echo mb_substr($graph_month, 0, 4); ?>&item=<?php echo $item_id[$i]; ?>&num=2">
<?php echo '¥' . number_format($amount_sum[$i]); ?>
</a>
</td>
<?php else : ?>
<td class="unknown">
<?php echo '¥' . number_format($amount_sum[$i]); ?>
</td>
<?php endif; ?>
</tr>
<?php endfor; ?>
</table>
<?php else : ?>
<p>データがありません</p>
<?php endif; ?>
</div>
<!-- クレジットグラフ -->
<!-- スマホ決済グラフ -->
<div class="p-section__report__graph-box js-graph-content" id="graph-4" data-tab="graph-4">
<?php
$amount_sum = array();
$item_id = array();
$item_list = array();
$sql = 'SELECT SUM(records.amount) as sum, qr.id, qr.name
FROM records
LEFT JOIN qr ON records.qr = qr.id
WHERE records.type=0 AND records.payment_method=3 AND records.user_id=? AND records.date LIKE ?
GROUP BY records.qr
ORDER BY sum DESC';
$stmt = $db->prepare($sql);
$stmt->bind_param('is', $user_id, $graph_month_param);
$stmt->execute();
$stmt->store_result();
$count = $stmt->num_rows();
$stmt->bind_result($amount, $id, $item);
while ($stmt->fetch()) :
$amount_sum[] = $amount;
if (is_null($item)) :
$item_list[] = '不明';
$item_id[] = '';
else :
$item_list[] = $item;
$item_id[] = $id;
endif;
endwhile;
$json_qr_amount = json_encode($amount_sum);
$json_qr_item = json_encode($item_list);
?>
<?php if ($count !== 0) : ?>
<table class="p-table--graph">
<tr class="head">
<th>項目名</th>
<th>金額</th>
</tr>
<?php
for ($i = 0; $i < count($item_list); $i++) : ?>
<tr>
<?php if ($item_list[$i] !== '不明') : ?>
<td>
<a href="./item-report.php?year=<?php echo mb_substr($graph_month, 0, 4); ?>&item=<?php echo $item_id[$i]; ?>&num=3">
<?php echo $item_list[$i]; ?>
</a>
</td>
<?php else : ?>
<td class="unknown">
<?php echo $item_list[$i]; ?>
</td>
<?php endif; ?>
<?php if ($item_list[$i] !== '不明') : ?>
<td>
<a href="./item-report.php?year=<?php echo mb_substr($graph_month, 0, 4); ?>&item=<?php echo $item_id[$i]; ?>&num=3">
<?php echo '¥' . number_format($amount_sum[$i]); ?>
</a>
</td>
<?php else : ?>
<td class="unknown">
<?php echo '¥' . number_format($amount_sum[$i]); ?>
</td>
<?php endif; ?>
</tr>
<?php endfor; ?>
</table>
<?php else : ?>
<p>データがありません</p>
<?php endif; ?>
</div>
<!-- スマホ決済グラフ -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/item-pie-chart.php');
?>
スマホ用タブメニュープログラム部分
(1) sp-tab.phpという名前の切り分け先ファイルを作成します。
(2) 以下を切り取りsp-tab.phpに貼り付けます。
<!-- スマホ用切り替えタブ -->
<?php if (!isset($_GET['detail'])) : ?>
<ul class="p-switch-tab" id="tab">
<li class="p-switch-tab__item is-active" data-tab="tab-1">
<i class="fa-solid fa-pen"></i>
入力
</li>
<li class="p-switch-tab__item" data-tab="tab-2">
<i class="fa-solid fa-calendar-days"></i>
カレンダー
</li>
<li class="p-switch-tab__item" data-tab="tab-3">
<i class="fa-solid fa-list"></i>
一覧
</li>
<li class="p-switch-tab__item" data-tab="tab-4">
<i class="fa-solid fa-chart-pie"></i>
レポート
</li>
</ul>
<?php endif; ?>
<!-- スマホ用切り替えタブ -->
(3) 切り取り元に以下を追記します。
<?php
include_once('./component/index/sp-tab.php');
?>
以上のようにパーツごとに切り取ると350行程になりました。
最後に
今回はindex.phpファイルのリファクタリングとしてパーツごとに切り取り各ファイルを読み込む処理に修正しました。
次回は切り取ったパーツごとにリファクタリングを行っていきます。
最後までお読みいただきありがとうございました。
コメント