2013-10-01 32 views
2

希望你們都好。我有一個問題,那就是我使用了一個擴展名,即select2,它在下拉列表中顯示了所有產品的名稱,它對我來說工作正常。在我的數據庫中,每個產品都有單獨的價格。所以,我想在下一個下拉列表中顯示所有選定產品價格的總和。因此,我使用ajax將產品ID發送給控制器以查找產品價格。不幸的是,我不能總結所有的產品價格,因爲當我添加新產品時,產品的以前的Id得到改變,價格也得到改變。但是,我希望在選擇產品時將產品的價格保留在變量中。如何將ajax調用值保存到變量中

表單代碼:

<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

產品價格變動時? – sakhunzai

+1

我會在創建下拉列表時添加一個數據屬性,例如'',並且每次添加新產品時不需要獲取總和價格:) – sakhunzai

+0

@ sakhunzai's答案可能是我如何實施它。另一種方法是在您的ajax中使用'update',在回調函數中使用'success',並在javascript中添加邏輯以讀取當前值,減去以前的成本(如果這是對下拉菜單的更改而不是新的選擇),添加新的成本,並更新div。 。 。 。 – ernie

回答

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> 

你會看到某事像這樣:

enter image description here

這樣做是爲了避免Ajax和增加的價格名稱e.g產品名稱將是格式:price:name。你按照上面給出的價格,名稱和總額計算總價。

+0

感謝您的好建議。我會盡力。其實,我在JS方面有點弱。一旦我發現任何困難,我會問。 – StreetCoder

0

也許你不得不YII外面看,你可以使用JavaScript這一點,在那裏,你可以找到的JS庫和框架誰可以幫助你節省變量和計算總和,例如CanJScan.compute它有一個可觀察的性質,所以它會在每次總和改變時觸發事件,並且你可以實現執行計算的函數或者KnockoutJS也有computed值。這兩個庫是我最喜歡的(我使用canjs)它們是輕量級和有效的你可以在需要的地方使用它們,希望這可以幫到你

0

儲存於用戶會話

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

但是,當你從你的列表中刪除項目

我不知道這個小部件,但肯定是有.seralize你會面臨一個問題()函數女巫會序列所有選定的項目id到一個json字符串數組中。

然後你可以在「in」條件下使用這個數組來計算總和。

+0

謝謝@克勞德揚斯,你是對的,我已經通過並失敗了。讓我試試你的以下提示。 – StreetCoder

相關問題