【问题标题】:How to save ajax calling values into a variable如何将ajax调用值保存到变量中
【发布时间】:2013-10-07 12:52:47
【问题描述】:

希望你们一切都好。我有一个问题,我使用了一个扩展,即 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>

控制器代码:

...

...

public $prices;
...

...     
public function actionTotalOrderPrice(){
    $data = Products::model()->findByPk(array('id'=>$_POST['item_list']));
    $this->prices += $data->prices;
    echo CHtml::tag('input', array( 'type'=>'text' , 'name'=>'Order[price]' , 'value' => $this->prices));
}

我花了很多时间来解决这个问题,但无论如何都解决不了。请帮助某人。

提前致谢, 希穆尔

【问题讨论】:

  • 产品价格何时变动?
  • 我会在创建下拉列表时添加一个数据属性,例如&lt;option data-price="34" &gt;Product xyz&lt;/option&gt;,并使用该属性,每次添加新产品时都无需获取总价:)
  • @sakhunzai 的回答很可能也是我实施它的方式。另一种方法是在你的ajax中使用update,而不是在你的ajax中使用success,并在javascript中添加逻辑来读取当前值,减去以前的成本(如果这是对下拉菜单的更改而不是新选择),添加新成本,并更新 div 。 . . .
  • @ernie ,我无法理解I can't sum all of product price because when I add new product then previous Id of product gets change then price also gets change这句话。为什么添加新产品时产品 ID 会发生变化?
  • @sakhunzai 感谢您对我的帖子发表评论。当我选择一个新产品时,ajax 将该产品 id 发送到控制器的方法,该方法使用该 id 从数据库中找到该产品的价格。在这里,我将选择多个产品并将所有产品价格相加并显示在下拉列表下方。但我做不到。

标签: php ajax yii


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    将其存储在用户会话中

    Yii::app()->session['products_prices'] += $data->prices
    

    但是当您从列表中删除项目时会遇到问题

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

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

    【讨论】:

    • 感谢@Claude Janz,你是对的,我已经通过并失败了。让我试试你的以下提示。
    【解决方案3】:

    由于我没有 products 架构,我使用了另一个模型,即 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。你按照我上面给出的价格,命名并计算总数。

    【讨论】:

    • 感谢您的好建议。我会尽力。实际上,我在 JS 方面有点弱。一旦我发现任何困难,我会问。
    猜你喜欢
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多