代码点火器中的漂亮 URL 设置


pretty url setting in codeigniter

我有带有控制器"包",函数"tour_package"和参数"1"的网址。http://www.mysite.in/package/tour_packages/1此处将参数设置为 id。我需要用相应的网址字符串更改它http://www.mysite.in/package/tour_packages/American

还有一个例子,比如:http://www.mysite.in/package/tour_packages/2自http://www.mysite.in/package/tour_packages/African

如何做到这一点?

首先,我将 url 链接更改为使用 url_title()(url 助手)。如果您使用我认为是数据库调用的 ID 的文本值创建查询,这将为您提供类似

(例如,如果 id 1 的记录是 name="America");

echo 'http://www.mysite.in/package/tour-packages/'.url_title($name);

会给;

http://www.mysite.in/package/tour-packages/American

如果您随后添加此扩展路由器类,它将自动为您重新格式化破折号以下划线。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Router extends CI_Router {
    function set_class($class) {
        $this->class = str_replace('-', '_', $class);
    }
    function set_method($method) {
        $this->method = str_replace('-', '_', $method);
    }
    function _validate_request($segments) {
        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.str_replace('-', '_', $segments[0]).EXT)) {
            return $segments;
        }
        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0])) {       
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);
            if (count($segments) > 0) {
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().str_replace('-', '_', $segments[0]).EXT)) {
                    show_404($this->fetch_directory().$segments[0]);
                }
            } else {
                $this->set_class($this->default_controller);
                $this->set_method('index');
                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) {
                    $this->directory = '';
                    return array();
                }
            }
            return $segments;
        }
        // Can't find the requested controller...
        show_404($segments[0]);
    }
}

然后你可以在路由文件中添加一个条目(在配置中); 类似;

$route['package/tour_package/(:any)'] = "package/lookup_by_name/$1";

然后,需要在包控制器中创建一个名为 lookup_by_name($name) 的方法。此方法需要对数据库执行 sql 查询,从名称值中获取 id。然后,您可以继续加载视图或执行所需的任何操作。

例如

public function lookup_by_id($name) {
   // sql to get id from database record
   // load the view?
   $this->view($id);
}
public function view($id) {
   // sql to load full record from id
   $this->load->view('foo', $data);
}