2009-08-17 8 views
5

Tôi đang phát triển một trang web thương mại điện tử với CI có danh mục sản phẩm và sản phẩm. Tôi muốn định tuyến URL để nó sẽ đi đến bộ điều khiển sản phẩm, sau đó chạy hàm getCategoryByName cho phân đoạn đầu tiên, sau đó chạy getProductByName cho phân khúc thứ hai. Dưới đây là những gì tôi có:CodeIgniter Routing

 
URL: 
products/docupen/rc805 
 
routes.php: 
$route['products/([a-z]+)'] = "products/getCategoryByName/$1"; 
$route['products/([a-z]+)/([a-z0-9]+)'] = "products/$1/getProductByName/$2"; 

Nhưng nó không làm việc. "docupen" là danh mục và "rc805" là sản phẩm.

Xin cảm ơn trước.


Cảm ơn tất cả sự giúp đỡ của bạn. Đây là những gì tôi đã kết thúc với những gì tôi cần.

 
$route['products/:any/:num'] = "products/getProductByID"; 
$route['products/:any/:any'] = "products/getProductByName"; 
$route['products/:any'] = "products/getCategoryByName"; 

Trả lời

11

Câu trả lời của tôi xây dựng một chút về câu trả lời của Colin.

Khi tôi chơi xung quanh với các tuyến đường trong CodeIgniter tôi đi đến kết luận rằng thứ tự của các tuyến đường là quan trọng. Khi tìm thấy tuyến đường hợp lệ đầu tiên, nó sẽ không thực hiện các tuyến đường khác trong danh sách. Nếu nó không tìm thấy bất kỳ tuyến đường hợp lệ thì nó sẽ xử lý các tuyến đường mặc định.

tuyến đường của tôi mà tôi đã chơi xung quanh với dự án cụ thể của tôi làm việc như sau:

$route['default_controller'] = "main"; 
$route['main/:any'] = "main"; 
$route['events/:any'] = "main/events"; 
$route['search/:any'] = "main/search"; 
$route['events'] = "main/events"; 
$route['search'] = "main/search"; 
$route[':any'] = "main"; 

Nếu tôi bước vào "http://localhost/index.php/search/1234/4321" Nó sẽ được chuyển đến chính/tìm kiếm và sau đó tôi có thể sử dụng $this->uri->segment(2); để lấy 1234 .

Trong kịch bản của bạn tôi sẽ cố gắng (trật tự là rất quan trọng):

$route['products/:any/:any'] = "products/getProductByName"; 
$route['products/:any'] = "products/getCategoryByName"; 

Tôi không biết đủ để định tuyến theo cách mà bạn muốn (products/$1/getProductByName/$2), nhưng tôi không chắc chắn làm thế nào bạn sẽ tạo ra một bộ điều khiển để xử lý dạng URI cụ thể này. Sử dụng các câu lệnh $this->uri->segment(n); như được đề cập bởi Colin trong bộ điều khiển của bạn, bạn sẽ có thể làm những gì bạn muốn.

5

Bạn nên sử dụng URI class để truy xuất các phân đoạn "docupen" và "rc805" từ url của mình. Sau đó, bạn có thể sử dụng các giá trị đó trong bất kỳ chức năng nào bạn cần.

Ví dụ, nếu url của bạn là www.yoursite.com/products/docupen/rc805, bạn sẽ sử dụng sau đây trong điều khiển sản phẩm của bạn để lấy các phân đoạn và gán chúng cho các biến:

$category = $this->uri->segment(2); //docupen 
$product = $this->uri->segment(3); //rc805 

Sau đó, bạn có thể sử dụng $ category và $ product tuy nhiên bạn cần.

2

Các tuyến đường CodeIgniter không hoạt động tốt với regex. Họ được hỗ trợ, không phải tôi không bao giờ có thể làm cho họ làm việc. Sẽ dễ dàng hơn nếu bắt chúng như thế này

$route['products/(:any)'] = "products/getCategoryByName/$1"; 
$route['products/(:any)/(:any)'] = "products/$1/getProductByName/$2";