こんなエラーが!要はセッションデータがないので$data['criteria']がワカンネーヨ!ということなので、初期化することにしました。
Controller
$data['criteria'] = array('nc'=>'', 'oc'=>'');
これで一応は大丈夫なのですが、配列のキーを指定してやらなければならないところがちょっと自分的には気に入らないっつーか、なんか他にどうにかならないもんですかねぇ?
それはさておき、前回は旧市町村名で検索できるようにしたわけですが、ついで?に都道府県名でも検索できるようにしたいとおもいます。
View
都道府県:<?=form_input('condition[pref]', $criteria['pref'])?><br />
Controller
$data['criteria'] = array('pref'=>'', 'nc'=>'', 'oc'=>'');
これだけで動きます(^^)v が、↑の初期化コードさえなくなれば、formにテキストフィールド作っただけでOKだったのにな…。
まあ当初の状態よりかなりマシになってきたので、↑の問題はおいおい考えることとして、今回はDropDownFieldを作ります。
で、DropDownFieldってなんぞ?なんですが、ユーザガイドにそう書いてあったのであえて使ってます。これって一般名称ないんですかね?PullDownList?DropDownMenu?PullDownMenu?なんかわかんないけどそんな感じのやつです。要するにselectとoption羅列みたいな…。
んでGUI部品だけ作ってもしょうーもないんで、1ページの表示件数をユーザが選択できるようにしてみたいとおもいます。ユーザガイドによると…
form_dropdown(名前, 選択項目リスト, 選択済み項目, javascript)
みたいな感じらしいので、とりあえずViewに
<?=form_open('gappei/changeDispNumber')?>
<?=form_dropdown('dispnum', $dnOptions, $dnSelect, 'onChange="submit();"');?>
<noscript><?=form_submit('changeDisp', '変更')?></noscript>
</form>
新たなformとして作成します。formの送信先?はchangeDispNumberというメソッドを呼ぼうって魂胆です(^^;一応javascriptで選択されたらサブミットという動きにしましたが、非javascript環境も考慮して<noscript>タグにサブミットボタンを配置しました。
で、Controllerを作る前に悩んだんですが、結局この表示件数というパラメータもどこかに保存しておかないと、検索の時に散々悩んだ検索条件の保存と同じような現象(つまり選択された直後はその表示件数になっても、ページングリンクとか検索サブミットがなされた瞬間リセットされてしまう)が起きるだろうということです。
んで、検索条件はPHPのセッション機構でやりましたが、この表示件数というパラメータを考えたときに、セッションよりもクッキーの方が向いてる?というかユーザ側で保存(しかも比較的長期)した方がいいんじゃないの?と考えました。実際多くの検索エンジンはそうなってると思います。
というわけでCodeIgniterのcookieヘルパーをざっと調べて、ほとんどPHPの組込だな!とかおもって、おもむろにController
$this->load->helper('cookie');
まずヘルパーロード。これはコンストラクタの中に。そして新しいメソッド…
function changeDispNumber()
{
set_cookie('dispnum', $this->input->post('dispnum'), Gappei::COOKIE_LIFE);
redirect('gappei/index/');
}
このメソッドは表示件数のDropDownFieldが選択されると呼び出されcookieにその値を保存します。COOKIE_LIFEはclassの上のほうで
const COOKIE_LIFE = 2592000;
のように定義しました。果たしてこんなところに書いていいのかどうかは毎度のことながら不明(不安)。
んで、後はindex()の方にcookie読み出しと選択項目リストを定義します。
//表示件数取得
$data['dnSelect'] = (get_cookie('dispnum') <> '') ? get_cookie('dispnum') : 10;
デフォルトは10件ということになります。そしてリスト…
//表示件数メニューオプション
$data['dnOptions'] = array('10'=>'10',
'20'=>'20',
'30'=>'30',
'50'=>'50',
'100'=>'100'
);
表示結果
上の方はDropDownFieldで20件を選択した様子です。データもきちんと20件表示されています(画面ではわかりませんが)。んで下のHTMLソースみたいなものはページングリンクの部分です。見てのとおり20件毎にリンクが生成されているのがわかるとおもいます。
ラベル:codeigniter