2

ルート設定では、カスタムルートのみを使用します。うまく機能する前に、ページ付けに問題があります。

ルート:

// view all posts by year and month
Router::connect('/blog/:year/:month/*', array(
 'controller' => 'posts',
 'action' => 'index',
 'month' => null
), array(
  'pass' => array(
    'year',
    'month'
  ),
  'year' => '[12][0-9]{3}',
  'month' => '0[1-9]|1[012]'
));

これにより、次のようになります。/ blog / 2012 /は、2012年のすべての投稿を一覧表示する必要がありますが、月は関係ありません。/ blog / 2012/05 /は、2012年5月以降のすべての投稿を一覧表示する必要があります。/ blog / 2012/05 / page:2を使用するために、最後に/*を追加しました。これは現在正常に機能しています。ただし、/ blog / 2012 / page:2は機能せず、page:2は月と見なされ、正規表現が一致しないため、''に変換されるため、データベースクエリは月''を検索します。

おそらく、ルーティングと、渡すことができる変数と渡すことができない変数を宣言する方法を完全には理解していませんでしたが、基本的に変更せずに、この構成を書き直して機能させるにはどうすればよいですか?本当に設定の問題だと思います。ありがとう。

4

2 に答える 2

1

デフォルトのCakeルートをすべて無効にすると、ページネーションが機能しなくなります。次を追加するだけで、ページネーションに使用されるルートを取得できます。

Router::connectNamed(false, array('default' => true));

http://book.cakephp.org/2.0/en/development/routing.html#controlling-named-parameters

于 2012-06-26T15:45:09.857 に答える
0

これを実用的で、おそらくそれほどエレガントな方法ではない方法で解決するために、私は次のことを思いつきました。まず、parameterという名前のページを接続しました。

Router::connectNamed(array('page' => '[\d]+'), array(
 'default' => false,
 'greedy' => false
));

クックブックによると、これはパラメータという名前のページのみを有効にし、他のすべてを無効にし、数値のみを受け入れます。

しかし、これが私の特定の問題に特に関連していたかどうかはわかりません。

次に、クックブックを読み直して、routes.phpの接続の順序が本当に重要であることをここで確認しました。つまり、URLをルーティングする必要がある場合、ファイルの上部にある接続は、下部にある接続よりも優先されます。したがって、私はこの構成順序を思いついた:

 // view all posts by year and month
 Router::connect('/blog/:year/:month/*', array(
    'controller' => 'posts',
    'action' => 'index'
  ), array(
    'year' => '[12][0-9]{3}',
    'month' => '0[1-9]|1[012]'
  ));

  // view all posts by year
 Router::connect('/blog/:year/*', array(
    'controller' => 'posts',
    'action' => 'index'
 ), array('year' => '[12][0-9]{3}'));

  // view all posts
  Router::connect('/blog/*', array(
     'controller' => 'posts',
     'action' => 'index'
  ));

以前は逆になりました。つまり、/ blog/*が最初に接続されていました。貪欲なスターのために、これはすべてを「飲み込んだ」ものであり、/ blog /2012/のようなものもあります。2012年は引数として渡されたばかりです。今、私は/ blog / 2012 / page:2、/ blog / 2012/05 / page:2を思い付くことができ、/ blog / 2012 / 5ssfd / page:2のような「偽の」URLは/blog/にマップされます2012 / page:2、つまりこの場合、最初の接続が一致しなかったため、2番目の接続にジャンプします。私がこのようにした理由は、/ blog /:year /:month / page:pageのようなことをすることができなかったので、貪欲な星を避けることができなかったからです(おそらく誰かがこれを行う方法を知っています)。

于 2012-06-27T06:57:20.977 に答える