CodeIgniter-动态页面-默认控制器url

CodeIgniter-动态页面-默认控制器url,codeigniter,codeigniter-2,php,Codeigniter,Codeigniter 2,Php,编辑 我在routes.php中的解决方案: $route['news'] = 'news_controller'; $route['gallery'] = 'gallery_controller'; $route['(:any)'] = 'sites/$1'; 在我的网站上: function index($site_id = '') { //sanitize $site_id. $this->site = $this->sites_model->get_site(

编辑

我在routes.php中的解决方案:

$route['news'] = 'news_controller';
$route['gallery'] = 'gallery_controller';
$route['(:any)'] = 'sites/$1';
在我的网站上:

function index($site_id = '') {
  //sanitize $site_id.
  $this->site = $this->sites_model->get_site($site_id);
  //etc.
}
THX to YAN

问题:

所以我用CodeIgniter写了一个小小的CMS。管理员可以创建网站。当url的段与数据库中的段类似时,站点将自动打开。例如mysite.com/sites/about将调用“about”站点。这个很好用

现在我的URL有问题了。我想要这个网址

转向这一点:

问题是,我不能使用routes.php并为每个站点设置通配符。(因为它们是动态的,我不知道客户将创建哪个站点——我不想编辑他将创建的每个站点的routes.php文件——这应该自动完成)

问题是我还有其他修复控制器,如新闻、画廊或联系人: mysite.com/news,mysite.com/gallery,……它们工作得很好

这是我的站点控制器:

class Sites extends Public_Controller {

public $site;
public $url_segment;

public function _remap($method)
{
    $this->url_segment = $this->uri->segment(2);

    $this->load->model('sites_model');
    $this->site = $this->sites_model->get_site($this->url_segment);

    if($this->site !== FALSE)
    {
        $this->show_site($this->site);
    }
    else
    {
        show_404($this->url_segment);
    }
}

public function show_site($data)
{
    $this->template->set('site', FALSE);
    $this->template->set('site_title', $data['name']);
    $this->template->set('content',$data['content']);
    $this->template->load('public/template','sites/sites_view', $data);
}}
这是检查数据库的Site_模型…如果url_段符合数据库中的标题:

class Sites_model extends CI_Model {

public function get_site($site_url)
{
    if($site_url != ""){
        $this->db->where('name', $site_url);
        $query = $this->db->get('sites', 1);

        if($query->num_rows() > 0){
            return $query->row_array();
        }
        else
        {
            return FALSE;
        }
    }else{
        return FALSE;
    }
} }
我想我需要一些人在不调用站点控制器时检查控制器是否存在(url的第一段),并检查站点是否在DB中,如果为false,则调用404

有什么建议可以解决这个问题吗

顺便说一句:sry为我的英语


关于GN

我很难理解这个问题的全部意图,但是,从我可以看出,你不需要简单地补充一下:

if ($this->uri->segment(1) != 'sites')
     ... // handle malformed URL

您可以通过以下方式处理
routes.php
,只需将
(:any)
值保留在最后:

$route['news'] = 'news_controller';
$route['gallery'] = 'gallery_controller';
$route['(:any)'] = 'sites/$1';
在站点中,控制器使用URL中的数据路由到特定站点

function index($site_id = '') {
    //sanitize $site_id.
    $this->site = $this->sites_model->get_site($site_id);
    //etc.
}

我的英语不好(来自奥地利)是的,那是真的,然后他会打电话给其他控制员。但在最后,我不想要的部分“网站”无论如何。从mysite.com/sites/about到mysite/about,我想隐藏段“sites”thx以便回复。是的,这可以,但是有没有在routes.php中没有通配符的解决方案?我想动态地制作它。当我选择这个解决方案并创建一个新的控制器时,我必须编辑routes.php并设置一个通配符。最后会有很多控制器。(我不想为它们每个都写一个通配符)你知道我的意思吗?(顺便说一句:sry代表我的英语)什么新控制器?如果您要在站点中添加一个新的部分,您仍然需要更新
routes.php
。你不需要为每个站点创建一个新的控制器。不,我指的是其他控制器,如“画廊”或“论坛”。例如论坛文件:controllers/forum.php,url是mysite.com/forum。我不需要编辑routes.php。最终会有更多的控制器。当我像你说的那样写的时候,我必须为我将来创建的每个控制器编辑routes.php。这不是很糟糕:)但动态解决方案会更好。好吧,我也决定选择你的答案:)但它不起作用。当我打电话给mysite.com/about时,会显示404错误。但是当我给mysite.com/sites/about打电话时,它就起作用了。似乎重新映射功能不起作用。有什么建议,为什么?请用
routes.php
的代码编辑您的问题。