yii2:服务器端的js calulation

时间:2016-10-23 07:10:30

标签: yii2 serverside-javascript

这是一个用于计算产品订单的页面。 我的导师告诉我:

"代码将代码计算逻辑放在JavaScript中,这意味着,用户可以简单地注入和修改内容并获得折扣以使其安全,可以在显示之前对服务器端的提交进行重新计算,或者制作js函数调用API,并在JS"

中返回结果而不是put计算逻辑

但我真的无法得到它,我怎么能在服务器端制作?

的观点:

$(document).ready(function() {
var qty=$('#qty').val();
var subtotal=$('#subtotal').val();  
$('#discount').val(0);
$("#apply").click(function()  {  
    var code=$('#code').val().toUpperCase();
    var off5=(subtotal*0.05).toFixed(2);
    var off15=15;

    if(code=='OFF5PC'){
        if (qty>=2)
            $('#discount').val(off5);
        else{
            $('#discount').val(0);
            alert('At least 2 quantities');
        }
    }
    else if(code=='GIVEME15'){
        if(subtotal>=100)
            $('#discount').val(off15);
        else{
            $('#discount').val(0);
            alert('Minumum puchase of RM100');
        }
    }
    else{
        $('#discount').val(0);
        alert('Invalid promotion code');
    }
    if ($('#discount').val()=='0'){
        $('#code').val('');
    }
});


if(qty>=2||subtotal>=150){
    $('#ship').val(0);
    $('#shipping').html('0');
}
else{
    $('#ship').val(10);
    $('#shipping').html('10');
}
$("#country").change(function() {
    var country=$('#country').val();

    if(country=='malaysia'){
        if(qty>=2||subtotal>=150){
            $('#ship').val(0);
            $('#shipping').html('0');
        }
        else{
            $('#ship').val(10);
            $('#shipping').html('10');
        }
    }
    else if(country=='singapore'){
        if(subtotal>=300){
            $('#ship').val(0);
            $('#shipping').html('0');
        }
        else{
            $('#ship').val(20);
            $('#shipping').html('20');
        }
    }
    else if(country=='brunei')  {
        if(subtotal>=300){
            $('#ship').val(0);
            $('#shipping').html('0');
        }
        else{
            $('#ship').val(25);
            $('#shipping').html('25');
        }
    }
});
});

JS:

public function actionSummary()
{
    $id=Yii::$app->request->post('id');
    $qty=Yii::$app->request->post('qty');
    $discount=Yii::$app->request->post('discount');
    $shipping=Yii::$app->request->post('ship');
    $subtotal=Yii::$app->request->post('subtotal');
    $area=Yii::$app->request->post('country');
    $code=Yii::$app->request->post('code');
    $summary=Products::findOne($id);

    return $this->render('summary', [
        'model' => $summary,
        'quantity'=>$qty,
        'discount'=>$discount,
        'shipping'=>$shipping,
        'subtotal'=>$subtotal,
        'area'=>$area,
        'code'=>$code,
    ]); 
}

控制器:

socket.on("message", function(data) {...})

2 个答案:

答案 0 :(得分:0)

使用浏览器工具检查以确定每个字段的ID。通常,Yii2中的默认ID以view_name与" - "结合开始。和字段名称。

答案 1 :(得分:0)

要验证表单onsubmit,您可以在表单中启用ajaxvalidation,如下所示。

查看:

<?php $form = ActiveForm::begin([
'action'=>['summary'],
'enableAjaxValidation' => true,
'id'=>'order-form',
]); ?>

    <?= $form->field($model, 'country')->dropDownList(['malaysia'=>'Malaysia','singapore'=>'Singapore', 'brunei'=>'Brunei']) ?>
    <?= $form->field($model, 'code', ['options' => ['class' => 'form-control', 'id'=>'code']])->textInput(['placeholder'=>'promotion code'])?>
    <?= Html::button('Apply', ['class' => 'btn btn-primary', 'id'=>'apply']) ?>

    <?= Html::hiddenInput('id', $model->id) ?>
    <?= Html::hiddenInput('discount', '', ['id'=>'discount']) ?>
    <?= Html::hiddenInput('ship','',['id'=>'ship']) ?>
    <?= Html::hiddenInput('qty', $qty, ['id'=>'qty']) ?>
    <?= Html::hiddenInput('subtotal', $subtotal, ['id'=>'subtotal']) ?>

    <?= Html::submitButton('Checkout', ['class' => 'btn btn-primary']) ?>
<?php ActiveForm::end(); ?>

在您的控制器文件中,请在插入数据库之前在控制器中添加ajax验证代码。下面是用于从服务器端验证的示例ajax验证代码。

控制器:

public function actionYourActionName(){
   $model = new YourModelClass();
   if ($model->load(Yii::$app->request->post())) {
        if (Yii::$app->request->isAjax) {
           Yii::$app->response->format = yii\web\Response::FORMAT_JSON;
           return ActiveForm::validate($model);
        }

        if($model->save())){
           //after successful save if you want to do any thing those codes will goes here.
        }
   }
   return $this->render('your-view-file-name', ['model' => $model]);
}

型号:

<?php
namespace app\models;
use yii;
use yii\db\ActiveRecord;

class YourModelClass extends ActiveRecord
{

...
public function rules(){
    return [
      [['id', 'discount', 'ship', 'qty', 'subtotal'], 'safe'],
      [['country', 'code'], 'required']
    ];
...
}
?>