CakePHPを使って簡単な掲示板を作っています。バージョンは1.1.18です。

ページングの機能を実装したいと思い、PEAR::Pagerをapp/vendorsディレクトリにコピーし、それをコンポーネント化するという方法で実装しました。「CakePHPガイドブック」(http://www.amazon.co.jp/dp/4839924317)に書いてある方法をそのまま真似しました。
ページング機能自体は無事実装できたのですが、ページングで推移した後のURLパスが思うように表示されず、困っています。例えば
http://www.example.com/posts/
で投稿が一覧表示(pagerで10件ずつ表示に設定されているとします)されているとします。そこでPagerによって生成された「次の10件」リンクをクリックすると、画面推移した後のアドレスが
http://www.example.com/app/webroot/posts/index/2
のようになってしまうのです。本当は
http://www.example.com/posts/index/2
のように、絶対パスではなく相対パスで表示されてほしいと思っています。
PEAR::PagerもCakePHPも、おおまかな仕組みくらいは分かっているのですが、ソースを読んで理解できるほどPHP自体を習得しきれていません。どうすれば解決できるか、あるいはアドバイスやコメント等ありましたら、ぜひお教えください!よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/05/30 16:29:49
  • 終了:2008/06/04 01:53:04

回答(1件)

id:kemworld No.1

kemworld回答回数62ベストアンサー獲得回数12008/05/31 00:55:47

ポイント60pt

えーとほんとの原因をずばり言い当てるにはそれこそソースを公開してもらわないことには無理だと思いますが、


内容から察するに、

ページングリンクのURL生成する部分の指定が間違っている、ということではないかと。

・その部分に指定している定数が間違っている(なんかちょっと違う定数をいれちゃっているとか)。

・もしくは定数の定義自体が間違っている(たぶん最初にパスの設定とか自分でやりますよねcakephpって)。


推測でしか言えませんがとりあえずこんなところで、原因究明がんばってください♪

id:mine-D

ありがとうございます。ぐああ!やはり簡単にはいかないようですね。でもがんばります。

仕方がないのでCakePHPのフォーラムの方にも投げてみたいと思います。感謝です。

2008/06/04 01:52:06
  • id:KeyKey
    PEAR::Pagerのオプションでパスも指定できるので、それを使ってはどうでしょうか?

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

    $path = sprintf("/%s/%s/", $this->controller->params['controller'], $this->controller->params['action']);
    $baseOptions = array(
    ・・・
    'path' => $path,
    'fileName' => '%d',
    ・・・
    );
  • id:mine-D
    KeyKeyさん、コメントありがとうございます!

    $path = sprintfの行は「CakePHPガイドブック」の方法とまったく同じですね。アドバイス通り、$baseOptionsに
    'path' => $path,
    'fileName' => '%d',
    を指定してみました。すると

    http://www.example.com/posts/index/%d/2

    となって、おかげさまで「app/webroot/」表記は消えたのですが、%dがそのまま表示され「Bad Request」になってしまいました。うーむ。これはbaseOptionsでappendをfalseにしているから、との事なんですが、ではどうすればいいんだろう?そもそもfileNameってなんじゃ…?という感じになっています。

    引き続き調べてみますね。コメントいただき、非常に感謝しております!
  • id:mine-D
    KeyKeyさん、いけました!

    きちんと確認していなかったのが悪かったのですが、アドバイスいただいた以下のコード
    $path = sprintf("/%s/%s/", $this->controller->params['controller'], $this->controller->params['action']);

    ではなく、
    $path = sprintf("/%s/%s/%%d", $this->controller->params['controller'], $this->controller->params['action']);

    のようによけいな「%d」が入っていたせいでした。頭抱えていたので、大感謝です!
    本当にありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません