对于我网站上的每个用户,他们都有自己的个人资料页面,其中包含文章列表。当用户单击其中一个列表项时,会发生一个动画,然后AJAX调用会显示一个显示该文章的div。同时,我使用一些javascript来强制更改URL以反映这一点:
http://www.example.com/UserName/Hello-World-Article
当用户点击浏览器中的后退按钮时,它会调用javascript函数来设置回到listview状态的动画。
到目前为止一切顺利。但是,假设用户将上述URL输入其地址栏并按Enter键,这是问题:
如何将“UserName”和“Hello-World-Article”变量传递给Codeigniter并在此上下文中正确使用它们?
答案 0 :(得分:9)
对不起,我对你的问题的措辞感到有些困惑,但我想我明白你要说的是什么。
首先:阅读Docs on Controllers。 Codeigniter文档摇滚。
第二: URI直接路由到控制器类名及其功能。
例如:
<?php
class Profile extends CI_Controller {
function item($username = NULL, $title = NULL)
{
if (is_null($username) || is_null($title)) redirect(base_url());
// blah run code where $username and $title = URI segement
}
}
这将生成此网址:
http://www.example.com/profile/item/username/whatever-i-want
然后你可以使用application / config / routes.php(docs)中的路径删除项目:
$route['(:any)'] = 'profile/item/$1';
更好的方法(预读):
$route['profile/(:any)'] = 'profile/item/$1';
最后,这将创建您要查找的网址:
http://www.example.com/username/whatever-i-want
//http://www.example.com/profile/username/whatever-i-want
我可能需要仔细检查这是否存在语法错误,但这是Codeigniter路由工作原理的基础知识。一旦你的URL设置完毕,你可以用你的JS做任何你想做的事。
然而,我强烈反对这种方法,因为路由这样的类几乎会使应用程序/站点的其余部分无用,除非这是你唯一的控制器/函数(可能不是这种情况) ) 你有。我认为只要在URL中以这样或那样的方式使用类名,你会更好。
或者,您也可以使用index()和$ this-&gt; uri-&gt; segment(),如果您想以非传统方式跳过路由。
<?php
class Profile extends CI_Controller {
function index()
{
$username = $this->uri->segment(1);
$title = $this->uri->segement(2);
}
}
希望这有意义并帮助您解决问题。
答案 1 :(得分:0)
如何只发送一个分隔符分隔的参数
示例强>
url = http://www.example.com/UserName_title
然后在你的控制器中爆炸参数
class Profile extends CI_Controller {
function item($param = "")
{
if ( $param == ""){ return false; }
$param = explode('_', $param);
$username = $param[0];
$title = $param[1];
}
}
有趣的是,您可以根据需要发送任意数量的参数,而无需进行技术处理。
PS:请务必明智地选择分隔符,以使其不包含在其中一个参数内容中。
答案 2 :(得分:0)
对于那些仍在努力解决这个问题的人,你可以在codeigniter本身解决上述问题 -
您的控制器
class Mycontroller extends CI_Controller{
public function my_method($arg1, $arg2){
echo $arg1;
echo "<br>";
echo $arg2;
}
}
然后您的网址将
http://localhost/CIProjectFolder/Mycontroller/my_method/argument1/argument2