【问题标题】:CodeIgniter - dynamic pages - default controller urlCodeIgniter - 动态页面 - 默认控制器 url
【发布时间】:2012-06-08 16:19:02
【问题描述】:

编辑

我在 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.
}

感谢 YAN

问题:

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

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

http://www.mysite.com/sites/about

转向这个:

http://www.mysite.com/about

问题是,我不能使用 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_model...如果 url_segment 适合数据库中的标题:

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 的第一段)并检查站点是否在数据库中,如果为假则调用 404。

有什么建议可以解决吗?

顺便说一句:对不起我的英语

关于 GN

【问题讨论】:

    标签: codeigniter codeigniter-2 php


    【解决方案1】:

    您可以通过以下方式处理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.
    }
    

    【讨论】:

    • 感谢回复。是的,这会去,但有没有在 routes.php 中没有通配符的解决方案?我想动态地制作它。当我选择这个解决方案并创建一个新控制器时,我必须编辑 routes.php 并设置一个通配符。最后会有很多控制器。 (我不想为每个人写一个通配符)你知道我的意思吗? (顺便说一句:对不起我的英语)
    • 什么新控制器?如果您要向站点添加新部分,则无论如何都需要更新routes.php。您无需为每个站点创建新的控制器。
    • 不,我指的是其他控件,例如“画廊”或“论坛”。例如论坛文件:controllers/forum.php 和 url 是 mysite.com/forum。我不需要编辑 routes.php。最后会有更多的这些控制器。当我像你说的那样写它时,我必须为我将来创建的每个控制器编辑 routes.php。这不是很糟糕 :) 但动态解决方案会更好。
    • 好的,我决定也选择您的回复:) 但它没有用。当我打电话给 mysite.com/about 它显示 404 错误。但是当我打电话给 mysite.com/sites/about 时,它可以工作。似乎重映射功能不起作用。有什么建议,为什么?
    • 请使用routes.php的代码编辑您的问题。
    【解决方案2】:

    我无法理解问题的全部意图,但是,据我所知,您是否只需要添加:

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

    【讨论】:

    • sry 我的英语不好(来自奥地利)是的,那是真的,然后他会打电话给其他控制器。但最后我不想要“网站”部分。从 mysite.com/sites/about 到 mysite/about 我喜欢隐藏“站点”部分
    猜你喜欢
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多