2

/ category / subcategory / n-subcategories/articleのようなネストされたカテゴリを持つ人間が読めるURL。CakePHP 2.2.3を使用していますが、ルーティングの問題に対する適切な解決策が見つかりません。2つのテーブルの使用:

  • 記事(製品や投稿、または...)
    • 通常の「単一の」ビューを持っている
    • 記事は1つのカテゴリに属します
  • カテゴリ
    • ネストされた(nレベルのツリーの動作)
    • 1つのカテゴリに多くの記事を含めることができます
    • category-viewには、このカテゴリに関連するすべての記事が一覧表示されます
    • カテゴリビューは、記事リストを表示するためにpaginatorを使用します

私が推測する非常に一般的な例。しかし、次のようにネストされたカテゴリのURLパスを取得するには、ルーターを今すぐ定義する必要があります。

/categoryname1                                         (showing category view)
/categoryname1/articlename1                            (showing article view)
/categoryname2/articlename2                            (showing article view)
/categoryname2/subcategoryname1                        (showing category view)
/categoryname2/subcategoryname2/articlename4           (showing article view)
/n-categoryname/././...n-subcategoryname               (showing category view)
/n-categoryname/././...n-subcategoryname/n-articlename         (article view)

私はroutes.phpですべてのルートを修正しようとしましたが、それはあまり快適ではなく、動的な解決策があるはずだと思います。

また、カテゴリエイリアスと記事エイリアスからすべてのルートを自動的に生成し、それらを別の「ルート」データベーステーブルに保存しようとしましたが、機能しましたが、単一ルートのハンデレットを定義する必要はないと思いますか?!

また、ルーターで修正されたすべてのカテゴリを定義しようとしました。

Router::connect(
  '/any-category-name',
  array('controller' => 'categories', 'action' => 'view', 1)
);

そして記事のために

Router::connect(
  '/any-category-name/:slug',
  array('controller' => 'articles', 'action' => 'view'),
  array('pass' => array('slug'))
);

しかし、この方法では、すべての記事がすべてのカテゴリで利用可能であり、これは良い解決策ではありません。そして、私は使用することを考えました

Router::connect(
  '/:slug', ...

しかし、2つの異なるコントローラーと2つの異なるビューが可能であるため、続行する方法がわかりません(また、この場合でもPaginationが機能するかどうか、さらにコントローラーを使用したい場合はどうなるかわかりません) /インストールのアクション)。

Cakeで2つのコントローラー(カテゴリーと記事)を持つネストされたURLを取得するのはそれほど難しいことではないと思いますか?!役立つアドバイスをありがとう!

4

1 に答える 1

1

私はあなたが2つのことをチェックしなければならないと思います:

1)URL内のカテゴリの数を確認し、
2)最後のパラメータがカテゴリまたは記事であるかどうかを確認します

(動的)ルート内で両方のチェックを処理することは非常に難しい場合があります。これらすべての要求に対して1つのルートのみを作成し、コントローラーで1)と2)のチェックを行うことをお勧めします。

ルートは次のようになります。

Router::connect(
  '/*',
  array('controller' => 'outputs', 'action' => 'index')
);

このルートのコントローラーをOutputControllerと呼びました。これは、これらすべてのURLの出力を処理するコントローラーになるためです。

class OutputController extends AppController
{
  public $uses = array('Article', 'Category');

  public function index()
  {
    // Get n parameters from url (1)
    $args = func_get_args();
    $last_arg = $args[count($args) - 1];

    // Check if this is an article (2)
    $article = $this->Article->find('first', array(
      'conditions' => array('Article.slug' => $last_arg
    ));
    if (!empty($article)) {
      $this->set('article', $article);
      $this->render('article');
    }

    // Check if this is an category (2)
    $category = $this->Category->find('first', array(
      'conditions' => array('Category.slug' => $last_arg
    ));
    if (!empty($category)) {
      $this->set('category', $category);
      $this->render('category');
    }

    // Page not found
    if (empty($article) and empty($category)) {
      throw new NotFoundException();
    }
  }

  // ...

記事を表示するには、ビュー'Output/article.ctp'が使用されます。カテゴリの場合、CakePHPは「Output/category.ctp」をレンダリングします。さらに、$ argsのパラメーターを使用して、(サブ)カテゴリーに必要なすべてのデータをフェッチできます。

于 2012-11-25T10:42:18.737 に答える