Как передать переменную из представления в контроллер в codeigniter - PullRequest
4 голосов
/ 22 марта 2012

Я хочу передать идентификатор языка для каждой ссылки, которую я нажимаю в моем представлении, на контроллер. Мой код просмотра

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

Массив языков содержит идентификатор языка и название языка

я хочу, чтобы имя было в URL, но не в идентификаторе

URL выглядит так

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

если я отправлю идентификатор языка в URL, он будет виден, иначе он не будет виден в контроллере Как я могу получить идентификатор языка для каждой ссылки в контроллере, не отправляя его в URL

Спасибо

Ответы [ 5 ]

4 голосов
/ 22 марта 2012

передайте имя языка в URL без идентификатора, сравните со столбцом vulg_name в таблице.

Предположим, у вас есть URL: http://localhost/mediabox/home/box/en

controller

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

модель 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);
3 голосов
/ 22 марта 2012

Ваша путаница заключается в том, что вы «возвращаетесь» к контроллеру.Не думайте об этом как о контроллере => View (передавая ему, скажем, $data['something'] переменные).

В основном это <form>, поэтому взгляните на помощник форм , а затемна проверка формы .Это даст вам представление о том, как создать форму с использованием синтаксиса codeigniter.

В вашем контроллере вы должны выполнить проверку, и если она соответствует языку (или тому, что вы отправляете), то вы можете использовать сеансычтобы сохранить его для каждой страницы (чтобы он вам не понадобился в URL).

Сеансы очень просты, а сохранить элемент так же просто, как:

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

Позже, на любом другом контроллере, вы можете проверить переменную

$language = $this->session->userdata('varname');
// load language etc;
1 голос
/ 22 марта 2012

Вы можете сделать это с помощью 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
}
1 голос
/ 22 марта 2012

Создайте таблицу с идентификатором языка и именем языка в базе данных, просто передайте имя языка контроллеру и получите идентификатор языка, выполнив вызов db.

0 голосов
/ 22 марта 2012

Вы сообщаете CodeIgniter, что вы будете получать имя и идентификатор языка в своем действии.

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 и $ language_name == 'en'.

Затем найдите идентификатор языка, используя его имя в качестве помощника или как часть модели языка, как предлагает Майк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...