Pagination クラスを POST メソッドで利用するには

1,459 views
Skip to first unread message

Sotaro OMURA

unread,
Oct 15, 2012, 9:39:15 PM10/15/12
to fuelp...@googlegroups.com
大村です。

現在作成中のアプリケーションで、かなり巨大なクエリを持ち回しながらページ処理を
行う必要があり、PEAR の Pager を参考にして、POST メソッドを利用できるように
Pagination クラスを拡張子、Pull Request を送ってみたのですが、

https://github.com/fuel/core/pull/1168/files

速攻却下されてしまいました。笑。

Pagination は GET メソッドで利用するべき、という考え方は理解できますし、できれ
ばそうしたいのですが、なにせ、数十万件のデータに対し、数万件のIDをクエリとして
持ち回すような処理が発生するため、GET メソッドでは実現不可能です。

PEAR の Pager には、POST mode があり、別のアプリケーションでは、それを利用
したことがあったため、同じように利用できればいいなと思っています。

http://pear.php.net/manual/en/package.html.pager.factory.php

本家のフォーラムでも議論したいのですが、一旦、得意な日本語で、議論して、一度
考え方を整理したいと思っています。

なにかいいアイディアありますか?

--
Sotaro OMURA
http://omoon.org/

omoon

unread,
Oct 15, 2012, 9:42:33 PM10/15/12
to fuelp...@googlegroups.com
大村です。

捕捉ですが、ここに、


$_SESSIONで持ち回せば、みたいなアイディアがありました。

どう思われますか?

2012年10月16日火曜日 10時39分20秒 UTC+9 omoon:

Fumito Mizuno

unread,
Oct 15, 2012, 10:16:31 PM10/15/12
to fuelp...@googlegroups.com
水野です。

単純なjavascriptよりは、ajaxにすれば良いのではないでしょうか。


「クエリが長いので仕方なくPOSTを使う」
よりは
「ajaxならページ遷移しないで表示を変えられる」
という理由のほうが、pull requestに対応してもらいやすい、と思います。




2012/10/16 omoon <omo...@gmail.com>:
--
Fumito MIZUNO
Standing on the Shoulder of Linus
http://ounziw.com/

Sotaro OMURA

unread,
Oct 16, 2012, 2:01:54 AM10/16/12
to fuelp...@googlegroups.com
大村です。

なるほど。
ajax を利用する、というのもひとつのアイディアですね。

ただ、今回は、単純にGETメソッドをPOSTに変更することの是非について
ご意見を聞けるといいなあ、と思っています。

> 「クエリが長いので仕方なくPOSTを使う」
> よりは
> 「ajaxならページ遷移しないで表示を変えられる」
> という理由のほうが、pull requestに対応してもらいやすい、と思います。

この際、もう、Pull Request 受け取ってもらえるかはどうでも良くなっていましてw、
実際みなさんならどう実装するかが聞いてみたいです。

先ほど捕捉で投げたSESSION利用は、リクエストの容量も減るので、
良いアイディアなのではないか、と思い始めています。

Kenji Suzuki

unread,
Oct 16, 2012, 2:03:55 AM10/16/12
to fuelp...@googlegroups.com
Kenji です。


On Mon, 15 Oct 2012 18:42:33 -0700 (PDT)
omoon <omo...@gmail.com> wrote:

> 大村です。
>
> 捕捉ですが、ここに、
>
> http://www.codingforums.com/showthread.php?t=205002
>
> $_SESSIONで持ち回せば、みたいなアイディアがありました。
>
> どう思われますか?

このケース、私には、何故、数万件の ID をページネーションで持ち回さないと
いけないのかよくわからないです。

また、ページネーションでどうしても持ち回らないといけないデータでない限り
そんなでかいものはサーバサイドのセッションに保存するのはもっともだと
思います。

ようするにそれは Pagination クラスがやる必要がある処理なのか?という点から
説得力がない気がします。

> Also this is javascript behaviour for html output in a PHP framework.
> I'm not liking this at all.

に答えられていない気がします。


// Kenji

Sotaro OMURA

unread,
Oct 16, 2012, 2:21:00 AM10/16/12
to fuelp...@googlegroups.com
大村です。

Kenji さん、どうもありがとうございます。

> このケース、私には、何故、数万件の ID をページネーションで持ち回さないと
> いけないのかよくわからないです。

アプリケーションの特性上、検索条件を指定するフォームのtextareaに数千~数万
行のIDを入力できる箇所があります。

例えば、ユーザが別ファイルで持っているエクセルのID列をコピーしてフォーム
に貼り付けて検索できる、というような利用局面を想定しています。

1ページ目が表示されたあと、ページ替えのタイミングで条件の変更や追加などが
発生することもあり、ページネーションを行う際に、その都度、そのフォームの
条件をPOSTする、というようなしくみをとっています。

上手く説明できてるでしょうか。。

> また、ページネーションでどうしても持ち回らないといけないデータでない限り
> そんなでかいものはサーバサイドのセッションに保存するのはもっともだと
> 思います。


どうしても持ち回らないと行けないデータだと僕自身は考えていますが、
アプリの構成を見直すことで、セッションに保存する形に変更することも可能かも
しれません。

そんな状況です。

Kenji Suzuki

unread,
Oct 16, 2012, 2:47:44 AM10/16/12
to fuelp...@googlegroups.com
Kenji です。


On Tue, 16 Oct 2012 15:21:00 +0900
Sotaro OMURA <omo...@gmail.com> wrote:

> 大村です。
>
> Kenji さん、どうもありがとうございます。
>
> > このケース、私には、何故、数万件の ID をページネーションで持ち回さないと
> > いけないのかよくわからないです。
>
> アプリケーションの特性上、検索条件を指定するフォームのtextareaに数千~数万
> 行のIDを入力できる箇所があります。
>
> 例えば、ユーザが別ファイルで持っているエクセルのID列をコピーしてフォーム
> に貼り付けて検索できる、というような利用局面を想定しています。
>
> 1ページ目が表示されたあと、ページ替えのタイミングで条件の変更や追加などが
> 発生することもあり、ページネーションを行う際に、その都度、そのフォームの
> 条件をPOSTする、というようなしくみをとっています。
>
> 上手く説明できてるでしょうか。。

どういう状況かはわかりましたが、それが本当に必要なことなのかは情報不足で判断
できないですね。まあ、私が判断する必要もないわけですが (w

検索条件が変われば、検索結果のページ数も変わる可能性があると思いますが、
それは気にしなくていいのでしょうか。


> > また、ページネーションでどうしても持ち回らないといけないデータでない限り
> > そんなでかいものはサーバサイドのセッションに保存するのはもっともだと
> > 思います。
>
>
> どうしても持ち回らないと行けないデータだと僕自身は考えていますが、
> アプリの構成を見直すことで、セッションに保存する形に変更することも可能かも
> しれません。
>
> そんな状況です。

Pagination については、以下のチケットがあり、refactor される予定であり
HTML は入れないみたいなことにかなり以前からなってます。

https://github.com/fuel/core/issues/601

そして、http://fuelphp.com/roadmap には、

Refactor Pagination
Remove all application specific code from the current Pagination class,
and replace it by callbacks and app templates

と記載されています。


しかし、この状態がずっと続いてますが、2.0 の Pagination クラスはまだない
わけで微妙な状態が続いてしまってます。

ということで、1.x の Pagination に手を入れるにしても、そういう方向性かなぁ
と思います。まあ、結構難しいというか...

ただ、今のクラスは、POST にできなかったり、クエリ文字列にできなかったり、
柔軟性がないのは事実ですね。


// Kenji

Sotaro OMURA

unread,
Oct 16, 2012, 4:18:50 AM10/16/12
to fuelp...@googlegroups.com
大村です

> 検索条件が変われば、検索結果のページ数も変わる可能性があると思いますが、
> それは気にしなくていいのでしょうか。


慣習的に、上記を許容する作りになってしまっています。
でも、よく考えるとその辺を整理すると、セッションへ値を追いやる形に
移行できるかも知れませんね。ご指摘ありがとうございます。

本件については、今のところ、coreのpaginationクラスを自分で拡張して対応しています。
ちなみに、この記事↓がとても参考になりました。
http://blog.godvalley.me/archives/473

現状と、2.0へ向けての状況についても非常に良く理解できました。
これを機に、もう少し本家の情報をしっかりとウォッチして行こうと思いました。

Le Hung

unread,
Sep 20, 2017, 11:22:37 PM9/20/17
to fuelphp.jp
レフンです。自分も同じ問題が発生しました。上記の参考しましたので、簡単解決方法まとめます。

Thank you for giving some ideas above. I used GET + SESSION with json_encode data instead of POST for keep form status as query .

Summary:
1. Save POST to SESSION 
2. Check SESSION & GET for pagination

Sample code
// POST
...
$data['query'] = base64_encode(json_encode((string) $query, JSON_HEX_QUOT|JSON_FORCE_OBJECT));
Session::set('SESSION_PAGINATION_DATA', $data['query']);
...

// GET
...
$sql = Session::get('SESSION_PAGINATION_DATA');
$sql = json_decode(html_entity_decode(base64_decode($sql)), true);
...




 
 
Reply all
Reply to author
Forward
0 new messages