2016-10-23 5 views
0

Это страница для расчета заказа продукта. Мой наставник сказал мне, что:yii2: js calulation на стороне сервера

«Код поместил логику расчета кода внутри JavaScript, что означает, что пользователь может просто вводить и изменять содержимое и получать скидку, чтобы сделать его безопасным, может либо выполнить пересчет для отправки на серверной стороне перед отображением или заставить js-функцию вызывать API и возвращать результат вместо логики расчета ввода внутри JS «

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

просмотров:

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

    <?= Html::dropDownList('country', null,['malaysia'=>'Malaysia','singapore'=>'Singapore', 'brunei'=>'Brunei'],['id'=>'country']) ?> 
    <?= Html::textInput('code','',['class'=>'form-control','placeholder'=>'promotion code','id'=>'code', 'style'=>'text-transform:uppercase'])?> 
    <?= 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(); ?> 

ЯШ:

$(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'); 
     } 
    } 
}); 
}); 

контроллеры:

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, 
    ]); 
} 

ответ

0

использование браузера инструменты проверяют, чтобы определить идентификатор каждого полей. Обычно идентификатор по умолчанию в Yii2 начинается с имени вида вместе с «-» и именем поля.

+0

, что я имею в виду: как я могу сделать текущий Js расчет на стороне сервера, чтобы предотвратить инъекции пользователя –

+0

, если вы хотите, чтобы предотвратить инъекции, вы может вычислить все внутри контроллера непосредственно перед сохранением. –

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'] 
    ]; 
... 
} 
?> 
+0

должен создать модель формы? Тогда мне нужно изменить все поле html для формирования поля? Извините, что я запускаю yii-framework в течение недели. –

+0

@YingRuiWong Да, вам нужно создать модель для этой формы и изменить форму на поля формы, используя ** ActiveForm **. Это упростит вашу работу. –

+0

и мои js будут помещены в модель формы или в предложение else? –

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