• 締切済み

[CakePHP] Paginatorのリンクが変

CakePHPのPaginatorを使ったページリンクが正しく出力されません。 1ページ目は正しく出力できていますが、2ページ目などに移動した際にURLがおかしくなります。 現状 1ページ目 http://www.example.com/hoge/2 ↓ 2ページ目 http://www.example.com/hoge/2/page:3 理想 1ページ目 http://www.example.com/hoge/2 ↓ 2ページ目 http://www.example.com/hoge/3 また、パラメータがついた場合も 1ページ目 http://www.example.com/hoge/2?hoge=hoge ↓ 2ページ目 http://www.example.com/hoge/3?hoge=hoge となるようにしたいのですが、何を間違えているのでしょうか。 ちなみにソースは以下のようになってます。 View/Hoge.php echo $this->Paginator->prev('< 前へ', array(), null, array('class' => 'prev disabled')); echo $this->Paginator->numbers(array('separator' => '')); echo $this->Paginator->next('次へ >', array(), null, array('class' => 'next disabled')); Config/routes.php Router::connect(     '/hoge/:page',     array(         'action' => 'hoge',     ),     array(         'pass' => array(             'page',         )     ) );

  • PHP
  • 回答数1
  • ありがとう数10

みんなの回答

  • foreach
  • ベストアンサー率51% (43/84)
回答No.1

いやいや、おかしくないですw > 2ページ目 > http://www.example.com/hoge/2/page:3 page:3はCakePHPで言うnamedパラメータと呼ばれるものです。 コントローラで$this->request->params['named'] をダンプすると表示されます。 このnamedパラメータはCakePHPでは良く出てきます。 > 理想 確かにRouterを駆使したら出来るかもしれないけど、ページネーションはページ数だけ維持するとは限りません。 Bakeしたソースだと一覧(index)で表のタイトルをクリックしたらそのカラムで並べ替え(昇順/降順)が可能で、その並べ替えの状態を維持してページングを維持してますが、ソート対象のカラムや並び順もnamedパラメータに乗せてページ遷移してるから状態維持できるんですよ。 次のページに行ったらID順に戻ってたらページングにならんでしょ? Routerに小細工するとそういうケースが出てきて行き詰まる要因になります。 やるとしてももうちょっと熟練されてからが良いかと。 > また、パラメータがついた場合も ?パラメータのことをQueryStringと言いますが、これはコントローラ側で設定します。 やり方は参考URLを参照してみて下さい。 > パラメータをクエリストリングで指定できるような設定もあるようだ。下記のようにparamTypeにquerystringを設定すると、「?page=2」のような指定で遷移した。 の箇所

参考URL:
http://j-caw.co.jp/blog/?p=264

関連するQ&A

  • CakePHP 1.3について

    CakePHPが初心者です。 Views-userdetail-index.ctpにて <?php echo $form->create(null,array('type'=>'get','action'=>'./updateRecord')); ?> ~ <?php echo $form->textarea("User.remarks", array("cols" => 22,"rows" => 2)); ?> ~ を記述し、userdetail_controllerにて function updateRecord(){ if (!empty($this->data)){ $this->User->id = 1; $this->User->saveField('remarks','exists'); } else { $this->User->id = 1; $this->User->saveField('remarks','empty'); } $this->redirect('.'); } を記述しています。 しかし、どうしても「!empty($this->data)」の判別によってemptyとなってしまいます。 User.remarksの部分をUserdetailにして色々ためしましたが、どうしても値の受け渡しがうまくいかないのです。 どなたかご教授を宜しくお願い致します。

    • ベストアンサー
    • PHP
  • cakephpでキーワード検索

    すみません。いろいろやってみたんですが 断念して、ここに投稿しました。 検索キーワードでページングするための方法がわかりません。 例)東京 寿司屋 このようにスペースで単語ごとに区切ります。 一文字だけは成功しましたが、スペースを空けて単語を読みとる 方法が浮かびません。 $keyword = mb_convert_kana($this->data["Hoge"]["keyword"],'rnask'); $keywords = preg_split("/[\s]+/",$keyword); $set = array(); $set = array( 'OR' => array( 'Hoge.name LIKE' => '%'.$keywords[0].'%', 'Hoge.prefecture LIKE' => '%'.$keywords[0].'%', 'Hoge.job LIKE' => '%'.$keywords[0].'%', ), //'OR' => array( //'Hoge.name LIKE' => '%'.$keywords[1].'%', //'Hoge.prefecture LIKE' => '%'.$keywords[1].'%', //'Hoge.job LIKE' => '%'.$keywords[1].'%', //), // コメントをはずしてみると、案の定エラーこきます。 'Hoge.cp_flag' => 1, ); $this->set("hogehoes",$this->paginate('Hoge',$set,null)); お願いします。どなたかお助け下さい。

    • ベストアンサー
    • PHP
  • cakePHPのエラー

    Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'validateSearch' at line 1 SQL Query: validateSearch Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp というエラーが出て困っています。 validateSearchの付近を確認してもよくわかりません。 searchpluginを使っているのですが、上手くいきません。 コントローラーは、 <?php App::uses('AppController', 'Controller'); class Mac554FoodDatasController extends AppController { public $name='Mac554FoodDatas'; public $components =array('Search.Prg'); public $presetVars=array(); public function beforeFilter() { //検索対象のフィールド設定代入 $this->presetVars = $this->Mac554FoodData->presetVars; // ページャ設定 $pager_numbers = array( 'before' => ' - ', 'after'=>' - ', 'modulus'=> 10, 'separator'=> ' ', 'class'=>'pagenumbers' ); $this->set('pager_numbers', $pager_numbers); } public function find() { $datas=$this->Mac554FoodData->find('all'); $this->set('datas',$datas); //検索条件設定 $this->Prg->commonProcess(); //検索条件取得 $tabe=$this->passedArgs; $conditions = $this->Mac554FoodData->parseCriteria['$tabe']; //ページャ関係 $this->paginate =array( 'conditions' => $conditions, 'limit' =>10 ); $this->set('Mac554FoodDatas',$this->paginate('Mac554FoodData')); // レイアウト関係 $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); // post時の処理 //$this->set('Mac554FoodDatas',$this->Mac554FoodData->find('all')); } public function index() { $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); //レイアウト } } ?> で、検索フォームはエレメントで <?php echo $this->Form->create('Mac554FoodData', array('url' => '/Mac554FoodDatas/find'))?> <fieldset> <legend>Search or Die!</legend> <dl> <dt><label>ユーザname</label></dt> <dd><?php echo $this->Form->input('name', array( 'type' => 'text', 'div' => false, 'label' => false))?></dd> <dt><label>time</label></dt> <dd><?php echo $this->Form->input('time', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> <dt><label>naiyoudao</label></dt> <dd><?php echo $this->Form->input('naiyoudao', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> </dl> <?php echo $this->Form->submit('検索',array('div'=>false,'escape'=>false))?> </fieldset> <?php echo $this->Form->end()?> のように作りました。 モデルは、 <?php class Mac554FoodDatas extends AppModel{ public $name=Mac554FoodData public $actsAs = array('Search.Searchable'); // 検索対象のフィルタ設定 public $filterArgs = array( array('name' => 'name', 'type' => 'value', 'field' => 'Mac554FoodData.name'), array('name' => 'time', 'type' => 'like', 'field' => 'Mac554FoodData.time'), array('name' => 'naiyoudao', 'type' => 'like', 'field' => 'Mac554FoodData.naiyoudao'), ); //検索対象のフィールド設定 public $presetVars = array( array('field' => 'name', 'type' => 'value'), array('field' => 'time', 'type' => 'value'), array('field' => 'naiyoudao', 'type' => 'value'), ); } という感じで作りました。 投げているSQL文を見ると、 SELECT `Mac554FoodData`.`id`, `Mac554FoodData`.`time`, `Mac554FoodData`.`name`, `Mac554FoodData`.`naiyoudao`, `Mac554FoodData`.`twinoid` FROM `mac554_foodlog`.`mac554_food_datas` AS `Mac554FoodData` WHERE 1 = 1 となっています。 よろしくお願い致します

    • ベストアンサー
    • PHP
  • ワードプレス固定ページのページングについて

    初めまして。WordPress・PHPの初心者で大変恐縮ではございますが、 ご質問させていただきます。 この度、固定ページに検索結果を表示し、その検索結果を件数指定し、 ページングを行いたいと考えています。 既にWordPress外では、実装でき正常動作を確認しているのですが、 WordPressの固定ページに組み込むと、2ページ目のリンク設定が 上手く行えておらず、誤動作してしまう状態です。 コードは同一ファイルに 【PHP】 if ($_POST["page"] !== "all") {    //取り出す最大レコード数    $lim = $_POST["page"];    //最初と最後のページ番号を定義    $first = 1;    $last = ceil ($num / $lim);        //表示するページ位置を取得    $p = intval ($temp_p);    if ($p < $first) {      $p = $first;    } elseif ($p > $last) {      $p = $last;    }    //表示するレコード位置を取得    $st = ($p - 1) * $lim;    //前後のページ移動数と表示数    //$page = 10 現在のページの前後10ページへのリンク番号を表示    //$page = 10 現在のページの前後10ページ目に移動    $page = 3;    //前後$pageページ移動した際のページ番号を取得    $prev = $p - $page;    $next = $p + $page;    //前後1ページ移動した際のページ番号を取得    $prev01 = $p - 1;    $next01 = $p + 1;    //$stから$lim件のデータを取得し、並べ替える    $sql .= " ORDER BY hoge LIMIT " . $st . "," . $lim . ";";    //ページ移動リンクの組み立て    //1ページ前のページ    if ($p > 1) {     $pagePrev = "<a href=\"$_SERVER[PHP_SELF]?p=$prev01\"><</a> ";    }    //各ページ番号への移動リンクを表示    for ($cnt = $p - $page; $cnt <= $last; $cnt++) {     if ($cnt < 1) {       $cnt = 1;     }     $pageNo = "<a href=\"$_SERVER[PHP_SELF]?p=$cnt\">$cnt</a> ";     //表示番号を指定数に区切る     //ページ番号と現在のページが同一の場合は     //リンク無しにする     if ($cnt <= $p + $page) {       if ($cnt == $p) {          $pageNo = $p;       }      }    }    //1ページ後のページ    if (($next01 - 1) * $lim < $reccnt) {       $pageNext = "<a href=\"$_SERVER[PHP_SELF]?p=$next01\">></a> ";    }    //最初のページへ移動    if ($p > 1) {       $pageFirst = "<a href=\"$_SERVER[PHP_SELF]?p=$first\">最初</a> ";    }    //前の$pageページへ移動    if ($p > $page) {       echo "<a href=\"$_SERVER[PHP_SELF]?p=$prev\"><<</a> ";    }    //次の$pageページへ移動    if (($next - 1) * $lim < $reccnt) {       echo "<a href=\"$_SERVER[PHP_SELF]?p=$next\">>></a> ";    }    //最後のページへ移動    if ($p < $last) {       $pageLast = "<a href=\"$_SERVER[PHP_SELF]?p=$last\">最後</a> ";    } } 【html】 <?php echo $pageFirst; echo $pagePrev; echo $pageNo; echo $pageNext; echo $pageLast; ?> としており、a href=\"$_SERVER[PHP_SELF]?p=$hoge が上手く行えて いないからだと自分では考えているので、hrefにこのファイルの指定や 私が思い当たる方法では試してみたのですが、やはり解決することはできませんでした。 説明が不十分で大変失礼かと思いますが、どういった原因が考えられるでしょうか? リンク以外の観点からも、アドバイスをいただければと考えております。 お力を貸していただければ大変嬉しく思います。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • cakephpのページネーションURLについて

    いつもお世話になっております。 ドメインを設定してサイトを作っており、 routes.phpの設定を Router::connect('/:action', array('controller' => 'controller名')); とコントローラーを含めて設定しており、↓のような形になるようにしております。 http://xxxxx.xx.xx/controller名/ → http://xxxx.com/ しかし、ページネーションの際に http://xxxx.com/controller名/action/page:番号 とURLにコントローラー名が出力されます。 コントローラー名が出力されないようにしたいのですが どうすればよろしいでしょうか?

    • ベストアンサー
    • PHP
  • openssl関数

    <?php $dn = array( 'countryName' => 'JP' ,'stateOrProvinceName' => 'Tokyo' ,'localityName' => 'Shibuyaku' ,'organizationName' => 'HOGE' ,'organizationalUnitName' => 'hogehoge' ,'commonName' => 'example.com' ,'emailAddress' => 'hoge@example.com' ); $pkeypass = '1234'; $numofdays = 365; $pkey = openssl_pkey_new(); $csr = openssl_csr_new($dn, $pkey); $sscert = openssl_csr_sign($csr, null, $pkey, $numofdays); $publickey = null; $privatekey = null; $csrStr = null; openssl_x509_export($sscert, $publickey); openssl_pkey_export($pkey,$privatekey,$pkeypass); openssl_csr_export($csr, $csrStr); echo $publickey; // 公開鍵 echo $privatekey; // 秘密鍵 echo $csrStr; // CSR 上記のプログラムで生成される公開鍵と秘密鍵は乱数的に生成されているのでしょうか? あと $pkeypass = '1234'; と echo $csrStr; の部分がどういった理由で記述されているのかイマイチわかりません。。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 配列名や変数の一部として変数(文字列)を使う方法?

    PHPを勉強し始めたばかりの者です。以下のような状態で、 配列の要素(例「へべれけ」)を出力したいのですが、 どうもうまく行きません。どうかアドバイスをいただけませんでしょうか? <?php $arDrunk = array("ほろ酔い","へべれけ","記憶なし"); $status = array("Sleepy","Drunk","Hungry"); $ref = $status[1]; //Drunk $hoge = "ar$ref"; //arDrunkと入れているつもりです。 // ↓print_rではちゃんと全ての要素が閲覧できるのに echo "<pre>"; print_r($$hoge); echo "</pre>"; // ↓では何も出力されません。 echo $$hoge[1]; // $arrayDrunk[1]、つまり「へべれけ」を出したい。 echo '$$hoge[$i]という形では使えないのでしょうか?' ?> もしかして$$hogeを処理するための、JavaScriptでの evalのようなものがあるのでしょうか?

    • ベストアンサー
    • PHP
  • cakephpで$paginatorにつけたいセッションID

    先人たちへ、どうかお助け下さい。 会員制の携帯サイトを製作中です。 URLの後ろにセッションIDを持たせたまま $paginatorでページ送りをしたいんですが そのページリンクにはセッションIDが付加されていないため クリックすると当然ログアウトになります。 単純に$paginatorのリンクの後ろにIDを付加させて 表示させたいんですが、うまくいきませんでした。 マニュアルに書いてあることは $paginator->options(array('url' => $this->passedArgs)); これでは、http://hoge.com/aaa/ここに入る/:2 こうでなくて、 http://hoge.com/aaa//:2?ここに入れたい。 独自のヘルパー作るしかないのでしょうか? なんか、簡単にいける方法があったらお知恵を 分けて下さい。 宜しくお願いします。

    • 締切済み
    • PHP
  • 配列のループ展開

    下記で配列内を検索しても、「存在しません」になります。 どこが、間違っているのでしょうか? <?php for($i = 1; $i <= 42; $i++) { $seminar = "http://www.hoge.com/hoge/".sprintf("%04d", $i).".html"; echo $seminar; } $url = array( $seminar ); $myUrl = "http://www.hoge.com/hoge/0020.html"; if(in_array($myUrl, $url)){ echo "配列に".$myUrl."は存在します。"; } else { echo "配列に".$myUrl."は存在しません。"; } ?>

    • ベストアンサー
    • PHP
  • str_replaceがうまくいきません

    Dust-Me Selectorsを使い、使用していないCSSセレクタを探したところ、930件ほど出てきました。 私のサイトはCSSはstyle.css一つにまとめています。doctype.cssの内部は .class1,.class2{…}.class1,.class3,.class4{…},… の形で一行のみ記述されています。 使われていないCSSセレクタは、used-doctype.txt中に、 .class1 .class3 .class4 : : の形で記述されています。.今、次のPHPコードを実行しようと思います。 <?php $css=file_get_contents("./doctype.css"); $handle = fopen( "./used-doctype.txt", "r" ); $null=""; while ($array = fgetcsv( $handle )) { //echo $array[0]; str_replace($array[0],$null, $css); } echo $css; ?> しかしechoされた結果では、class1、class3、class4がいずれも確認されます。 while中での$array[0]のechoは成功していますので、str_replaceがおかしいと思うのですが原因が判りません。 どこを変更すれば、$cssからclass1、class3などを除去できるでしょうか。 どなたかご教示のほど、どうかよろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう