在codeigniter中加载视图后更改URL

时间:2012-03-22 10:28:34

标签: php codeigniter query-string

  

可能重复:
  Change url in php after reloading a page

我可能会重复我的问题,但这次我提供的确切方案与我的实际代码请耐心等待我... 我的主页网址是

http://localhost/mediabox/home/box/12

在我的主页上,当我点击页面重新加载的任何链接以及该特定语言的内容时,我有两个语言链接。

链接位于视图(模板/索引)中,看起来像这样

<a href="<?php echo base_url(); ?>home/box/?bid=<?php echo $template_data['box_id']?>&ln=<?php echo $lang['language_id']?>"></a>

所以我发送出价和链接

作为qurystring

现在当我点击链接时,页面内容会根据所选语言发生变化,但网址也会更改为

http://localhost/mediabox/home/box/?bid=12&ln=2 

我想要的是页面内容会更改但不会更改网址,或者我可以在加载页面后使网址看起来像这样

http://localhost/mediabox/home/box/12/language_name

我的控制器中加载主页并在单击语言链接时更改内容的方法如下

    public function box() {
        $url = $this->pageURL();
        $id_from_url = explode('/', $url);

        if (isset($_GET['bid'])) {
            $id = $this->input->get('bid');
        }
        else{
            $id = $id_from_url[6];
        }
        $query = $this->db->get_where('mc_boxes', array('idmc_boxes' => $id));
        $row = $query->row();
            if (isset($_GET['bid'])) {
                $box_id = $this->input->get('bid');
            } 
            else {
                $box_id = $row->idmc_boxes;
            }
            $customer_id = $row->customers_idcustomers;
            if (isset($_GET['ln'])) {
                $language_id = $this->input->get('ln');
            }
            else {
                $language_id = $row->languages_idlanguages;
            }
            $template_id = $this->Home_model->getTemplateID($box_id);
            $data['template_data'] = $this->Home_model->getTemplateData($template_id);
            $data['variables_data'] = $this->Home_model->getVariables($customer_id, $language_id);
            $data['titles_data'] = $this->Home_model->getTitles($box_id,$language_id);
            $data['categories'] = $this->Home_model->getCategories($customer_id, $language_id);
            $data['languages'] = $this->Home_model->getLanguages($box_id);
            $this->load->view('template/index', $data);

    }

有什么想法吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

您可以为控制器功能定义多个参数。但是多个参数必须具有默认值。

public function box($id, $language = 'en') {
    echo "id: " . $id . " - lang: " . $language;
}

当您的链接http://localhost/mediabox/home/box/12/language_name

这将返回,

id: 12 - lang: language_name

答案 1 :(得分:0)

您可以选择如何从URI中提取数据。这里只有两个。

  1. URI中box/之后的每个细分受众群将作为box方法的参数传递为levye suggested
  2. 使用URL class获取所需信息。
  3. 方法1应该没问题。一旦进入remapping并重写URL,方法2有时会成为你的救赎。

    我建议您阅读CI手册中的this page,以帮助您更好地了解如何将数据传递给控制器​​。

    这可能有助于你理解魔法。

    die(var_dump($this->uri->segment_array()));作为控制器中的第一行,然后从浏览器访问http://localhost/mediabox/home/box/this_is_argument_1/this_is_2/4/500/six/$this->uri->segment(3);将保留字符串this_is_argument_1$this->uri->segment(5) == 4;等。请记住,段1是控制器的名称,2是被调用方法的名称。

    另请注意,URL类由codeigniter自动初始化,因此无需手动加载(也不需要explode()或类似的东西)。

相关问题