Php 如何将ajax调用值保存到变量中

Php 如何将ajax调用值保存到变量中,php,ajax,yii,Php,Ajax,Yii,希望你们都好。我有一个问题,就是我使用了一个扩展名,即select2,它在下拉列表中显示所有产品的名称,对我来说效果很好。在我的数据库中,每种产品都有各自的价格。所以,我想在下一个下拉列表中显示所有选定产品的价格总和。因此,我使用ajax将产品id发送给控制器以查找产品价格。不幸的是,我不能将所有的产品价格相加,因为当我添加新产品时,产品的前一个Id会发生变化,而价格也会发生变化。但我想在选择产品时将产品的价格保持在一个变量中 表格编号: <div class="row">

希望你们都好。我有一个问题,就是我使用了一个扩展名,即select2,它在下拉列表中显示所有产品的名称,对我来说效果很好。在我的数据库中,每种产品都有各自的价格。所以,我想在下一个下拉列表中显示所有选定产品的价格总和。因此,我使用ajax将产品id发送给控制器以查找产品价格。不幸的是,我不能将所有的产品价格相加,因为当我添加新产品时,产品的前一个Id会发生变化,而价格也会发生变化。但我想在选择产品时将产品的价格保持在一个变量中

表格编号:

<div class="row">
    <?php echo $form->labelEx($model,'item_list'); ?>
    <?php
    $data = CHtml::listData(Products::model()->findAll(),'id', 'name');
    echo Select2::activeMultiSelect(
        $model, 'item_list', $data, array(
            'required' => 'required',
            'style' => 'width: 270px;',
            'placeholder' => 'Add Product',
            'select2Options' => array(),
            'ajax' => array('type'=>'POST',
                'url'=>$this->createUrl('totalOrderPrice'), //url to call.
                'update'=>'#price', //selector to update
                'data'=>array('item_list'=>'js:this.value'),
            ),
        )
    );

    ?>
    <?php echo $form->error($model,'item_list'); ?>
</div>
我花了很多时间来解决这个问题,但无论如何都解决不了。请帮助某人

提前感谢,,
Shimul

也许你必须看看YII之外的东西,你可以使用javascript,在那里,你可以找到JS库和框架,它们可以帮助你保存变量和计算总和,例如,它具有可观察性,因此每次总和发生变化时都会触发事件,您可以实现执行计算的函数,或者也可以实现具有值的函数。这两个库是我最喜欢的(我使用canjs)。它们轻量级且高效,您可以在需要的地方使用它们,希望这可以帮助您将其存储在用户会话中

Yii::app()->session['products_prices'] += $data->prices
但是,当您从列表中删除项目时,您将面临一个问题

我不知道这个小部件,但肯定有一个.seralize()函数,它会将所有选定的条目id序列化为json字符串数组


然后,您可以在“in”条件下使用此数组对总数进行求和。

因为我没有产品模式,所以我使用了另一个模型,即
User
,为您提供了一个示例,说明如何进行此操作

<div class="row">    
    <?php
    $model=User::model();
    $attribute='products';
    $data =  CHtml::listData(Yii::app()->db->createCommand("select id, concat(RAND()*1000,':',username) as name FROM `User` ")->queryAll(),'id','name');

    echo Select2::activeMultiSelect($model,$attribute, $data,
         array(
            'required' => 'required',
            'style' => 'min-width:200px',           
            'placeholder' => 'Choose User',
            'select2Options'=>array(
                'formatResult'=>'js:format',
                'formatSelection'=>'js:format',
            ),
            'onChange'=>'js:{
                var total=0;
                $($(this).select2("data")).each(function(){
                    total+=this.text.split(":")[0]*1;
                });
                $("#total > label").text(total);
            }',
        )
    );


    $js_format_fun = <<<JS
        function format(opt){
            var price_lbl=opt.text.split(':');              
            return price_lbl[1];
        }
JS;
      Yii::app()->clientScript->registerScript('select2_format_option', $js_format_fun, CClientScript::POS_READY);
    ?>  
</div>
<br/>
<div id="total"><strong>Total Price: </strong><label></label></div>


总价:
你会看到这样的东西:


这样做的目的是避免使用ajax,并在名称中添加价格,例如产品名称的格式为:
price:name
。您可以按照我上面给出的方式拆分价格、命名并计算总价。

当产品价格发生变化时?我会在创建下拉列表时添加一个数据属性,例如
product xyz
,并使用该属性,无需每次添加新产品时获取总价:)@sakhunzai的答案可能也是我实现它的方式。另一种选择是,不要在ajax中使用
update
,而是使用带有回调函数的
success
,并在javascript中添加逻辑来读取当前值,减去以前的成本(如果这是对下拉列表的更改而不是新的选择),添加新的成本,然后更新div@ernie,我不能理解这句话
我不能把所有的产品价格加起来,因为当我添加新产品时,之前的产品Id会发生变化,而价格也会发生变化
。为什么在添加新产品时,产品id会发生变化?@sakhunzai感谢对我帖子的评论。当我选择一个新产品时,ajax将该产品id发送到控制器的方法,该方法使用id从数据库中查找该产品的价格。在这里,我将选择多个产品,并将所有产品价格相加,然后显示下拉列表的下方。但是我不能。谢谢@Claude Janz,你是对的,我已经通过了,并且失败了。让我试试你的以下建议。谢谢你的建议。我试试看。事实上,我的JS有点弱。一旦我发现任何困难,我会问的。
<div class="row">    
    <?php
    $model=User::model();
    $attribute='products';
    $data =  CHtml::listData(Yii::app()->db->createCommand("select id, concat(RAND()*1000,':',username) as name FROM `User` ")->queryAll(),'id','name');

    echo Select2::activeMultiSelect($model,$attribute, $data,
         array(
            'required' => 'required',
            'style' => 'min-width:200px',           
            'placeholder' => 'Choose User',
            'select2Options'=>array(
                'formatResult'=>'js:format',
                'formatSelection'=>'js:format',
            ),
            'onChange'=>'js:{
                var total=0;
                $($(this).select2("data")).each(function(){
                    total+=this.text.split(":")[0]*1;
                });
                $("#total > label").text(total);
            }',
        )
    );


    $js_format_fun = <<<JS
        function format(opt){
            var price_lbl=opt.text.split(':');              
            return price_lbl[1];
        }
JS;
      Yii::app()->clientScript->registerScript('select2_format_option', $js_format_fun, CClientScript::POS_READY);
    ?>  
</div>
<br/>
<div id="total"><strong>Total Price: </strong><label></label></div>