2013-02-02 31 views
1

我新来CI,并在如何通过则params的疑问,我的方案是:笨传递多个检查参数回视图

1)形式的多选框,视为online_booking.php,用户会检查多个选项。

2)用户点击按钮调用json中的jq ajax post,这将得到控制器中的booking_process的回调参数。

3)返回的结果将在#result div块的视图上打印。

OK,上面的过程工作正常,结果是打印像用户已经检查。

现在是我的问题,我想重新使用回调结果在视图中,即使我有结果打印在视图页上,但我不能使用结果进行进一步处理,我怎么可以使返回结果变成一个变量?

我曾尝试过几种方式,我试着用online_booking?selected=mutipleCheckedValue&sum=500传递方法改变$ config ['permitted_uri_chars']的旧时尚方式,但只取得最后一个选中的值而不是所有选中的值,这意味着即使我检查了复选框与类型A + B + C,在URL中它只能显示类型C的值,我知道这在CI中不是一个好习惯,但如果找不到合适的解决方案可能有助于解决我的疑问。

我甚至尝试在会话中存储选中的值,如控制器$this->session->set_userdata('selected', $conf_type.":".$conf_charge);上所示,它仍然只显示最后一次选中的值。

请给出一个关于如何克服这个问题的建议,因为我已经在这个部分花了很多时间。

online_booking.php查看:

<?php 
$is_logged = $this->simplelogin->is_logged(); 
$active = $this->simplelogin->get_data_user('activate'); 
$user_email = $this->simplelogin->get_data_user('email'); 

if(!$is_logged) { 

    echo "<p>Please login to get access</p>"; 

}else if($active == 0){ 
    echo "<p>Your account is inactive to proceed this page</p>"; 

}else{ 

?> 

<p><h2>Online Booking</h2></p> 

<p><div id="result_msg"></div></p> 

<p> 
<form id="conf_booking_form"> 
    <input type="checkbox" name="cType[]" value="A,200">&nbsp;Type A - USD200<br> 
    <input type="checkbox" name="cType[]" value="B,150">&nbsp;Type B - USD150<br> 
    <input type="checkbox" name="cType[]" value="C,100">&nbsp;Type C - USD100<br> 
    <input type="checkbox" name="cType[]" value="D,50">&nbsp;Type D - USD50<br> 
    <input type="hidden" name="user_email" value="<?php echo $user_email ?>" /> 
    <input type="button" id="btn_conf" name="" value="Book" /> 
    <span id="wait"><img src="<?php echo base_url();?>assets/img/loader.gif" /></span><br /> 
</form> 
</p> 
<p><div id="result" style="color:#606;"></div></p> 

<?php 
} 
?> 

JQuery的阿贾克斯后:

$('#btn_conf').click(function(){ 
    var parameters = $('#conf_booking_form').serialize(); 

    //alert(parameters); 
    $.ajax({ 
     url: baseurl + 'site/booking_process', 
     type: 'POST', 
     data: parameters, 
     dataType: 'json', 
     success: function(output_str){ 
      if(output_str == "false"){ 
       $('#result_msg').html("Select at least one type to proceed booking"); 

      }else{ 
       $('#result').html(output_str); 
       //window.location.replace(baseurl + 'site/online_booking?selected='+output_str.selected+'&sum='+output_str.sum); 
      } 
     } 
    }); 
}); 

控制器:

class Site extends CI_Controller { 

public function online_booking() { 
    $this->load->view('header'); 
    $this->load->view('online_booking'); 
    $this->load->view('footer'); 
} 

public function booking_process(){ 
    $confTypes = $this->input->post('cType'); 
    $user_email = $this->input->post('user_email'); 
    $output_str = NULL; 
    $conf_charge_total = 0; 

    if(!empty($confTypes)){ 

     foreach($confTypes as $confType){ 
      $explode_value = explode(",", $confType); 

      $conf_type = $explode_value[0]; 
      $conf_charge = $explode_value[1]; 

      $conf_charge_total += $conf_charge; //sum up checked values 

      $output_str .= $conf_type.":".$conf_charge.","; 
      /*$output_str = array(
        'selected' => $conf_type.','.$conf_charge, 
        'email' => $user_email, 
        'sum' => $conf_charge_total, 
        'flag' => 'true' 
       );*/ 

      //$this->session->set_userdata('selected', $conf_type.":".$conf_charge); 
     } 

     $output_str .= $conf_charge_total; 

     //$this->session->set_userdata('sum_conf_charges', $conf_charge_total); 

    }else{ 
     $output_str = "false"; 
    } 

    echo json_encode($output_str); 
} 
} 

谢谢。

回答

0

当您在循环内存储set_userdata('selected', ...)时,每次循环时都会覆盖selected。正如你所观察到的那样,这导致最后的值被存储。您可以之前或之后提出这个圈外,和

$this->session->set_userdata('selected', $confTypes); 

或准备一个数组,并且

foreach ($confTypes as $confType){ 
    ... 
    $selected_conf_types[$conf_type] = $conf_charge; 
} 

$this->session->set_userdata('selected', $selected_conf_types); 
+0

感谢存放。如何通过URL传递参数来实现? – conmen

+0

@conmen我对CI并不熟悉,但我认为如果你想加载一个URL,你总是可以使用curl。 –