XoopsでRSSを配信

2007/08/12 | XOOPS

XoopsでRSSを配信したい、というリクエストをいただいた。早速検索してみるとRSSfitというモジュールが紹介されていた。URLはここ

ここで紹介されていたRSSfit1.1を使用してみた。RSS配信したいモジュール用のプラグインを作成すれば準備完了だ(あとモジュールに対するアクセス権限も)。
結論からいくといとも簡単にRSSを配信することが出来た。

ちなみにこの上記で紹介したサイトで配布されているRSSfitJ(独自に日本語対応されたモジュール)は現行のXoops(2.0.16a JP)では動作しなかった(管理画面がうまく動いてくれないので設定のしようがない)。

RSSfitの本家を見てみた。こちらではRSSfitの最新版(1.21)が配布されていた。
ちなみにこちらでも、プラグインを作ることで正しく動作しているように見えるが、管理画面中で文字化けしているようなところが見受けられたので、今回は使用しなかった。多言語パックも用意されているようだが、日本語は用意されていなかった(残念)。
日本語版、つくってもいいかもしれない。でも、本家がマルチバイト対応していないので、プログラム本体のソースを全部追わないといけないので、それはそれでちょっと大変・・・。

最近のお気に入り「コールバック関数」

2007/08/11 | マイPHPメモ

最近コールバック関数がお気に入りだ。おそらく使わなくてもいいような関数ではあるのだが、使うことでスクリプトがすっきりするからだ。

例えば、ある配列が以下のように定義されているとする。
$myArray=array(
  [0]=>array(‘a’,’b’),
  [1]=>array(‘c’,’d’),
  [2]=>array(‘e’,’f’),
  [3]=>array(‘g’,’hb’),
    :
    :
);

この配列のそれぞれの値について処理をする方法を考える。まず通常はforeachなどでループ処理を書けばよい。
foreach($myArray as $myValue){
  //処理1
}

ここに別の要素が加わるとする。例えば別の変数があり、その変数の値がtrueなら処理1を、falseなら処理2をさせるとする。プログラムを羅列するとこんな風になる。
if($flag){
  foreach($myArray as $myValue){
    //処理1
  }
}else{
  foreach($myArray as $myValue){
    //処理2
  }
}

これはいかにも冗長だ。しかしコールバック関数を使うときれいなプログラムがかける。
$funcName=($flag ? ‘proc1′:’proc2′);
array_walk($myArray,$funcName);
function proc1{
  //処理1
}
function proc2{
  //処理2
}

まぁ、どちらが美しいかというのは、人それぞれの感性によるものだからなんともいえないのだが、個人的には後者のプログラムのほうがすっきりしているように見える。array_walkという関数が難しければ、こんなふうにもかける。
$funcName=($flag ? ‘proc1′:’proc2′);
foreach($myArray as $myValue){
  call_user_func($funcName,$myValue);
}
function proc1{
  //処理1
}
function proc2{
  //処理2
}

要は関数名そのものを変数に格納し、その変数を読むことによって、希望する関数を呼び出す、ということ、になる。
あまりコールバック関数ばかり使うと、逆にプログラムが読みにくくなってしまう可能性も無きにしも非ずだが、適度に利用することで、すっきりしたプログラムが書けるようになる。
今まで使えなかった機能をつけるようになるというのは、少し楽しい。

クラス内でコールバック関数を使ったときの失敗

コールバック関数はとっても便利だ。しかし、今回、とあるプログラム作成で思いっきりはまった事象があったのでメモする。今回はarray_walkという関数を使用した。array_walk関数は指定された配列の全ての要素に対して、コールバックで与えられた関数を適用する、という関数だ。

bool array_walk ( array &array, callback funcname [, mixed userdata] )

まず一つ目は単なる備忘録。「callback funcname」には関数名をしているのだが、クラス内で使用する場合は配列の形で関数名を渡してやる。具体的にはこんな感じ。

array($this,’_callbackfunction’)

別のクラス内にある関数を使う場合には上記の「$this」がクラス名(もしくはオブジェクト名)になる。
これは大したことない。問題は次。

とあるクラスの関数内でarray_walkを使用し、全ての要素に対して特定のチェックをかけるルーチンを記述したかった。当然チェックをかけるルーチンはコールバック関数で記述する。

ここでコールバック関数を以下のように書いてみた。
function _check($value,$key,$check){
  if($value==$check){
    $this->checked[]=$key;
  }
}

array_walkの第3引数で「$check」を渡しておき、コールバック関数内で値と「$check」を比較し、同じならクラス内のメンバ変数$checkedに配列の要素として追加していく、というものだ。
しかしこれ、プログラムを実行し、最後にメンバ変数$checkedを出力しても、何も格納されないのだ。何回やっても、代入の仕方を変えてもダメ。何をやっても空だ。

そしてふと気づいた。これって単に関数として呼び出してるだけで、オブジェクトには何の関係もないのでは・・・、もしそうならメンバ変数とか、コールバック関数内から別の関数を呼ぶことも出来ない。

ということだった。
結局array_walkはやめて、単にループで回してチェックをかけることで解決した。まだまだ技量も知識も足りないらしい。

正規表現でhtmlからのタグ抽出

2007/08/09 | PHPで正規表現

<div>ab</div><div>cd</div><div>ef</div>

こういう文字列があるとする。ここから正規表現でab、cd、efという文字列を抽出したいのだが、正規表現の記述で悩んだのでメモ。

(1) 最初はこのような正規表現を書いてみた。
!<div>(.*)</div>!

しかしこれだとなぜか一番最初の<div>と一番最後の</div>にマッチしてしまう。なぜ?。

(2) そこで数時間調べに調べてこんな正規表現に行き着いた。
!<div>(.*?)</div>!

見てのとおり「?」が一つついただけ。しかしたったそれだけで期待する結果を配列で得ることが出来た。「.」は任意の1文字で「*」は0回以上の繰り返し、「?」は0回または1回で「()」はパターンを表す・・・。で結局「(.*)」と「(.*?)」とでは何が違うのか・・・全然わからない。

まだまだ修行が足りないということなのだが、両者の違いを明確に教えていただける人がいれば、是非解説をお願いします。

Xoops と Xoops Cube

2007/08/08 | XOOPS

今まで使わなかったがXoops Cubeというソフトウェアがある。元々はXoopsは1本の開発の流れがあったが、そこから分家したソフトだ。先日とうとう安定版がでたとのアナウンスを見かけたので、早速インストールしてみた。

んで驚いた。
だって全然中身が違うんだもん。

Xoops Cubeは日本独自のバージョンとのことだが、そういえば昔、本家でのマルチバイト対応の問題でもめてた時期があったなぁ、と思い出しだ。開発者は日本人なのにおかしな話だ。おそらくあのときの遺恨を引きずって、分家したのだろう。

しかし困った。この数ヶ月で覚えたことが水の泡、というわけではないけれど戸惑うところは多々ある。
まず、管理画面のインターフェースが変わった。正直なれるのには時間がかかる。どこに何があるのかわからないのだ。
そしてモジュール。ユーザ登録などはモジュール化されてしまっている(これはいいことかもしれない)。結局ここはハックする方法を再検討しなくてはならない。
あと、管理画面もテンプレート化された模様。これはちょっとうれしい。

さて、白扇後継モジュールの作成をどうするか考えないといけない。これはちょっとペンディングにしたほうがよさそうだ。少し動向を見守ってから開発に着手することにする。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net