2

どうぞよろしくお願いいたします。ドロップダウン リストにすべての製品の名前を表示する 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));
}

この問題を解決するために多くの時間を費やしましたが、とにかくできませんでした。誰か助けてください。

前もって感謝します、シムル

4

3 に答える 3

0

おそらく、YII の外を見る必要があります。これには javascript を使用できます。変数を保存して合計を計算するのに役立つ JS ライブラリとフレームワークを見つけることができます。たとえば、CanJSには観察可能な性質を持つcan.computeがあります。合計が変化するたびにイベントが発生し、計算を行う関数を実装したり、KnockoutJSも値を計算したりできます。この 2 つのライブラリは私のお気に入りです (私は canjs を使用しています)。あなたを助けることができます

于 2013-10-02T08:08:09.990 に答える
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>

次のような sth が表示されます。

ここに画像の説明を入力

アイデアは、ajax を回避し、名前に価格を追加することです。たとえば、製品名の形式はprice:name. 上記のように、価格、名前を分割し、合計を計算します。

于 2013-10-03T09:10:08.883 に答える