2012-03-22 120 views
4

我想为每个链接传递一个语言ID,我从视图中单击到控制器。 我的看法代码如何将代码中的变量从视图传递给控制器​​

<?php foreach ($languages as $lang) { ?> 
    <li> 
     <a href="<?php echo base_url(); ?>home/box/<?php echo $template_data['box_id']?>/<?php echo $lang['language_name']?>"></a> 
    </li> 
    <?php } ?> 

我控制器

public function box($box_id=null, $language_name=null, $language_id=null) { 
    /// my function code 
     echo $box_id; 
     echo $language_name; 
     echo $language_id; 
    $data['languages'] = $this->Home_model->getLanguages($box_id); 
    } 

的语言阵列包含语言ID和语言名称

我想要的名字是在URL而不是ID

的URL看起来像这样

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

如果我在url中发送语言ID,则它可见,否则它在控制器中不可见。 我怎样才能在控制每个环节的语言ID,而无需在URL发送它

感谢

+0

尝试使用会话:http://codeigniter.com/user_guide/libraries/sessions.html – 2012-03-22 11:43:06

+0

的问题是:“为什么不是一个变量我路过URL到我的控制器可见”。忽略会话,表单和AJAX的答案,因为他们试图回答一个没有问到的问题。谈话会话还假定您正试图实现站点范围内的本地化,而您的代码示例看起来并非如此。它看起来更像是显示库存,其中每个项目可能以多种语言提供。 – 2012-03-22 16:44:26

回答

4

在不带ID的url中传递语言名称,与表中的languag_name列进行比较。

让我们假设你有网址:http://localhost/mediabox/home/box/en

控制器

<?php 
# I wont write a controller but you should know how to do that, im also writing code as if you are just focusing on getting language. 
public function box(/**pass in your other uri params as needed **/ $lang_name = 'en'){ 
    #you could load this in the constructor so you dont have to load it each time, or in autoload.php if your using it site wide. 
    $this->load->model('lang_model', 'langModel'); 

    #this example shows loading the library and running the function 
    $this->load->library('lang_library'); 
    $this->lang_library->_getLang($lang); 

    #this example shows putting the getLang function inside the controller itsself. 
    self::_getLang($lang); 
} 

库/私有函数

<?php 
private functon _getLang($lang = 'en'){ 
    #run the query to retrieve the lang based on the lang_name, returns object of lang incl id 
    $lang = $this->langModel->getLang($lang_name); 
    if (!$lang){ 
    die('language not found'); 
    }else{ 
    return $lang; 
    } 

郎模型

<?php 
public function getLang($lang_name = 'en'){ 
    $this->db->where('lang_name', $lang_name); 
    $this->db->limit(1); 
    $q = $this->db->get('languages'); 

    if ($q->mysql_num_rows > 0){ 
    return $q->result(); 
    }else{ 
    return false; 
    } 
} 

然后你会有与之相关联的对象的变量,那么你可以简单地调用$lang->lang_name;$lang->lang_id;

会话存储

<?php 
#you could call this in the beginning after using an ajax `$.post();` to retrieve the ID.. the easiest route though is whats above. I use this in my REST APIs 
$this->session->set_userdata('lang', $lang); 
+0

你可以请你提供一些代码 – 2012-03-22 13:03:55

+0

确保做css过滤,如果ci没有为你做,并且确保在那里有错误检查,因为如果用户键入一个未知的lang。另一种选择是使用其他人所说的会话。我稍微编辑了代码,以显示一个简单的例子。 – gorelative 2012-03-22 14:34:05

1

请与数据库中的语言ID和语言名称的表,只是通过语言名称到控制器,并获得语言ID做一个数据库调用。

3

你的困惑是“回传”给控制器。不要认为它从控制器=>查看(通过它说$data['something']变量)。

其基本上是<form>,所以看看form helper,然后在form validation。 这会给你一个如何使用codeigniter语法创建表单的想法。

在您的控制器中,您将进行验证,并且如果它与语言(或您提交的任何内容)匹配,则可以利用会话为每个页面保存它(因此您不需要它在URL中) 。

Sessions是非常简单和节省项目作为一样简单:

$this->session->set_userdata('varname', 'value'); 

后来,每隔控制器上,您可以检查变量

$language = $this->session->userdata('varname'); 
// load language etc; 
+0

我没有提交任何表格 – 2012-03-22 13:05:20

+0

,但你可能是,或者使用ajax(它仍然是一个'POST'或'GET'请求,实际上是一个表单)。 – Jakub 2012-03-22 13:25:48

+0

我不想使用表单我只是想在点击链接 – 2012-03-22 13:28:15

1

你可以使用jQuery做。就像是;

In View;

<ul id="language_selector"> 
    <?php foreach ($languages as $lang) { ?> 
    <li> 
     <a href="javascript:;" class="change-language" data-language="<?php echo $lang['language_name']?>" data-box="<?php echo $template_data['box_id']?>"> 
     <img src="<?php echo base_url(); ?>public/default/version01/images/country_<?php echo $lang['language_name'] ?>.png" width="27" height="18" border="0" /> 
    </a> 
    </li> 
    <?php } ?> 
</ul> 

该JS;

$(function() { 
    $('.change-language').live('click', function() { 
     var language_name = $(this).data('language'); 
     var box_id = $(this).data('box'); 

     $.ajax({ 
      url: '/home/box/'+language_name, 
      type: 'post', 
      data: 'box_id='+box_id, 
      success: function(data) { 
       self.parent.location.reload(); 
      }, 
      error: function(data) { 
       alert('oops, try again'); 
      } 
     }); 
    }); 
}); 

控制器:

public function box($language) { 
    $box_id = $this->input->post('box_id'); 

    // do a llokup on the language as suggested by @vivek 
} 
0

你告诉你会在你的行动同时接受语言名称和ID笨。

public function box($box_id=null, $language_name=null, $language_id=null) { 
} 

改变,要刚刚

public function box($box_id=null, $language_name=null) { 
} 

对于示例URL,你应该再拿到$ box_id == 12和$语言名称== '恩'。

然后用它无论是在一个辅助或者作为麦克暗示语言模型的一部分的名字查找语言ID。

相关问题