2012-03-22 117 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。

相關問題