【问题标题】:codeigniter ajax not setting sessions asynchronouslycodeigniter ajax 没有异步设置会话
【发布时间】:2015-03-02 18:40:40
【问题描述】:

我是 codeigniter ajax 的新手,我的会话有问题。我的会话没有设置和取消设置 异步,我必须刷新页面才能看到更改。

视图/标题:

    <?php
if(!empty($product)){
$pid=$product[0]['product_id'];

}

?>
<script>
$(document).ready(function(){
    if($('.add_to_basket').find('img')){
$('.add_to_basket').click(function(){
        var message=$('#badgemessage');
    $('#msgcart').append(message);
    message.show('slow');
    var trigger=$(this);
    var param=trigger.attr("rel");
    var item=param.split("_");
            $.ajax({

                type: 'POST',
                url: '<?= base_url()."cart_c/myfunk/".$pid?>',

                data: { id: item[0], job: item[1] },
                dataType:'json',
                success: function(data) {
                           console.log(data);       
                },
                error:function(){
                alert("error");
                }
            });
            return false;

});
    }
});



</script>

模型/篮子模型:

<?php
class Basket_model extends CI_Model{

    function activeButton($sess_id){
        $e=$this->session->userdata('basket');
        if(isset($e[$sess_id])){
        $id=0;
        $label="<img src='".base_url()."images/remove.png' />";
        }else{
            $id=1;
            $label="<img src='".base_url()."images/add.png' />";
        }
        $out="<a href='#' class='add_to_basket' rel='".$sess_id."_".$id."'>".$label."</a>";
        return $out;
    }

    function setItem($pide,$qty=1){
        $e=$this->session->userdata('basket');
        if(isset($e)){
    $e[$pide]['qty']=$qty;
    $this->session->set_userdata('basket',$e);
        }else{
            $arr=array($pide=>array('qty'=>$qty));
            $this->session->set_userdata('basket',$arr);
        }
}
    function removeItem($pide,$qty=null){
        $e= $this->session->userdata('basket');
        if($qty != null && $qty < $e[$pide]['qty']){
            $e[$pide]['qty']=($e[$pide]['qty']-$qty);
            $this->session->set_userdata('basket',$e);
        }else{
            $e[$pide]=null;
            unset($e[$pide]);
            $this->session->set_userdata('basket',$e);


        }

    }
}
?>

控制器/cart_c:

<?php
class Cart_c extends CI_Controller{

    function __construct(){
        parent::__construct();
        $this->load->model('catalogue_model');
        $this->load->model('products_model');
        $this->load->model('basket_model');


    }

    function myfunk($id){
    if(isset($_POST['id']) && isset($_POST['job'])) 
    $out=array();
    $pid=$_POST['id'];
    $job=$_POST['job'];
        if(!empty($id)){
            switch($job){
                case 0:
                $this->basket_model->removeItem($pid);
                $out['job']=1;
                break;

                case 1:
                $this->basket_model->setItem($pid);
                $out['job']=0;
                break;

            }
            echo json_encode($out);
        }


    }


}

?>

控制器/产品:

<?php
class Products extends CI_Controller{
    function __construct(){
        parent::__construct();
        $this->load->model('catalogue_model');
        $this->load->model('products_model');
        $this->load->model('basket_model');
    }

    function product($id){
    $kitties['cats']=$this->catalogue_model->get_categories();
    $data['product']=$this->products_model->get_product($id);
    $data['active_button']=$this->basket_model->activeButton($id);
        $this->load->view('header',$data);
        $this->load->view('sidebar',$kitties);
        $this->load->view('product',$data);
        $this->load->view('footer');
    }

}

?>

查看/产品:

<div class="contentwrap">
<div id="content_area">
<?php 

$e=$this->session->userdata('basket');
print_r($e);
if(!empty($product)){
    foreach($product as $p){
        ?>
        <h1><?=$p['product_name']?></h1>
        <div id="product_image">
        <img src="<?=base_url()?>/images/<?=$p['image']?>" width="400" height="300" />
        </div>
        <div id="product_desc">
        <?=$p['description']?>
        <br><br>
        <?=$active_button?>


        </div>
        <?php

    }

}else{
    echo "Product unavailable";
}?>




</div>
</div>

问题是我在产品视图中的 $active_button 没有异步更改,但会话正在设置和取消设置 当我刷新页面时,我可以看到项目被推入和推出会话数组。当我点击按钮时,我的 chrome 控制台显示:object{job:0}

【问题讨论】:

  • 您在产品视图中的print_r($e); 中得到了什么?
  • @CodeGodie 我打印出了所有的购物篮会话...Array ( [10] => Array ( [qty] => 1 ) [1] => Array ( [qty] => 1 ) ) 这意味着我在会话中有两个产品
  • 你想替换到数组中,而不是添加到它对吗?
  • @CodeGodie 仔细看,我有两个函数 setItem() 和 removeItem() 分别通过 ajax 调用,它们正在工作,但我在产品视图中的 $active_button 没有更新为相应的结果
  • 我明白了.. 所以在加载产品页面后,在单击按钮之前。元素的 HTML 看起来如何?是这样的吗:&lt;a href='#' class='add_to_basket' rel='10_1'&gt;&lt;img src='images/add.png' /&gt;&lt;/a&gt;

标签: php jquery ajax codeigniter session


【解决方案1】:

在查看和研究您的代码后确定。您可以通过在进行 AJAX 调用时再次检索按钮来实现您想要的。检索它的方法是再次调用该模型,然后使用 jquery 替换当前按钮。请尝试以下操作:

控制器 - Cart_c

function myfunk($id) {
    if (isset($_POST['id']) && isset($_POST['job'])) {
        $out = array();

        $pid = $_POST['id'];
        $job = $_POST['job'];
        if (!empty($id)) {
            switch ($job) {
                case 0:
                    $this->basket_model->removeItem($pid);
                    $out['active_button'] = $this->basket_model->activeButton($pid);
                    break;

                case 1:
                    $this->basket_model->setItem($pid);
                     $out['active_button'] = $this->basket_model->activeButton($pid);
                    break;
            }
            echo json_encode($out);
        }
    }
}

标题视图中的JS:

<script>
    $(document).ready(function() {

        function add_to_basket($this) {
            var param = $this.attr("rel");
            var item = param.split("_");
            $.ajax({
                type: 'POST',
                url: '<?= base_url() . "cart_c/myfunk/" . $pid ?>',
                data: {id: item[0], job: item[1]},
                dataType: 'json',
                success: function(data) {
                    console.log(data);
                    $this.replaceWith(data.active_button);
                    $('.add_to_basket').click(function() {
                        add_to_basket($(this));
                    });
                },
                error: function() {
                    alert("error");
                }
            });
            return false;
        }

        $('.add_to_basket').click(function() {
            add_to_basket($(this));
        });

    });
</script>

【讨论】:

  • 天哪,老兄,你真棒......非常感谢......我已经努力了两天试图让它工作
  • 没问题,伙计。我最初对您的最终结果应该是什么样子感到有些困惑。我认为您认为前端会自行更新而感到困惑。任何时候你使用 ajax,你只会得到返回的数据来玩,在这种情况下,你需要用旧按钮替换按钮信息,并再次应用函数。我很高兴我能提供帮助
【解决方案2】:

好的,我想也许我们应该从讨论应用程序的正确流程开始。假设您的 URL 看起来像这样 Products/product/10 并且您最初加载页面,您的函数运行时会按预期为您提供右键和产品。假设在这种情况下产品 10 不存在于会话/购物车中,所以您会看到添加图像按钮出现.. 很好.. 现在,当您单击添加时,根据您所说的,它会将产品添加到会话/购物车中,并且您会得到一个返回 JSON 'job:0'。到目前为止,它按我看到的代码的预期工作。返回 job:0 意味着您运行了 setItem 函数。现在你说的问题是视图“没有异步改变”。您的意思是说您希望页面重新加载并再次运行该功能,以便图像现在可以说“删除”?

【讨论】:

  • 但您不想重新加载页面?
  • 不,我为什么要重新加载页面?我只是想让图像改变..这可能吗?
  • 您将重新加载页面,以便产品控制器再次运行,因为目前 myfunk 方法只返回 JSON 对象.. 没有别的。如果要更改图像,则需要修改myfunk 方法,以便在返回任何结果之前,它还会返回会话状态,以便您决定更改图像。我会在 30 分钟后继续帮助你解决这个问题。现在想想分离你的代码的方法,这样你就可以为 ajax 重用一些部分。
  • 我很无奈,我会等待
  • 我已经设法更改图像 onclick 但现在我的页面重新加载..我已将指向 cart_c/myfunk 的链接放在锚标记中并更改了加载视图的功能但这不是我的想要..如果有人可以帮助那将是可怕的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2013-02-08
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多