[CakePHP] PagenatorのURLをGETな感じに変更したい

CakePHPのPagenationの便利さに感動したのも束の間、URL見て我が目を疑う。

http://example.com/news/page:3/sort:id/direction:asc

なにこれ!(゚Д゚lll) なんでコロン!?
世のCake使いのみなさんはこのURL気持ち悪くないんだろうか?

普通にアンバサンドとイコールで繋げてあるやつがいいんだけど…

http://example.com/news/?page=3&sort=id&direction=asc

検索しても根本的な解決方法が見つからないまま朝日を拝む始末…(今6時)

試しに後者のURLを打ち込んでみたら同じ動作になったから、
アンバサンドとイコールのURLでもソートやページングは機能するらしかった。
なら変更も出来るのじゃないかと検索していたら、変更した場合の問題についてのレスが見つかる。

18 :nobodyさん[sage]:2010/07/23(金) 23:42:12 ID:???
cakephpって普通にgetパラメーター使うのって非推奨?
標準ページングのURLが気持ち悪くて、/hogeとか/hoge?page=2にしてみて、
/hogeをキャッシュしようと思ったら/hoge?page=2も同じページと見なされちゃうっぽいんだけど
19 :nobodyさん[sage]:2010/07/24(土) 00:57:52 ID:???
>>18
そこなんだよね。
cakeのpage:2 形式だとクエリストリングにスラッシュとか入った時におかしくなるし、
?page=2にしたらキャッシュしてくんないし。俺はキャッシュの方をあきらめたけど。
20 :nobodyさん[sage]:2010/07/24(土) 01:38:30 ID:???
/key=val/key2=val2/
にかえるのでよければ簡単にできる。

あとキャッシュは自前でクラス使うのもそれほど苦じゃないかと
21 :nobodyさん[sage]:2010/07/24(土) 04:31:49 ID:???
ま、素のPHPで書けばそもそもキャッシュ無いしな。
キャッシュの恩恵が受けられるサイトの場合、鯖で対策するだろうし。

キャッシュが効かないとはこれいかに…

35 :nobodyさん:2010/07/25(日) 04:37:05 ID:???
批判というか意見だけど、URLパラメーターの切替が出来たらいいな。
/contoroller/action/1 や /contoroller/action/id:1
みたいな形はSEO的に良いかもしれないけど、少しわかりづらい。
従来のように
/contoroller/action/?id=1 とか /contoroller/action?id=1
でも良いと思う。
37 :nobodyさん:2010/07/25(日) 13:46:57 ID:???
>>35
スタティックなページだと、smart URLの方がいいと思うんだけど、
ページングとかのダイナミックなページは従来のURLの方がいいと思う

× /archive?id=1
○ /archive/id:1
○ /archive?page=2
× /archive/page:2

というわけで俺も両方使えた方がいいと思うけど、
従来のURLを切り捨てて実装している機能が多いから無理だろうなあ
前スレに出ていたキャッシュとかもそうだけど。

38 :nobodyさん:2010/07/25(日) 16:16:20 ID:???
named使いにくいと思ってたの、俺だけじゃなかったんだ

Cake標準のページネーション使うと、
named使わなきゃならないんだよね。

検索フォーム作るとき、
POSTのときと、namedのときで処理を変えなきゃいけないのが面倒・・・

Paginatorヘルパー拡張して、page=1みたいなURL吐くようにすればいいのかな?

39 :nobodyさん:2010/07/25(日) 16:33:37 ID:???
>>38
おれはいっそのこと、$_POSTとか$_GETとかそのまま受け取るようにしてるよ。
namedから呼び出していたら使い勝手悪いし。

40 :nobodyさん:2010/07/25(日) 20:37:53 ID:???
>>39
2ページ目以降はどうするの?

41 :nobodyさん:2010/07/25(日) 20:49:24 ID:???
>>40
if ($_GET[“page” > 1]) {
$page = $_GET[“page”];
} else {
$page = 1;
}

こんな感じでページネーションに渡せば良くないか?

42 :nobodyさん:2010/07/25(日) 20:50:32 ID:???
1行目が変だった・・・
if ($_GET[“page”] > 1) {

ま、整数のみ許可するとかもう少し処理入れるべきだろうが。

43 :nobodyさん:2010/07/25(日) 21:03:34 ID:???
なにそのうんこソース

44 :nobodyさん:2010/07/25(日) 21:04:58 ID:???
$page = empty($_GET[‘page’]) ? 1 : $_GET[‘page’];

46 :nobodyさん:2010/07/25(日) 21:33:12 ID:???
namedで来るのはそのまま使って後ろに ?query=eroero とか付ければいいだけじゃ。

47 :nobodyさん:2010/07/25(日) 21:44:55 ID:???
>>46
そんな気持ち悪いURLいやだろ

標準URLが気持ち悪いと思ったの私だけじゃなかったようで安心した。
しかしGET形式にしたら検索実装でまた困るというのが分かった。

724 :nobodyさん:2010/09/29(水) 18:00:24 ID:???
いまだにページングのときのパラメータの持ち回り方のベストプラクティスがわからない。

そもそも、コロン区切りパラメータってのが、なんか気持ち悪いんだよなぁ・・・
普通にGETでいいのに。

725 :nobodyさん:2010/09/29(水) 18:09:44 ID:???
>>724
namedパラメータの後に?xxx=yyy 形式が俺の中ではベストかと。
まあURLがちょっとあれだけど。
paginatorで無理しなくてそのまま使えるし、
検索キーワードなどでnamedで通せないものもgetのパラメーターで通せるし。

726 :725:2010/09/29(水) 18:19:31 ID:???
ただ弱点はキャッシュの扱いに参ること。
Getのパラメーター部分がキャッシュのファイル名に入ってくれないからキャッシュ生成が無理。

別の話だけど、Searchプラグインなんかだと、packで文字列生成してnamedパラメーターを通すようにしてるけど
これだと本当にURLが意味不明の文字になってしまうから使いどころにはちょっと悩むね。

727 :724:2010/09/30(木) 05:53:30 ID:???
>>namedパラメータの後に?xxx=yyy 形式
それはさすがに気持ち悪いなぁ。

かといって、検索条件をセッションに入れちゃうと、
たとえばカテゴリ別のリンクとかが作れなくなっちゃうし・・・

あと、複数カテゴリを指定しての検索とかってよくあると思うけど、
namedは配列を扱えないらしい。
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1925&forum=3

うーん、悩む・・・

GETが通るならリンクがそういう感じにすればいいよね、って思って試しに
Vewの$paginator->prevとかで出力されるURLを変更する記事 Changing CakePHP pagination URLs を参考にしてpage:を削ってみたら

http://example.com/news/3/sort:id/direction:asc

に変更できたのだけど、2ページ目以降に進んだ時に番号が重なったりしたので正規表現にしてみた。

view/helpers/common.php

class commonHelper extends AppHelper
{
	function convert_pagenate_link($str){

		$regex = "/(".$this->params["controller"].")\/(?:page\:(\d+)|\d+)(?:\/page\:(\d+))*/i";
		
		return preg_replace($regex,'$1/$2$3',$str);
	}
}

view/news/index.ctp

<?php echo $common->convert_pagenate_link( $paginator->sort('ID', 'id')) ?>

<?php echo $common->convert_pagenate_link($paginator->prev('« Previous ', null, null, array('class' => 'disabled'))); ?>

<?php echo $common->convert_pagenate_link($paginator->numbers());?>

<?php echo $common->convert_pagenate_link($paginator->next(' Next »', null, null, array('class' => 'disabled'))); ?> 

この手法でがっつり置換しちゃえば表向きはGETライクなURLに出来そうではある。
でもレス読んだ感じではデフォルトのまま使う方がいい気がする。
Ajaxバリバリにしてページ遷移そのものをさせないという手もあるが…。うーん。

Leave a Comment.