2013-10-01 3 views
2

Надеюсь, что у вас все хорошо. У меня проблема: я использую расширение i.e. select2, которое показывает имя всех продуктов в раскрывающемся списке, и это отлично работает для меня. В моей базе данных каждый продукт имеет индивидуальную цену. Итак, я хочу показать сумму цены всех выбранных продуктов в следующем раскрывающемся списке. Итак, я использовал ajax для отправки идентификатора продукта контроллеру, чтобы найти цену продукта. К сожалению, я не могу суммировать всю цену продукта, потому что когда я добавляю новый продукт, тогда предыдущий идентификатор продукта получает изменения, тогда цена также меняется. Но я хочу держать цену продуктов в переменной при выборе продукта.Как сохранить значения вызова 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 Ответ, скорее всего, будет и моим. Альтернативой является вместо использования 'update' в вашем ajax, используйте' success' с функцией обратного вызова и добавьте логику в javascript для чтения текущего значения, вычтите предыдущую стоимость (если это было изменение в раскрывающемся списке, а не в новый выбор), добавьте новую стоимость и обновите div. , , , – ernie

ответ

0

Поскольку у меня нет схемы продуктов, я использовал другую модель i.e 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

Идея заключается в том, чтобы избежать Аякса и добавить цены на имена например название продукта будет иметь формат: price:name. Вы разделяете цену, имя и вычисляете общее количество, как я выше.

+0

благодарит за вас хороший совет. Я попробую. На самом деле, я немного слаб в JS. Я спрошу, как только у меня возникнут трудности. – StreetCoder

0

Может быть, вы должны смотреть за YII, вы можете использовать JavaScript для этого, там можно найти библиотеки JS и структуры, которые могут помочь вам сохранить переменные и рассчитать сумму , например, CanJS имеет can.compute, который имеет наблюдаемую природу, поэтому он запускает события каждый раз, когда сумма изменяется, и вы можете реализовать функцию, которая выполняет расчет, или KnockoutJS тоже имеет computed. Эти две библиотеки являются моими любимыми (я использую canjs), они являются легкими и эффективными и вы можете использовать их именно там, где вам нужно, надеюсь, это поможет вам

0

хранить его в сессии пользователя

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

Но вы будете сталкиваться с проблемой, когда вы удалите элементы из списка

Я не знаю, этот виджет, но есть, конечно, .seralize) функция ведьма сериализации (все выбранные элементы id в массив строк json.

Затем вы можете использовать этот массив в «состоянии», чтобы суммировать общее количество.

+0

спасибо @Claude Janz, вы правы, и я уже прошел и потерпел неудачу. Позвольте мне попробовать ваши советы. – StreetCoder

Смежные вопросы