2012-11-21 2 views
1

/category/subcategory/n-subcategories/article과 같이 중첩 된 범주가있는 사람이 읽을 수있는 URL입니다. CakePHP 2.2.3을 사용 중이며 라우팅 문제에 대한 적절한 해결책을 찾을 수 없습니다. 이 개 테이블 사용 :paginator 및 기사가 포함 된 중첩 된 범주의 SEO 경로

  • 기사 것은
    • 그냥 정상적인 "단일"보기를 (또한 제품이나 게시물이나 ... 수)
    • 기사는 하나 개의 범주에 속하는
  • 카테고리
    • 중첩 된 (n 레벨 트리 동작)
    • 하나 개의 범주는 많은 기사
    • 카테고리보기는 기사를 보여주는 매기기를 사용하여이 범주에 관련된
    • 카테고리보기 목록 모든 기사 나열

매우 일반적인 예 I을 가질 수 있습니다 추측. 하지만 어떻게 이런 식으로 중첩 된 카테고리로 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에서 해결하기 위해 노력하지만 매우 불편하고 나는 역동적 인 해결책이 있어야한다고 생각한다.

카테고리와 기사 별칭에서 모든 경로를 자동으로 생성하여 별도의 "routes"데이터베이스 테이블에 저장하려고했습니다. 작동했지만 단일 경로의 정의가 필요하지 않다고 생각합니다. ?!

는 또한, 모든 기사는 모든 범주에서 사용할 수있는,

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', ... 

사용에 대한 생각하지만 난 매김 여전히이 경우 작동하는지 모르겠어요도 (가능한 두 개의 서로 다른 컨트롤러와 두 개의 서로 다른 견해가 있기 때문에, 계속하는 방법을 모르고 설치시 더 많은 컨트롤러/작업을 사용하려는 경우 어떻게됩니까?)

나는 Cake에서 두 컨트롤러 (카테고리와 기사)로 중첩 된 URL을 얻는 것이 그렇게 어렵지 않아야한다고 생각한다. 유용한 조언을 주셔서 감사합니다!

1) URL에 카테고리의 수를 확인하고 마지막 매개 변수는 카테고리 또는

핸들 두 기사 인 경우
2) 확인 :

답변

0

나는 당신이 두 가지를 확인해야합니다 생각 (동적) 경로 내의 수표는 매우 어려울 수 있습니다.나는이 모든 요청에 ​​대해 하나의 경로를 만들고 컨트롤러에서 1)과 2)에 대한 검사를 수행하도록 제안합니다. 이 모든 URL의 출력을 처리하는 컨트롤러되기 때문에

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

내가이 노선 OutputController에 대한 컨트롤러라고 :

경로는 다음과 같이 할 수있다.

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에있는 매개 변수를 사용하여 (하위) 범주에 필요한 모든 데이터를 가져올 수 있습니다.

+0

고마워, 이렇게 해봐야 겠지만 좋은 해결책 같아. 나는 Category-Slug와 Article-Slug가이 작업을 위해 유일 할 필요가 있다고 생각하지만, 데이터베이스 테이블에 Route를 저장하는 경우에도 필요합니다 ... 감사합니다! –