这是url的一个例子: http://www.example.com/search/search-keyword
我正在努力使这项工作,我使用.htaccess删除了index.php,搜索是控制器,我想在索引方法中传递一个参数。
目前看来是这样的:
class Search extends CI_Controller{
function index($param){
echo $param;
}
}
有什么建议吗?我似乎无法使其发挥作用
答案 0 :(得分:30)
index
段http://www.example.com/search/index/search-keyword
。$route['search/(:any)'] = 'search/index/$1';
请记住不要信任用户输入,尤其是当您将其投入网址时。最新版本的CI现在支持$_GET
变量,因此您可能希望使用该变量或flashdata。像O' Brien
一样简单的搜索术语会给你一个致命错误(“你提交的URI不允许使用字符。”)。
答案 1 :(得分:20)
class Search extends CI_Controller{
function _remap($param) {
$this->index($param);
}
function index($param){
echo $param;
}
}
然后你应该能够访问:/ search / 123123:并且页面会回显“123123”或者你用它代替的任何内容。
答案 2 :(得分:13)
function _remap($parameter){
$this->_index($parameter);
}
试一试并告诉我们它是如何进行的。
答案 3 :(得分:6)
大多数这些解决方案只有在控制器中只有一个名为index()
的函数时才有效。如果你的路线中有这个:
$route['search/(:any)'] = 'search/index/$1';
如果你的路线中有上述内容,那么你的搜索功能会起作用,但如果你向同一个控制器添加任何其他功能,它们都会被重定向到/search/index/$1
。
我能想到的唯一解决方案是允许您使用所需的URL,同时仍然可以向搜索控制器添加任何其他功能,这是为路由文件添加一种混乱的条件。以下是它的外观和作用:
$request = $_SERVER['REQUEST_URI']; // Only add this for readability
if(!strpos($request, 'search/another_function') || !strpos($request, 'search/more_functions')) {
$route['search/(:any)'] = 'search/index/$1';
}
这样做基本上是说“如果请求的URL不包含我的任何搜索控制器功能的名称,那么它必须用于索引,因此我们将激活索引的路由规则”。
这将允许您在没有问题的情况下接收search/any_other_functions_you_have
请求,并且仅在请求URI与其中任何一个都不匹配时激活隐藏索引函数的规则。
这样做的一个副作用是你永远不会得到404.例如,如果有人输入像“yourdomain.com/search/something”这样的网址,他们希望它显示非搜索结果页面获得404警告他们没有这样的页面,而应用程序将假设他们键入的是搜索词。然而,听起来这对你来说并不是什么大问题,我不认为让一个控制器无法返回404是一件非常可怕的事情。
答案 4 :(得分:4)
你需要了解代码点火器网址的工作方式,它基本上是这样的:
http://www.mysite.com/ {控制器} / {函数}
那么您的网址实际上是在搜索控制器中查找名为“关键字”的功能。
您有多种选择。最简单的方法是将网址更改为:
http://www.mysite.com/search/result/keyword
然后这应该是完美的:
class Search extends CI_Controller{
function result($param){
echo $param;
}
}
如果你真的想要使用url,你可以使用与上面相同的代码片段,同时打开“application / config / routes.php”并将其添加到底部。
$route['search/(:any)'] = "search/result";
或者,如果您想继续使用索引功能,可以将其更改为
$route['search/(:any)'] = "search/index";
将课程改为:
class Search extends CI_Controller{
function index($param=FALSE){
if($param == FALSE) {
//Show search box
} else {
//Show search results
}
}
}
如果您自己弄明白,请不要忘记更新您的答案,或者如果答案可以接受某些人的回答:)
答案 5 :(得分:1)
我刚刚开始使用CI,这是我的解决方案并在我的网站上实现。到目前为止,它适用于我,我的搜索查询已被谷歌索引为链接
Class Search extends CI_Controller{
function index(){
$search_item = $this->input->post('search_box'); // this is from the input field
redirect(base_url()."search/q/".url_title($search_item));
}
// i've redirected it to the "search" controller then :
function q($search_item = null){// process search
// load the view here with the data
}
}
答案 6 :(得分:1)
这是我的解决方案:
来自CI用户指南
public function _remap($method)
{
if ($method == 'some_method')
{
$this->$method();
}
else
{
$this->default_method();
}
}
所以我以这种方式创建了我的控制器:
class Shortener extends CI_Controller {
function shortener() {
parent::__construct();
}
function index($getVar) {
echo "Get var: " . $getVar;
}
function config() {
echo "another function";
}
function _remap($method) {
if($method == "config") {
$this->$method();
}
else {
$this->index($method);
}
}
}
希望这对某人有帮助......
BUG:如果你调用/ shortener _remap函数将“index”传递给index()函数......可以解决添加if条件或其他问题
答案 7 :(得分:0)
您应该使用CI URI类。 http://codeigniter.com/user_guide/libraries/uri.html
class Search extends CI_Controller{
function index($param){
//echo the search-keyword
echo $this->uri->segment(2);
}
}
答案 8 :(得分:0)
这种最简单的方法就是使用uri segments:
class Search extends CI_Controller{
function index(){
$param=$this->uri->segment(2);
echo $param;
}
}
或者像Madmartigan所说,使用路线,这可能是更好的方法。
答案 9 :(得分:0)
我还必须检查是否传递了一些变量 - 所以这是我采取的解决方案。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Story extends CI_Controller{
function story() {
parent::__construct();
}
function _remap($parameter){
$this->_index($parameter);
}
public function _index($story_id) {
if($story_id == 'index'){
//No variable passed
redirect('auth', 'refresh');
}else{
$data['title'] = "Story";
$this->load->view('story', $data);
}
}
}
希望这有助于某人!
答案 10 :(得分:0)
谢谢。该代码对我有用。如果参数是数字
Or you need to use a route $route['search/(:any)'] = 'search/index/$1';
但是,如果参数是字符串(http://[::1]/note/getnote/index/fg => http://[::1]/note/getnote/fg)。我像这样的代码使用_remap()。
<?php
Getnote类扩展了CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->library('image_lib');
}
public function index(){
}
public function _remap($keyname)
{
$this->load->model('Laydb');
$data = $this->Laydb->getNote($keyname);
$proListArray['patitle'] = "Edit notepad";
$this->load->view('top', $proListArray);
$this->load->view('editblog', $data);
$this->load->view('bottom');
}
}
答案 11 :(得分:-2)
我终于找到了一个解决方法,因为我不能简单地将post变量放入URL中。
我所做的是创建另一个函数,然后将其重定向到该函数。
class Search extends CI_Controller{
function index(){
$search_item = $this->input-post('search_item');
redirect("search/q/".url_title($search_item));
}
function q($key){
// process search
}
}