COREBlog2をPlone3で動かすための修正: portletのカレンダー¶
Plone-3.3.2 にアップグレードして公開 したときの課題として、 "COREBlog2のカレンダー表示が月変更出来ない" というものがありました。これを修正する方法が分かりました。
- 対象:
COREBlog2_nightly.tgz (2008/10時点)
- Plone:
Plone-3.3.2
まず原因ですが、COREBlog2のポートレット表示用カレンダーは skins/COREBlog2/portlet_coreblogcalendar.pt
というテンプレートで表示されます。ここで表示対象月を決めている変数が year, month なのですが、この変数の初期化時に options/year
に年が設定されていないため、現在の日付を元にカレンダー表示されてしまっているようです。ここで使われている options 変数は skins/COREBlog2/archives.py
の最終行で cbarchive_view.pt に渡されていますが、これがどうやらportletには渡ってこないようです。(どこかにこの仕様変更について情報がないか探してみたのですが、見あたりませんでした)
この問題の修正の方針は3つあります。
Plone3向けのportletを書く
portlet_coreblogcalendar.pt 内でoptionsに頼らずにyear,monthを取得する
archives.py でrequest変数にyear,monthを設定しておいてportlet_coreblogcalendar.ptで使う
今回は2の方法で対応してみます。
2. portlet_coreblogcalendar.pt 内でoptionsに頼らずにyear,monthを取得する¶
まず、 portlet_coreblogcalendar.pt をカスタマイズフォルダ(portal_skins/custom)に複製します。そして以下のように修正します:
tal:define="DateTime python:modules['DateTime'].DateTime;
current python:DateTime();
- yearmonth here/getYearAndMonthToDisplay;
- year options/year | python:yearmonth[0];
- month options/month | python:yearmonth[1];
+ yearmonth python:here.cbcalendar_date() or here.getYearAndMonthToDisplay();
+ year python:yearmonth[0];
+ month python:yearmonth[1];
prevMonthTime python:here.getPreviousMonth(month, year);
nextMonthTime python:here.getNextMonth(month, year);
次に、上記の書き換えで呼び出されることになった cbcalendar_date はまだどこにも存在していないので、このスクリプトを用意します。portal_skins/customフォルダで "Script(Python)" を新規追加して、名前を 'cbcalendar_date' として以下の内容を記載します。
request = container.REQUEST
sub_traverse = request.ACTUAL_URL[len(request.URL):].strip('/').split('/')
isArchive = request.URL.split('/')[-1] == 'archives' and sub_traverse
if isArchive:
yearmonth = [
int(sub_traverse[0]),
int(sub_traverse[1]),
]
return yearmonth
else:
return None
これでカレンダーを次月、前月に遷移できるようになると思います。