希望你们都很好。我有一个问题,即我使用扩展名,即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));
}
我花了很多时间来解决这个问题,但无论如何都不能。请帮助别人。
提前致谢, Shimul
答案 0 :(得分:0)
也许您必须在YII之外查看,您可以使用javascript,在那里,您可以找到可以帮助您保存变量和计算总和的JS库和框架,例如CanJS具有{{ 3}}具有可观察的性质,因此每次总和更改时都会触发事件,您可以实现执行计算的函数或can.compute也具有KnockoutJS值这两个库是我最喜欢的(我使用canjs)它们轻巧而有效,您可以在您需要的地方使用它们,希望这可以帮助您
答案 1 :(得分:0)
将其存储在用户会话中
Yii::app()->session['products_prices'] += $data->prices
但是当您从列表中删除项目时,您将遇到问题
我不知道这个小部件,但肯定有.seralize()函数会将所有选定的项目id序列化为json字符串数组。
然后,您可以在“in”条件下使用此数组来总计您的总数。
答案 2 :(得分:0)
由于我没有产品架构,我使用了另一个模型,即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
。你按上面的价格分配价格,名称并计算总额。