php webcalendar さらに続き

細かいスタイルの修正など。

・year.php
display_small_monthを呼んでいるときに、3番目の引数としてtrueをたすと、
年のカレンダーを呼んでいるときに、2010年8月、のように表示される。
月の表示があったほうが個人的に使いやすい。

・year.php
最後の方の、HTMLファイルを吐いているあたり。
month.phpとかday.phpはinclude/function.phpの中のdisplay_navigation関数を呼んで
タイトル周りのカテゴリーの表示などをしているが、year.phpだけは直接書いてある。
display_navigationで生成されるのに対応する部分と、divタグのclassが違っていたのでそろえる。
<div class=”title”>   →   <div class=”topnav”>
<span class=”date”>  →  <div class=”title”><span class=”date”>
{$catSelectStr}</div>   →   {$catSelectStr}</div></div>

・include/style.php
month.phpで矢印表示で次の月、前の月に移動するときに、
タイトルまわりにかなりスペースがあくのが気になるので修正。
.topnav のなかに width:100%; margin-top;5pxを追加
.title から widthの記述を削除

とりあえずこんなもんです。後はサーバーの日付を21時間ずらしてくれるのが気になりますがどこでいじってるのかわからないのでページを読み込むときに最初にincludeしているinclude/init.phpの中で、いろいろとファイルをinclude_onceした直後に
date_default_timezone_set($GLOBALS[‘TIMEZONE’]);
と書いておくことでとりあえずはなんとかなる。

ただ、データベースの中のwebcal_configの中のTIMEZONEにガッツリ値が書いてあるので、多分これが悪さしてるんだろうなぁという感じ。


よくよくデータベースとinclude/function.phpを眺めたらわかりました。
include/init.php→include/classes/Webcalendar.class の中の関数initializeSecondphase→include/functions.phpのload_global_settings、load_user_preferncesの二つの関数を順に呼ぶのだが、ここがまずい。
この二つの関数は、それぞれデータベースから設定を読んでグローバル変数GLOBALSに値を入れているのだけれども、date_default_timezone_setしているのはload_global_settingsの方だけ。しかし、load_global_settingsの方で呼ぶのはシステム設定の方の値。ここで設定されているTIMEZONEの値はインストール時に設定されたっきりのAmerica/New Yorkになっていて、インストールスクリプトをいじらないと変更できない(システム設定で選ぶタイムゾーンはSERVER_TIMEZONEという値)。load_user_preferences(プリファレンスの設定値)からはちゃんとTIMEZONEの値を設定したとおりAsia/Tokyoで持ってくるけど、その後php的にtimezoneの設定をしていなかったからダメ、というわけ。
正解はinclude/functioins.phpの中でload_global_settingの方のdate_default_timezone_setを消去、load_user_preferencesの中に適宜date_default_timezone_setを書く。というわけでした。

しかし、gooblogで<とか>とか含むページは編集が面倒くさいな。
&lt;とか&gt;とか書かないとちゃんと反映されない上に、編集しなおそうと思うと全部カッコにもどるし、、、。


4 thoughts on “php webcalendar さらに続き

  1. タイムゾーン
    差分を取ってみましたら、Ver123は、インストール時(install/index.php),js_cacher.php に 「America/New York」が決め打ちされてます。・・ほかにもあるかも?まだ調査中

    次バージョン1.2.4 ではFIXされそうです
    Version 1.2.4 (?? ??? 2010)
    – Bug fix: undefined function date_default_timezone_set in older versions
    of PHP.
    ttp://webcalendar.cvs.sourceforge.net/viewvc/webcalendar/webcalendar/ChangeLog?pathrev=REL_1_2

  2. Unknown
    コメントありがとうございます。

    >- Bug fix: undefined function date_default_timezone_set in older versions
    of PHP.

    これはたぶん、date_default_timezone_setが入っていないPHP4の対応の話ではないでしょうか。

    今回記事に書いた問題は、
    webcal_user_prefのTIMEZONEを使ってdate_default_timezone_setすべきところを、webcal_configのTIMEZONEでdate_default_timezone_setしてしまっているのがおかしい、ということです。

    データベースの中でタイムゾーンが書かれているのは、
    webcal_config の SERVER_TIMEZONE(settings:システム設定 で変更可能)
    webcal_user_pref の TIMEZONE(各ユーザーにある。preference:設定 で変更可能)
    webcal_config の TIMEZONE(インストール時に設定。変更できないし、ユーザーのTIMEZONEがある時は利用すべきでない、はず。)
    の三つがあって、ユーザーがpreferenceでTIMEZONEを設定しても、webcal_configにかかれたTIMEZONEしか参照していなかった、という感じのバグです。
    month.phpとかyear.phpなどを読んで、普通にカレンダーにアクセスしようとするとき、include_onceで引いているスクリプトをたどっていくと大体はまずinclude/init.php→include/classes/WebCalendar.classの_initInitSecondPhase→include/function.phpのload_global_settingsで、webcal_configのTIMEZONEを使ってdate_default_timezone_setされています。
    ユーザーが設定したTIMEZONEをちゃんと読めるようにしようというのが記事の内容でした(説明不足で読みにくかったかも?)。

    js_cacher.phpの方は、date_default_timezone_setしたあとに、load_global_settings(とload_user_preference)を呼んでその中でタイムゾーンを上書きしているのでたぶん問題ないのでしょう。
    インストールスクリプトの方はインストールが終わったら動かすことはないはずなので、あんまり気にしなくてもいいのかな、と思っています。

    以上、PHPは初心者なので間違っているところもあるかもしれませんが、誤解があればご指摘お願いします。

  3. Unknown
    source forgeのフォーラムでもバグが話題になっていましたが、アカウント作るのが面倒だったので、本家にメールしてお知らせしておきました。

コメントを残す