2007年11月15日

CodeIgniter:function search()の作成

前回なんとか検索結果をページングするところまで辿り付きましたが、セッションを利用すればいいということがわかったのもつかの間、また落とし穴がありました(--;。

前回のスクリプトで例えば「市」と検索します。検索結果が10件表示されます。ページングもバッチリOKです。次に「町」と検索します。これも検索結果表示・ページングともOKです。次にリセットしようとおもい、テキストフィールドの「町」の文字を消去してサブミットします。あうあう(--; なんと「町」で検索されちゃってます。

この動作はうまくない。まあテキストフィールドが一個の場合はこれでもいいような気もしますが、この後旧市町村とか都道府県とか検索フィールドが複数になってくると、もはやこれではアレな気がします。

ちなみにここのBlogの右上にある検索フィールドで同じようにフィールドを空欄にしてサブミットしてみました。あうあう(--; 以前の検索語句が検索されるようなことはありませんでしたが、レイアウトが…。こんなんでいいのか?>seesaaさん

まあ他人のことをとやかく言う前に自分の方をなんとかしましょう。ということで問題点を考えてみます。
$newcity = $this->input->post('newcity');
if ($newcity <> "")
{
$this->phpsession->save('newcity', $newcity);
}

前回のこの部分のコード、つまりpostデータを調べて空でなければセッションデータに格納しているところです。

空のpostがサブミットされた(なんか言い回しおかしい?)場合は、上記のif文によってセッションデータには格納されません。なので次行で検索語句をセッションから読み取っている部分では、以前の検索語句が読み取られてしまい、上述のような結果になってしまったわけです。

ではpostの有無に関わらず(つまり空の場合でも)セッションデータに格納してしまえばいいのか?というとそういうわけにもいきません。

何故なら最初に検索語句をサブミットされた時点ではそれでもよいのですが、次にページングリンクをクリックされた時にはpostデータは空なわけですから、if文がないと空のデータがセッションデータに格納され、次行でそれを読み出されて…結局ページングのためにセッション使ってる意味ないじゃん!な状態になってしまうわけです(--;

ではどうすればいいか?ここで問題をもう少し整理すると…
  • 最初に検索語句がサブミットされた場合は、postデータがあるので、セッションデータに格納され、それを読み出して正常に動作します。

  • この状態でページングリンクをクリックすると、postデータは空なので、セッションデータには格納されず、以前のセッションデータを読み出して正常に動作します。

  • 空のpostデータがサブミットされた場合は、postデータが空なので、セッションデータには格納されず、以前のセッションデータを読み出してしまいます。これは期待された動作ではありません。


この3番目の場合は空のpostデータをセッションデータに格納して欲しいわけです。ですがプログラム側ではpostが空かどうかだけで判断しているので、ページングリンクをクリックした結果postが空なのか、空のデータをサブミットした結果postが空なのかわかりません。

ということはpostの有無で判断するのではなく、サブミットの有無(サブミットボタンが押された場合)で判断すればうまくいきそうです。といってもif (submit_button = true)なんて書けません。そこでそもそもサブミットされた時には何が起きているか見てみます。

VIEW
form_open('gappei/index')

VIEWにこのように書いてあります、これはformヘルパーを使っていますが最終的に出力されるHTMLでは
<form action="http://localhost/codeigniter/index.php/gappei/index" method="post">

つまりCodeIgniterのルーティング機能によって?GappeiクラスのIndex()メソッドが呼ばれているわけです。

ということはGappeiクラスに別のメソッド(例えばsearch())を作ってそのメソッドを呼び出すようにしてやれば、サブミットボタンが押された場合と、ページングリンクがクリックされた場合(この場合はindex()を呼び出す)とを分けることができそうです。

というわけで…
function search()
{
$this->phpsession->save('newcity', $this->input->post('newcity'));
$this->index();
}

まず↑の方に書いたpostの有無を調べてセッションデータに格納している部分を消去します。そして新たにsearch()というメソッドを作り、そちらにセッションデータに格納のコードを書きます、ただし今度はpostの有無は調べずに空だろうとなんだろうとセッションデータに格納します。んで表示しなきゃなんないのでindex()を呼び出します。

VIEWの方も
form_open('test/index') //これを↓のように…
form_open('test/search') //に書換え

あと前回のコードではライブラリをロードするコードをindex()の中に書いていたので、それをコンストラクタの中に書くようにします。
class Gappei extends Controller {
function Gappei()
{
parent::controller();
$this->load->library('phpsession');
$this->load->helper('form');
}

というわけでブラウザで確認。「市」で検索してみる。検索結果・ページングOK。「町」で検索してみる。検索結果・ページングOK。んでフィールドを消去してサブミット。全件表示!(フィルタリングなし)ということで一応できあがり。

ちなみに↑のsearch()の中で$this->index()とやっている部分は、なんとなくダサかったっつーか、それなりの機能があるってことで
URLヘルパーをロードして
$this->load->helper('url');

リダイレクトしてやります
redirect('gappei/index/');

これでOK!
ラベル:codeigniter
posted by ciallost at 17:00| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック