我想为每个链接传递一个语言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);
}
languages数组包含语言ID和语言名称
我希望名称在url中,但不是id
网址看起来像这样
http://localhost/mediabox/home/box/12/en
如果我在url中发送语言ID,则它随后可见,否则在控制器中不可见。 如何在控制器中获取每个链接的语言ID而不在url中发送
由于
答案 0 :(得分:4)
在没有ID的网址中传递语言名称,与表格中的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);
答案 1 :(得分:3)
你的困惑在于“传回”给控制器。不要把它想象成来自controller =&gt;查看(传递它说$data['something']
变量)。
它基本上是<form>
,所以请查看form helper,然后查看form validation。
这将让您了解如何使用codeigniter语法创建表单。
在您的控制器中,您将进行验证,如果它与语言(或您提交的任何内容)匹配,那么您可以利用会话为每个页面保存它(因此您不需要在URL中)。
Sessions非常简单,保存项目就像以下一样简单:
$this->session->set_userdata('varname', 'value');
稍后,在每个其他控制器上,您可以检查变量
$language = $this->session->userdata('varname');
// load language etc;
答案 2 :(得分:1)
在数据库中创建一个包含语言ID和语言名称的表,只需将语言名称传递给控制器,然后通过执行db调用获取语言ID。
答案 3 :(得分:1)
你可以使用jQuery来做到这一点。喜欢的东西;
在视图中;
<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
}
答案 4 :(得分:0)
您告诉CodeIgniter您将在行动中同时收到语言名称和ID。
public function box($box_id=null, $language_name=null, $language_id=null) {
}
将其更改为
public function box($box_id=null, $language_name=null) {
}
对于您的示例网址,您应该获得$ box_id == 12和$ language_name =='en'。
然后在Mike的建议中,使用帮助器或语言模型的一部分来查找语言ID。