このページは「Web Site Design」 vol.5の特集3:第2章「CGI/SSIを使った更新テクニック」(著者:上田麦文氏)の補足情報ページです。誌面に掲載できなかった更新テクニック「ソートの対象をプルダウンメニューから選ぶ」をご紹介します。サンプルファイル内「textdb_sort」を参考にしながら読み進めてみてください。
紙面で紹介したスクリプトをさらに改良して、検索結果をソートできるようにしてみましょう。 
本誌P104「表示件数をプルダウンメニューから選ぶ(textdb_kensu)」で使用したプルダウンメニューは、HTMLで書くと、以下のようになります。
これが送信されると、CGIには『long=20』のように“NAME属の値”=“VALUEの値”という形式で渡されます。先の例で、$qr->param('long')でセレクトされた表示数が取得できると書きました。つまり、
『long=20』 の右辺が所得されたわけです。選択表示には数字が、またVALUEの値にも同じ数字が出力されています。
7〜17行目に書いてあるTSVのフィールド定義を見てください。左から順に0がアーティスト、1がアルバム名……となっています。ソート対象となるフィールドの数字もこれを使います。ですが、プルダウンメニューの表示も数字では困りますね。
そこでまず、7〜17行めを
my %FIELD = ( '0' =>'アーティスト', '1' =>'アルバム名', '2' =>'新品・中古', '3' =>'CD/LP', '4' =>'レーベル', '5' =>'レコード番号', '6' =>'国内盤/海外版', '7' =>'価格', '8' =>'コメント', '9' =>'ジャンル' );
と書き直します。
続いてプルダウンメニューを作りましょう。先ほどと同じように48行めの
$qr->textfield('query'),
の後ろに、以下のように追加します。
$qr->popup_menu(-name=>'sort',
-values=>['0', '1', '2','3','4','5','6','7','8','9'],
-labels=>\%FIELD),
先ほどと違うのは、-labels=>\%FIELDというところです。これは「プルダウンメニューに現れる文字は%FIELDのものを使いますよ」ということです。これでプルダウンメニューは以下のように出力されます。
セレクトされた表示数は$qr->param('sort') で取得できます。
先ほどと同じように
my $str = $qr->param('query');
の後に新しく
my $skey = $qr->param('sort');
と定義します。これで、変数$skeyにセレクトされたソートフィールドが代入されました。
検索を行っているのは67〜71行めです。検索した結果は配列@resultに入っています。この配列を変数$skeyでソートします。72行目
$fh->close;
の後に、以下のように書き加えます。
my @sorted = sort
{ (split("\t", $a))[$skey] cmp (split("\t", $b))[$skey]
} @result;
これで、$skeyで指定されたフィールドで@resultがソートされ、結果が配列@sortedに格納されます。
82行めの
foreach my $result (@result) {
を
foreach my $result (@sorted) {
に置き換えます。
これで、プルダウンメニューから選んだ数が結果に反映されるようになりました。
さらに、<応用>で解説した全機能を統合したものに、登順降順ソートとAND検索機能をつけたスクリプトも作成しました(textdb_zenbu)。特に解説はいたしませんが、興味ある方はご参考ください。
「Web Site Design」 vol.5の特集3:第2章「CGI/SSIを使った更新テクニック」