複数AND検索の結果をソートしたい。
しかもソート状態を保持したまま、
追加のAND検索をかけられるようにしたい。
いろいろ試したらできました・・!
希望としては、シンプルに、テーブルの見出しのテキストをクリックすると
昇順・降順交互に切り替わるようにしたいというものでした。。
▼サンプルイメージ
〜〜〜〜〜〜〜〜〜〜〜〜
ソートのパラメータを受け取ってから
SQLクエリに追加するところは比較的簡単にできました。
●sortのパラメータを受け取る。
if (empty($_REQUEST[‘sort’]))
{
$sort = “”;
}
else
{
$sort = $_REQUEST[‘sort’];
}
●ソートのためのSQL文 ORDER BYクエリを作成する
(switch使用)
switch ($sort) {
case 1:
$sort_query = ” ORDER BY topic_id”;
break;
case 2:
$sort_query = ” ORDER BY topic_id DESC”;
break;
case 3:
$sort_query = ” ORDER BY name”;
break;
case 4:
$sort_query = ” ORDER BY name DESC”;
break;
case 5:
$sort_query = ” ORDER BY category”;
break;
case 6:
$sort_query = ” ORDER BY category DESC”;
break;
default:
$sort_query = ” ORDER BY topic_id”;
break;
}
これで$sortに入った番号により、ORDER BYクエリが選択される。
●SQLクエリに追加
検索結果を維持したままソートする。
検索結果は複数AND検索を作ったときに、検索条件が保持されるようにしているのでそのまま活用。
$sql = “SELECT XXX, XXX FROM XXX LFET JOIN XXX…
WHERE 1”;
$sql.=” AND ($topic_where_clause)”; ※別途生成している検索のSQLクエリ
$sql.=” AND ($name_where_clause)”; ※別途生成している検索のSQLクエリ
$sql.=” $sort_query”; ※ソートのSQLクエリ
●ソートのためのリンク(tableの見出し行)の作成
問題はソートのパラメータの飛ばし方だ
純粋に<input type=”submit” name=”sort” value=”2″ />のように
ソートのパラメータを飛ばせば良いのですが、
ボタンが必要になってしまうし、
それだけだと検索絞込条件がリセットされてしまう。
全100件のうち、nameやらcategoryやらで絞り込んで15件表示されている状態で、
そのままソートしたいのに
ソートしたら全100件がソートされて表示されてしまう。。
ということでいろいろ方法が考えました。
■方法? 検索のパラメータと一緒にGETで飛ばす。
検索はPOSTでやっていたので
ほんとはソートもPOSTがいいのですが。。。
わざわざ各検索のパラメータも全部含めてリンクURLにくっつけて、GETで渡す方法。
★ちなみにソートリンク箇所は押すたびにリンクが変わることになるので
swithで作成。
function generate_sort_links($topic_search, $name_search, $sort) {
$sort_links = ”;
switch ($sort) {
case 1:
$sort_links .= ‘<td><a href = “‘ . $_SERVER[‘PHP_SELF’] . ‘?topicsearch=’ . $topic_search . ‘&namesearch=’ . $name_search . ‘&sort=2“>topic_id</a></td>’;
$sort_links .= ‘<td><a href = “‘ . $_SERVER[‘PHP_SELF’] . ‘?topicsearch=’ . $topic_search . ‘&namesearch=’ . $name_search . ‘&sort=3“>name</a></td>’;
$sort_links .= ‘<td><a href = “‘ . $_SERVER[‘PHP_SELF’] . ‘?topicsearch=’ . $topic_search . ‘&namesearch=’ . $name_search . ‘&sort=5“>category</a></td>’;
case 3:
$sort_links .= ‘<td><a href = “‘ . $_SERVER[‘PHP_SELF’] . ‘?topicsearch=’ . $topic_search . ‘&namesearch=’ . $name_search . ‘&sort=1“>topic_id</a></td>’;
$sort_links .= ‘<td><a href = “‘ . $_SERVER[‘PHP_SELF’] . ‘?topicsearch=’ . $topic_search . ‘&namesearch=’ . $name_search . ‘&sort=4“>name</a></td>’;
$sort_links .= ‘<td><a href = “‘ . $_SERVER[‘PHP_SELF’] . ‘?topicsearch=’ . $topic_search . ‘&namesearch=’ . $name_search . ‘&sort=5“>category</a></td>’;
case 5:
$sort_links ・・(省略)
default:
$sort_links ・・(省略)
}
return $sort_links;
}
HTML書き出しのteble見出し箇所で、
echo generate_sort_links($topic_search, $name_search, $sort)
ファンクションをセットして完成。
しかしデメリットが
検索(絞り込み)に複数選択できるチェックボックスを使用したりして、検索のパラメータに「配列」が含まれているとやっかい。。
そしてまんまと「配列」が含まれていた私は
GETだとなぜか「array」の文字が渡されて「array」が検索ワードになってしまう始末。。
疑問。
GETで配列は渡せないのか
・PHPの$_POSTや$_GETで配列を使うには
・PHPの$_POST, $_GET, $_COOKIEの要素に配列を使用する
いろいろ調べてみるといけそうなのですが・・
[]を付け加えてもうまくいかない。
これが解決すればこの案でも目的は達成できると思います。
しかしそもそもGET一押しじゃない私は別案にいきました。。
■方法? 検索のパラメータと一緒にPOSTで飛ばす。
ここでぶつかった問題。
テキストリンクでPOSTをどうやって渡すのか
・テキストリンクをPOST送信したい
・リンクで「submit」
・リンクをクリックした時にformからPOST送信したい。
上記のとおり、javascriptを使用すればイケそうです。
あんまりJSは使用したくないのですがちょっと試してみた。
方法?のソートのリンクのところをJSに変更。
switch ($sort) {
case 1:
$sort_links .= ‘<td><A HREF=”javascript:document.form.submit()”>topic_id</A><input type=”hidden” name=”sort” value=”2” /></td>’;
$sort_links .= ‘<td><A HREF=”javascript:document.form.submit()”>name</A><input type=”hidden” name=”sort” value=”3” /></td>’;
$sort_links .= ‘<td><A HREF=”javascript:document.form.submit()”>category</A><input type=”hidden” name=”sort” value=”5” /></td>’;
case 3: 〜〜(省略)
このソートのパラメータは検索条件のパラメータと一緒のPOSTで送信になると思うので、
検索部分と同一のFORMタグ内に、含めました。
そしたら・・
検索エリアの検索ボタン(submit)を押しても
ソートが実行されてしまう
FORMタグ別々にすればいけるかも。
でも検索のPOST情報とソートのPOST情報をどうやってがっちゃんこするの??
一つのFORMタグ内に別々の役割の複数のsubmitは置けないの??
この方法は、ソートパラメータだけをPOST送信するのであれば行けそうですが
複数AND検索の結果を保持しつつ、POST送信するのがむずかしすぎる・・
fsockopenとかなんか方法はありそうなのですが
そもそものところから考えなおし・・
そもそもテキストリンクは絶対なのか??と思いました。
まだデザインも確定しているわけでもないし
とりあえず確実路線でいこう〜〜
ということでボタン方式にしてみる。
■方法? 検索のパラメータと一緒にPOSTで飛ばす。(ソートのリンクはボタン)
▼サンプルイメージ
まぁ今回に限っては絶対にテキストリンクでなくてはいけないということもないので。
ソートボタンを置けばいんじゃん。ということで。
これだとすんなりいきました・・
検索と同じFORMタグ内でかつ、POST送信なので
検索パラメータのことは考えずにリンクをつくる。
配列でもなんでも全部ひっくるめて送ってくれるPOST便利だな。
function generate_sort_links($sort) {
$sort_links = ”;
switch ($sort) {
case 1:
$sort_links .= ‘<td>topic_id<input type=”submit” name=”sort” value=”2” /></td>’;
$sort_links .= ‘<td>name<input type=”submit” name=”sort” value=”3” /></td>’;
$sort_links .= ‘<td>category<input type=”submit” name=”sort” value=”5” /></td>’;
case 3:
$sort_links .= ‘<td>topic_id<input type=”submit” name=”sort” value=”1” /></td>’;
$sort_links .= ‘<td>name<input type=”submit” name=”sort” value=”4” /></td>’;
$sort_links .= ‘<td>category<input type=”submit” name=”sort” value=”5” /></td>’;
case 5:
$sort_links ・・(省略)
default:
$sort_links ・・(省略)
}
return $sort_links;
}
(ソートのリンクボタンはあとで画像に置き換える)
方法?と同じくHTML書き出しのteble見出し箇所で、
echo generate_sort_links($sort)
ファンクションをセットして完成。
検索条件を維持したままソートができた!!
さらに、これだと検索条件を変更するとソート条件がリセットされるので、
ソート条件を維持したまま、さらにAND検索追加もできるようにするために・・
FORMタグ内最初の方でsortパラメータを受け取るようにして、
if (empty($_REQUEST[‘sort’]))
{
$sort = “”;
}
else
{
$sort = $_REQUEST[‘sort’];
echo’<input type=”hidden” name=”sort” value=”‘. $sort .'” />‘;
}
sortに値がある場合は、パラメータ送信するようにしてみる。
すると、ソート条件も検索条件も維持された!!
これで何してもOKだ
もちろんリセットボタンもつけておきます^0^
遠回りのおかげで、POSTとGETとテキストリンクでの実装についての勉強にもなったけど、
細かいデザインのこだわりで開発者が泣く理由も良くわかった・・
各パーツの仕様ごとに、
本当に重要なのか、多少の変更OKなレベルなのか、というのは
デザイナとプログラマはよく話しあっておくべきだ。
それによって質を落とさずに、工数をぐんと減らしたりできるもんだ。。
コメント