2016-11-29 1 views
-1

제품 목록을 필터링하기위한 필터 메소드를 만들었습니다. 이것은 내 URL입니다 :CodeIgniter의 친숙한 URL

localhost/myshop/products/filter?category=shirts&color=blue&page=1 

그러나 나는 이런 식으로 보여주고 싶은 :

localhost/myshop/products/shirts/blue/1 

가 어떻게 그것을 달성 할 수 있습니까?

+0

첫 번째 URL의 컨트롤러 이름은 무엇입니까? – Tpojka

+0

다른 사람들이 도움을 줄 수 있도록 시도한 코드를 제공해주십시오. –

+0

죄송합니다. 잊어 버립니다. 그것은 제품입니다. – kate23

답변

0

Products::filter()이 요청 처리를 담당한다고 가정하면 서명의 매개 변수를 수락하도록 메서드를 다시 작성할 수 있습니다. 당신은 단순히 URL 세그먼트를 통해 매개 변수를 받아 그것을 리팩토링 할 수

class Products extends CI_Controller 
{ 
    public function filter() 
    { 
     // Retrieve data from GET params 
     $page  = $this->input->get('page'); 
     $color = $this->input->get('color'); 
     $category = $this->input->get('category'); 

     // Do the filtering with $category, $color and $page... 
    } 
} 

: 현재 로직이 같은 경우에 따라서 장소에두고

public function filter($category, $color, $page) 
{   
    // Do the filtering with $category, $color and $page... 
} 

을, 현재의 URL은 다음과 같습니다

localhost/myshop/products/filter/shirts/blue/1 

우리는 그 여분의 filter/을 제거해야합니다. docs에서 인용 :

일반적으로 URL 문자열과 그에 해당하는 컨트롤러 클래스/방법 간에는 일대일 관계가 있습니다. 다른 클래스/메소드 대신에 해당하는 하나의 호출 할 수 있도록하지만, 는이 관계를 매핑 할 수 있습니다, 어떤 경우에는

example.com/class/method/param1/param2

: URL의 세그먼트는 통상 다음의 패턴을 따릅니다 URL.

OK, 현재 경로를 다시 매핑해야합니다. 당신은 몇 가지 옵션이 있습니다

$route['products/(:any)'] = 'products/filter/$1'; 

그것은 URL이 products/로 시작하면,의 filter 방법으로 매핑 말한다 :

  • 먼저, 새 항목으로 application/config/routes.php 파일을 업데이트하는 것입니다 products 클래스입니다.

    여기서 와일드 카드와 정규식 패턴을 사용하여 메서드에서 허용하는 매개 변수의 유형을 더욱 정확하게 지정할 수 있습니다.

  • 또 다른 방법은 컨트롤러에 _remap() 메서드를 구현하여 경로 재 매핑을 수행하는 것입니다.

+0

굉장 !! 그것은 완벽!! 고마워,하지만 params 중 하나가 비어 있다면 어떻게 피할 수 있습니까? 예 : localhost/myshop/products/filter/blue/1 – kate23

+0

괜찮습니다. 하나 이상의 매개 변수 중 하나라도 비어 있으면 CodeIgniter는 사용자의 'ArgumentCountError' 예외를 throw합니다. 매개 변수 중 하나 이상에 잘못된 문자가 포함되어 있으면 '400 잘못된 요청'이 표시됩니다.그래서, 기본적으로, 당신은 그 위협에 대해 안전합니다. – sepehr

+0

'routes.php' 파일에서도 와일드 카드/정규식 패턴을 지정하여 매개 변수를 일치시키고 보호 할 수 있습니다. 예를 들어'$ page '가 항상 숫자가되기를 원한다면 $ route ['products/(: any)/(: any)] '] ='products/filter/$ 1/$ 2/$ 3 ';'. 자세한 내용은 [라우팅 문서] (https://www.codeigniter.com/userguide3/general/routing.html)를 참조하십시오. – sepehr