PHPで年ごとに自動でプルダウンを作り初期選択を年度にする方法
最近、PHPのレガシーシステムと闘っている綴間チヨノリです。
誰かが勝手に作って運用にのって年数が(とっても)経っている社内システムがあります。
話を聞くと、なんと毎年西暦が変わるころ、手動で各システムの西暦のプルダウンを作らないといけないと聞き絶句。
つまり、
- 1月1日になったら20XX年バージョンのコードを追記
そんなプログラムにせざるえなかった過去の状況はお察しします(いそがしかったんですよね?わかりますよ、僕も東京の某所でデスマ中に朝ご飯食べにタクシーでよく自宅に帰ってました。タクシー代1万円という迷走ぶり)。
しかし、自動的に作られるプログラムへ書き換えた方がいいので、
- 自動的に20XX年のプルダウン作成
- 初期選択を年度(年度開始が4月なら3月31日までは次年度を初期選択しない)
をまとめました~
プロフィールも見てくれると嬉しいです(唐突)。
自動でプルダウンを作るサンプルコード
PHPでプルダウンを作る処理は簡単ですが、年ごとに自動で作ってくれるサンプルコードはなかなかコレだ!ってのが見つかりませんでした。
手動でいまだに更新されてる我が社のような、レガシーシステムを保守せざる得ない方のために参考となれば幸いです。
たとえば、以下が手動で書き直すしかないコード(毎年これやってたのか、、、)。
$stDate_opt = array(
"2022" => "2022年度",
"2021" => "2021年度",
"2020" => "2020年度",
"2019" => "2019年度",
"2018" => "2018年度",
"2017" => "2017年度",
"2016" => "2016年度",
"2015" => "2015年度",
"2014" => "2014年度",
"2013" => "2013年度",
"2012" => "2012年度",
"2011" => "2011年度",
"2010" => "2010年度"
以下が、自動的にプルダウンを作ってくれるコード。
for($i=0;$i<(intval(date("Y"))-intval("2009"));$i++){
$date = '2010-04-01';
$nextyear = date("Y",strtotime($date ."+" .$i ." year"));
$nextyear2 = date("Y年度",strtotime($date ."+" .$i ." year"));
$stDate_opt[$nextyear] = $nextyear2;
}
プルダウンで今年度を初期選択にするサンプルコード
西暦をまたいだばかりの1月に次年度を初期選択されても困りますので、特定の日付になるまでは前年を選択してくれるほうが助かりますよね。
以下が、今年度を初期選択してくれるコード。
$today = date("Y/m/d");
//年度開始を4月1日とする
$target_day = date("Y")."/04/01";
if(strtotime($today) >= strtotime($target_day)){
$obj->assign("stDate_DT",date("Y",time()));
}else{
$obj->assign("stDate_DT",intval(date("Y",time()))-1);
<番外編>年月でプルダウンを作りたいときのサンプルコード
プルダウンを年で書きましたが、年月でほしい場合もあるかもしれません。
以下が、年月で自動的にプルダウンを作ってくれるコード。
//7年前から現在までの年月のプルダウン
for($i=0;$i<84;$i++){
$date = strval(intval(date("Y"))-intval("6")).'-04-01';
$nextmonth = date("Ym",strtotime($date ."+" .$i ." month"));
$nextmonth2 = date("Y年m月",strtotime($date ."+" .$i ." month"));
$K_OP[$nextmonth] = $nextmonth2;
}
$obj->assign("K_OP",$K_OP);
$obj->assign("K_DT",date("Ym",time()));
まとめ
こちら年度のプルダウンを想定して書きましたが、年の場合なら「年度」の「度」を取りましょう。
そして、初期選択の条件文を削除すればオッケーですね~
修正部分のみ公開しているので、ちゃんとセットしたり、HTML側の部分もあるのでご注意ください(さすがにわからない場合はもっと入門編の記事を読まれた方がいいです)。
ということで、
今後もいろいろ書いていきます^^
よかったら、こんな記事を公式サイトでは書いてるので見てみてね~
Discussion