[補足情報]CGI更新テクニック:ソートの対象をプルダウンメニューから選ぶ

このページは「Web Site Design」 vol.5の特集3:第2章「CGI/SSIを使った更新テクニック」(著者:上田麦文氏)の補足情報ページです。誌面に掲載できなかった更新テクニック「ソートの対象をプルダウンメニューから選ぶ」をご紹介します。サンプルファイル内「textdb_sort」を参考にしながら読み進めてみてください。


■ソートの対象をプルダウンメニューから選ぶ

紙面で紹介したスクリプトをさらに改良して、検索結果をソートできるようにしてみましょう。

1) プルダウンメニューをつくる

本誌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のものを使いますよ」ということです。これでプルダウンメニューは以下のように出力されます。

	

2)セレクトされたフィールドの値を取り出す

セレクトされた表示数は$qr->param('sort') で取得できます。
先ほどと同じように

  my $str = $qr->param('query');

の後に新しく

  my $skey = $qr->param('sort');

と定義します。これで、変数$skeyにセレクトされたソートフィールドが代入されました。

3) ソートする

検索を行っているのは67〜71行めです。検索した結果は配列@resultに入っています。この配列を変数$skeyでソートします。72行目

  $fh->close;

の後に、以下のように書き加えます。

  my @sorted = sort
      { (split("\t", $a))[$skey] cmp (split("\t", $b))[$skey] 
      } @result;

これで、$skeyで指定されたフィールドで@resultがソートされ、結果が配列@sortedに格納されます。

4)@resultと@sortedを置き換える

82行めの

  foreach my $result (@result) { 

  foreach my $result (@sorted) { 

に置き換えます。

5)変更したファイルを保存する

これで、プルダウンメニューから選んだ数が結果に反映されるようになりました。


■更新スクリプト(全部入り)

さらに、<応用>で解説した全機能を統合したものに、登順降順ソートとAND検索機能をつけたスクリプトも作成しました(textdb_zenbu)。特に解説はいたしませんが、興味ある方はご参考ください。

↑ページの先頭へ


(c)Mugifumi Ueda

「Web Site Design」 vol.5の特集3:第2章「CGI/SSIを使った更新テクニック」