古都で働く、プリングルズ大好き似非システム管理者が、お仕事関係の備忘録を書いたり、日々のあれこれを書いたり。
[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
「グループウェアL01」をちょっとカスタマイズ
株式会社リミットリンクが公開しているPHP製のグループウェア「グループウェアL01」はLAMP環境なら簡単に導入できるオープンソースのグループウェア。PHP4ベースでちょっと古いのと、著作権表示が削除できないのがちょっと惜しいところではあるけれど、社内用に使うには全然問題ない、というかソースがいじれる分プロプラなグループウェアよりこっちの方がいい気がする。
で、このL01にはタイムカード機能があって、毎月のタイムカードをCSVで書き出すこともできるので、あっちこっちの現場を毎日移動して仕事をする時なんかは便利。毎日必ず、VPNで社内ネットワークには入るので、VPN越しにL01にログインしてタイムカードが押せる。締め日にはCSVで書きだしたファイルを担当者さんへメールで送信すればいいわけ(担当者さんがCSVをダウンロードしてくれたらもっと楽なんだけど)。
そんなL01なのだけれど、使っているとちょっとずつ気になるところは出てくるわけで、今回はタイムカード機能のところをちょっといじってみた。ついでに、山の日が休日になったのにも対応しておくことに。
で、このL01にはタイムカード機能があって、毎月のタイムカードをCSVで書き出すこともできるので、あっちこっちの現場を毎日移動して仕事をする時なんかは便利。毎日必ず、VPNで社内ネットワークには入るので、VPN越しにL01にログインしてタイムカードが押せる。締め日にはCSVで書きだしたファイルを担当者さんへメールで送信すればいいわけ(担当者さんがCSVをダウンロードしてくれたらもっと楽なんだけど)。
そんなL01なのだけれど、使っているとちょっとずつ気になるところは出てくるわけで、今回はタイムカード機能のところをちょっといじってみた。ついでに、山の日が休日になったのにも対応しておくことに。
グループウェアの動作を簡単に追っていくために、まずはindex.phpを開いてみる。ざっとソースを眺めてみてタイムカードの辺りを読むと、timecardフォルダの中にタイムカード関係のファイルがあることが分かる。てか、名前だけで予想はつくけれど。
timecardフォルダ内にはいくつかファイルがあるけれど、index.phpが毎月のタイムカードを表示するところ。なので、まずはここをいじってみる。
どうしたいのか、というと、うちは1ヶ月の勤務が21日始まりの20日締め、という風になっていて、でもL01のタイムカード機能は1日始まりの末日締めとなっているのでぱっと見が見にくい。更にCSVで書き出す際も1日~末日で書き出されるので、これまでは2ヶ月分を書き出して1ヶ月にまとめるという作業をしていたのを、21日~20日の1ファイルで書き出したい。
index.phpを眺めてみると、なんとなく36行あたりにカレンダーの見出し部分を書き出しているコードがあるので、その下辺りが怪しいなと見当をつける。その下から始まるphpのコードでは確かに年月日や曜日を変数に入れているので、ほぼここからで当たりっぽい。
「$timestamp」や「$lastday」、「$weekday」といった変数定義に続いて、その少し下にあるfor文の部分、ここが1ヶ月のカレンダーを吐き出す部分にあたる。ためしに、
となっているところを、
に書き換えてみると、確かにタイムカードのカレンダーは21日で始まり末日で終わる。でも、曜日が変わらない。日付を21から始めても、曜日の初期化が1日からのままになっているからだろうな、という訳で、変数定義の「$timestamp」のところを
から
に書き換えてみる。すると、今度は曜日も一緒に変わった。
さて、そうすれば今度はカレンダーを前月の21日から今月の20日まで表示させるように変更すればいいのだけれど、1日~末日なら単純に$i++すればいいのだろうけどどうしたものか・・・と小一時間悩んだ。$i=21からスタートして$lastdayに20足しておいて、カレンダーの中で$lastday超えた日付は-20する、とか考えたけどかなり面倒だしhtml上でしか変わらない。
ここは素直に前月から始めればいいんじゃない?という事で今度は
を
としてみた。するとどうでしょう、ちゃんと前月21日から末日までのカレンダーが生成された。
んじゃ力技で、えいやっとカレンダーを生成するfor文を丸ごと後ろにもう一つコピーして、
で始まるパートと
で始まるパートの2つに分けてみたら、これが大成功。ちゃんと21日~20日までのコードを書き出す事ができた。
でも、前月部分の休日がちゃんと反映されていない。これは、最初のfor文のすぐ下、
を
と書き換える事で対処できた。
ここまで来て、グルウープウェア上のタイムカードのテーブルは書き換えられたのだけれど、これをCSVで書きだしてみるとフォーマットは変わらず1日~末日、の状態で書き出される。CSVを書き出すのはどこだろうと、またソースを眺めてみると、同じフォルダのcsv.phpっぽいのだけれど、このファイルはapplicationフォルダにあるloader.phpをrequireしてるだけ。なのでloader.phpを見に行ってみると、今度はcontroller.phpをrequireしている。んじゃ、とcontroller.phpを見に行くと・・・あれ、見失ってしまった。CSVとかそれっぽいのが見当たらない。
まあとにかく、applicationフォルダの中が怪しいよな・・・とあれこれ見てみると、「model」フォルダの中にtimecard.phpというファイルがある。これは?と思い開いてみると、これが正解らしくファイルの少し下の方、286行目付近にcsv()という関数が定義されている。その中身は、さっきtimecardフォルダのindex.phpで書き換えたのとよく似たコード。なので、さっきと同じような感じで
は
に書き換え、for文はまるっとコピーして21~$lastdayのパートと1~21のパートにしておいた。あと、これは一度csvに書き出して気がついたのだけれど、
$csv = $_GET['year'].'年'.$_GET['month'] .'月."\n";
を
$csv = $_GET['year'].'年'.( $_GET['month'] - 1 ).'月~'.$_GET['month'].'月'."\n";
と書き換えておくと、csvファイルに書きだしたときの見出しが変わって分かりやすくなった。
ここまでで、タイムカードの1ヶ月とそのCSVへの書き出しが変更できたはず。あとは、祝日を追加しておきたいので、application/viewの中にあるcalendar.phpを編集する。この中に、祝日が配列として保存されているので、山の日であれば2016-08-11、2017-08-11、・・・という風に日付を配列に追加してやればいいみたい。同様にして、独自の休日を加えることもできるので、創立記念日などをカレンダーやタイムカードに反映させる事もできるだろう。
これで、グループウェアが少し使いやすくなった。今度は、ログインしたまま時間が経つとリロードした時にブランクになってしまうのを何とかしたいところ。カレンダーにiCal読み込みとかも付けられたらいいのだけれど・・・それはちょっと敷居が高いな。
※追記
ここに書いた方法だと、前月21日~31日までのタイムカード記録が実際には当月分として記録されてしまっていた。1ヶ月運用してみて2回目の21日が来た時にタイムカードが記録済みになってしまっていて気がついた。タイムカードをデータベースへ記録するところを修正する必要があるんだろうけど、時間が取れないので今のところ放置中・・・
timecardフォルダ内にはいくつかファイルがあるけれど、index.phpが毎月のタイムカードを表示するところ。なので、まずはここをいじってみる。
どうしたいのか、というと、うちは1ヶ月の勤務が21日始まりの20日締め、という風になっていて、でもL01のタイムカード機能は1日始まりの末日締めとなっているのでぱっと見が見にくい。更にCSVで書き出す際も1日~末日で書き出されるので、これまでは2ヶ月分を書き出して1ヶ月にまとめるという作業をしていたのを、21日~20日の1ファイルで書き出したい。
index.phpを眺めてみると、なんとなく36行あたりにカレンダーの見出し部分を書き出しているコードがあるので、その下辺りが怪しいなと見当をつける。その下から始まるphpのコードでは確かに年月日や曜日を変数に入れているので、ほぼここからで当たりっぽい。
「$timestamp」や「$lastday」、「$weekday」といった変数定義に続いて、その少し下にあるfor文の部分、ここが1ヶ月のカレンダーを吐き出す部分にあたる。ためしに、
for ($i = 1; $i <= $lastday ; $i++) {
となっているところを、
for ($i = 21; $i <= $lastday ; $i++) {
に書き換えてみると、確かにタイムカードのカレンダーは21日で始まり末日で終わる。でも、曜日が変わらない。日付を21から始めても、曜日の初期化が1日からのままになっているからだろうな、という訳で、変数定義の「$timestamp」のところを
$timestamp = mktime(0, 0, 0, $_GET['month'] , 1, $_GET['year']);
から
$timestamp = mktime(0, 0, 0, $_GET['month'] , 21, $_GET['year']);
に書き換えてみる。すると、今度は曜日も一緒に変わった。
さて、そうすれば今度はカレンダーを前月の21日から今月の20日まで表示させるように変更すればいいのだけれど、1日~末日なら単純に$i++すればいいのだろうけどどうしたものか・・・と小一時間悩んだ。$i=21からスタートして$lastdayに20足しておいて、カレンダーの中で$lastday超えた日付は-20する、とか考えたけどかなり面倒だしhtml上でしか変わらない。
ここは素直に前月から始めればいいんじゃない?という事で今度は
$timestamp = mktime(0, 0, 0, $_GET['month'] , 21, $_GET['year']);
を
$timestamp = mktime(0, 0, 0, ( $_GET['month'] - 1 ) , 21, $_GET['year']);
としてみた。するとどうでしょう、ちゃんと前月21日から末日までのカレンダーが生成された。
んじゃ力技で、えいやっとカレンダーを生成するfor文を丸ごと後ろにもう一つコピーして、
for ($i = 21; $i <= $lastday ; $i++) {
で始まるパートと
for ($i = 1; $i <= 20 ; $i++) {
で始まるパートの2つに分けてみたら、これが大成功。ちゃんと21日~20日までのコードを書き出す事ができた。
でも、前月部分の休日がちゃんと反映されていない。これは、最初のfor文のすぐ下、
$class = $calendar->style($_GET['year'], $_GET['month'] -1 , $i, $weekday, $lastday);
を
$class = $calendar->style($_GET['year'], ( $_GET['month'] -1 ) , $i, $weekday, $lastday);
と書き換える事で対処できた。
ここまで来て、グルウープウェア上のタイムカードのテーブルは書き換えられたのだけれど、これをCSVで書きだしてみるとフォーマットは変わらず1日~末日、の状態で書き出される。CSVを書き出すのはどこだろうと、またソースを眺めてみると、同じフォルダのcsv.phpっぽいのだけれど、このファイルはapplicationフォルダにあるloader.phpをrequireしてるだけ。なのでloader.phpを見に行ってみると、今度はcontroller.phpをrequireしている。んじゃ、とcontroller.phpを見に行くと・・・あれ、見失ってしまった。CSVとかそれっぽいのが見当たらない。
まあとにかく、applicationフォルダの中が怪しいよな・・・とあれこれ見てみると、「model」フォルダの中にtimecard.phpというファイルがある。これは?と思い開いてみると、これが正解らしくファイルの少し下の方、286行目付近にcsv()という関数が定義されている。その中身は、さっきtimecardフォルダのindex.phpで書き換えたのとよく似たコード。なので、さっきと同じような感じで
$timestamp = mktime(0, 0, 0, $_GET['month'] , 1, $_GET['year']);
は
$timestamp = mktime(0, 0, 0, ( $_GET['month'] -1 ) , 21, $_GET['year']);
に書き換え、for文はまるっとコピーして21~$lastdayのパートと1~21のパートにしておいた。あと、これは一度csvに書き出して気がついたのだけれど、
$csv = $_GET['year'].'年'.$_GET['month'] .'月."\n";
を
$csv = $_GET['year'].'年'.( $_GET['month'] - 1 ).'月~'.$_GET['month'].'月'."\n";
と書き換えておくと、csvファイルに書きだしたときの見出しが変わって分かりやすくなった。
ここまでで、タイムカードの1ヶ月とそのCSVへの書き出しが変更できたはず。あとは、祝日を追加しておきたいので、application/viewの中にあるcalendar.phpを編集する。この中に、祝日が配列として保存されているので、山の日であれば2016-08-11、2017-08-11、・・・という風に日付を配列に追加してやればいいみたい。同様にして、独自の休日を加えることもできるので、創立記念日などをカレンダーやタイムカードに反映させる事もできるだろう。
これで、グループウェアが少し使いやすくなった。今度は、ログインしたまま時間が経つとリロードした時にブランクになってしまうのを何とかしたいところ。カレンダーにiCal読み込みとかも付けられたらいいのだけれど・・・それはちょっと敷居が高いな。
※追記
ここに書いた方法だと、前月21日~31日までのタイムカード記録が実際には当月分として記録されてしまっていた。1ヶ月運用してみて2回目の21日が来た時にタイムカードが記録済みになってしまっていて気がついた。タイムカードをデータベースへ記録するところを修正する必要があるんだろうけど、時間が取れないので今のところ放置中・・・
PR