如何在codeigniter中将变量从视图传递到控制器

时间:2012-03-22 11:39:52

标签: php codeigniter

我想为每个链接传递一个语言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中发送

由于

5 个答案:

答案 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);
}

library / private function

<?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;
  }

lang model

<?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。