😊
CodeIgniter URIパスとセグメントをごにょる
こんなバグがあった
画面概要
-
検索フォーム付きの一覧画面がある。
-
仮にこのページのURLを「/seach/list」とする。
-
このページのページネーション用パラメータは
/seach/list/2
/seach/list/3
というふうに後ろにつく。 -
検索用パラメータはセッションに保存している。
-
検索フォームにはこのようなリセットボタンがある。
reset.html
<button type="button" onclick="location.href='http://localhost/seach/list'">reset</button>
viewのソースは
reset_v.php
<button type="button" onclick="location.href='<?= base_url() . uri_string() ?>'">reset</button>
こんな感じ。
- GET/POST両パラメータが何もない時に検索用セッションをクリアする。
何が起きたか
概要を見て「ん?」て思う人もいるでしょう、
2ページ目以降でリセットボタンが効かない!
効かない!効かない!何回クリックしても効かない!テストしろよ!
改善策
ページネーション用パラメータ消せばいいじゃん
まあそうなんですが、どうやって消そうか。
パスの最後の「/」より前が数値だったらそこ消そうか、is_numeric()使ったらいける。
いや、なんかそれはダサいぞ。
で
URIのセグメントというものにたどり着く。(これがかっこいいかは不明)
僕が説明するよりHPを見た方がわかりやすいと思う。
軽量PHPフレームワーク 'CodeIgniter' 徹底ガイド!:CI_URI
こうなった
reset_v_fix.php
<button type="button" onclick="location.href='<?= base_url() . ($this->uri->segment(3) ? str_replace($this->uri->slash_segment(3, 'leading'), '', uri_string()) : uri_string()) ?>'">reset</button>
第3セグメントが存在する場合はuri_string()から「/ + 第3セグメント」を消す。
ええ。それだけです。
Discussion