10/10/2018, 11:12

Vấn đề với CodeIgniter cần trao đổi.

Mình có 1 controller là View và function bên trong là index.

Đường dẫn của mình: http://localhost/abc, khi chạy localhost/abc/view sẽ có 3 id dc load từ db. Khi mình muốn xem info của id 1 thì đường dẫn của id 1 sẽ là ...base_url()/view/index/$item[id], và trong controller view:
<?php
class View extends Controller
{
public function __construct()
{
parent::Controller();
$this->load->helper(array('form', 'url', 'email'));
$this->load->scaffolding("user");
$this->load->library(array('session', 'form_validation', 'email'));
$this->load->Model(array('madmin', 'muser'));
}

public function index()
{
$id = $this->uri->segment(3);
if($id) echo $id;

$this->load->view('user/header', $data);
$this->load->view('user/view_v.php');
$this->load->view('user/footer');
}
}
khi đó site mình sẽ chạy là localhost/abc/view/index/1

vấn đề là mình muốn bỏ chuỗi index trong đường dẫn trên, chỉ còn localhost/abc/view/1 thì phải làm sao ? Nếu đổi dc thành localhost/abc/1 thì càng tốt, xin dc hỏi các pro CI về này.

Ý của mìh tương tự như www.rongbay.com, khi click vào xem 1 tỉnh khác, chẳng hạn Hà Nội thì đường dẫn của nó là rongbay.com/ha-noi

Xin chỉ cách mình làm tương tự.

Trân trọng.
diepnghitinh viết 13:23 ngày 10/10/2018
vấn đề codeigniter sẽ lấy http://domain.com/index.php/view/show/1

với view là tên Class, show là tên phương thức còn 1 và các uri ở phía sau là tham số truyền vào show

nếu như bạn viết http://domain.com/index.php/1 thì 1 ở đây codeigniter sẽ hiểu là Class , như vậy sẽ sai nguyên tắc đặt tên cho Class

Do đó để link có dạng http://domain.com/index.php/1 hoặc http://domain.com/1

thì tại config/routes.php thêm 1 giá trị vào như sau
Code:
$route['(:num)'] = "view/test/$1";
//class: view , phương thức: test, (:num) => $1 là tham số truyền vào phương thức
codeigniter hỗ trợ (:any) chuỗi bất kỳ (số, chuỗi ...) , (:num) số nguyên

hy vọng có ích cho bạn
1024KB viết 13:20 ngày 10/10/2018
theo như diepnghitinh là chuẩn rồi. Chẳng còn gì để nói.
Ngoài ra có thể viết như sau:
Code:
function index($id){ //tương đuơng $id = $this->uri->segment(3)
    #code here
}
redhill viết 13:25 ngày 10/10/2018
Được gửi bởi php_code
Mình có 1 controller là View và function bên trong là index.

Đường dẫn của mình: http://localhost/abc, khi chạy localhost/abc/view sẽ có 3 id dc load từ db. Khi mình muốn xem info của id 1 thì đường dẫn của id 1 sẽ là ...base_url()/view/index/$item[id], và trong controller view:


khi đó site mình sẽ chạy là localhost/abc/view/index/1

vấn đề là mình muốn bỏ chuỗi index trong đường dẫn trên, chỉ còn localhost/abc/view/1 thì phải làm sao ? Nếu đổi dc thành localhost/abc/1 thì càng tốt, xin dc hỏi các pro CI về này.

Ý của mìh tương tự như www.rongbay.com, khi click vào xem 1 tỉnh khác, chẳng hạn Hà Nội thì đường dẫn của nó là rongbay.com/ha-noi

Xin chỉ cách mình làm tương tự.

Trân trọng.
Vấn đề của bạn đã được giải quyết tại đây: http://codeigniter.com/user_guide/general/routing.html . Nếu vẫn còn thắc mắc bạn cứ hỏi, biết thì mình sẽ trả lời, ko thì để các cao thủ khác

Nhìn lại thấy bạn diepnghitinh đã trả lời rồi, chậm chân :d
php_code viết 13:16 ngày 10/10/2018
Được gửi bởi diepnghitinh
vấn đề codeigniter sẽ lấy http://domain.com/index.php/view/show/1

với view là tên Class, show là tên phương thức còn 1 và các uri ở phía sau là tham số truyền vào show

nếu như bạn viết http://domain.com/index.php/1 thì 1 ở đây codeigniter sẽ hiểu là Class , như vậy sẽ sai nguyên tắc đặt tên cho Class

Do đó để link có dạng http://domain.com/index.php/1 hoặc http://domain.com/1

thì tại config/routes.php thêm 1 giá trị vào như sau
Code:
$route['(:num)'] = "view/test/$1";
//class: view , phương thức: test, (:num) => $1 là tham số truyền vào phương thức
codeigniter hỗ trợ (:any) chuỗi bất kỳ (số, chuỗi ...) , (:num) số nguyên

hy vọng có ích cho bạn
=> Đã fix theo bạn diepnghitinh: $route['(:num)'] = "view/test/$1"; thì ok, nhưng $route['(:any)'] = "view/test/$1"; thì k chạy. Xin hỏi tại sao vậy bạn?


Được gửi bởi 1024KB
theo như diepnghitinh là chuẩn rồi. Chẳng còn gì để nói.
Ngoài ra có thể viết như sau:
Code:
function index($id){ //tương đuơng $id = $this->uri->segment(3)
    #code here
}
Cách của bạn 1024KB hơi lạ, bạn có thể chi tiết hơn 1 chút dc k 1024KB?

Mong tất cả thông cảm vì kiến thức còn thô thiển, phương châm muốn biết thì phải hỏi.

[=========> Bổ sung bài viết <=========]

Thank redhill, mình reply trong lúc bạn trả lời. Để mình test tiếp.
1024KB viết 13:29 ngày 10/10/2018
nhưng $route['(:any)'] = "view/test/$1"; thì k chạy. Xin hỏi tại sao vậy bạn?
-> (:any) không chạy là bởi vì đã đụng chạm tới class name.
Cách của bạn 1024KB hơi lạ, bạn có thể chi tiết hơn 1 chút dc k 1024KB?
-> hơi lạ ở chỗ nào nhỉ?
Code:
function index($param1, $param2, $param3){ 
    //$param1 <=> $this->uri->segment(3)
    //$param2 <=> $this->uri->segment(4)
    //$param3 <=> $this->uri->segment(5)
    #code here
}
Xem thêm: http://codeigniter.com/user_guide/ge...ntrollers.html
Phần Passing URI Segments to your Functions
php_code viết 13:18 ngày 10/10/2018
$route['(:any)'] = "view/test/$1";
-> (:any) không chạy là bởi vì đã đụng chạm tới class name.
mình đổi :num thành :any thì chạy tốt rồi, vì $1 của mìh giờ là là string chứ k phải number nữa.

Nhưng vấn đề phát sinh là phần admin của mình k chạy dc (localhost/abc/admin), khi chạy link này thì nó đều ra trang localhost/abc

Nếu thêm $route['admin']= "admin"; thì mới chạy dc localhost/abc/admin nhưng đến localhost/abc/admin/index/function_name thì nó lại quay về trang localhost/abc.

Nếu thêm
$route['adminindex/function_name1] = "admin/index/function_name1";
$route['adminindex/function_name2] = "admin/index/function_name2";
thì các function trong admin chạy tốt, nhưng lỡ mình có 100 function trong controller index này thì phải khai báo đủ 100 $route[] như trên sao? MÌnh nghĩ vấn đề này liên quan đến Regular Expression, nhưng cái này thì lại k rành, mong các cao thủ trợ giúp với.

-> (:any) không chạy là bởi vì đã đụng chạm tới class name.
Bạn 1024KB có thể giải thích đụng class name là như thế nào k? Và cách khắc phục như thế nào vậy?
1024KB viết 13:26 ngày 10/10/2018
Bạn 1024KB có thể giải thích đụng class name là như thế nào k? Và cách khắc phục như thế nào vậy?
Nhầm chút. Đã $route thì ok nhưng sẽ khó cho các class khác.
redhill viết 13:17 ngày 10/10/2018
Được gửi bởi php_code
mình đổi :num thành :any thì chạy tốt rồi, vì $1 của mìh giờ là là string chứ k phải number nữa.

Nhưng vấn đề phát sinh là phần admin của mình k chạy dc (localhost/abc/admin), khi chạy link này thì nó đều ra trang localhost/abc

Nếu thêm $route['admin']= "admin"; thì mới chạy dc localhost/abc/admin nhưng đến localhost/abc/admin/index/function_name thì nó lại quay về trang localhost/abc.

thì các function trong admin chạy tốt, nhưng lỡ mình có 100 function trong controller index này thì phải khai báo đủ 100 $route[] như trên sao? MÌnh nghĩ vấn đề này liên quan đến Regular Expression, nhưng cái này thì lại k rành, mong các cao thủ trợ giúp với.
Bạn có thể fix 1 cách đơn giản là thêm $route['admin/(:any)']= "admin/$1"; Bạn viết $route['admin']= "admin"; là chưa đầy đủ và vẫn có thể bị remap lại.

Nhầm chút. Đã $route thì ok nhưng sẽ khó cho các class khác.
Đã viết remap thì phải tính trước các trường hợp xảy ra, nếu để bị trùng thì...
diepnghitinh viết 13:16 ngày 10/10/2018
tại controller tạo 1 file admin.php có class name là admin, tại đây phương thức index viết như sau:
Code:
global $application_folder;
		
		define('DS',DIRECTORY_SEPARATOR);
		
		$func_admin = FCPATH.$application_folder.DS.'controllers'.DS.'admin'.DS;
		
		if (file_exists($func_admin.$func.'.php'))
			include($func_admin.$func.'.php');
		else
			show_404();
tạo 1 file main.php trong controllers/admin/main.php
Code:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
print_r($this);
file main.php đã include có thể sử dụng tất cả các phương thức của CI

bây giờ tại routes.php thêm vào dòng sau:
Code:
$route['admin/(:any)'] = "admin/index/$1";
như vậy là bạn khỏi viết 100 dòng gì đó cho nó mệt
Bài liên quan
0