validator validate form create yii2

validate - Calcular desde 3 campos de entrada en forma dinámica yii2



yii2 compare (1)

En mi forma dinámica, necesito calcular datos de 3 campos (cantidad, tasa, descuento) y pasarlo a la unidad de descuento. La fórmula será - unitdiscount = ((qty*rate*discount)/100) . Ya tengo onchange event ( getValue ) en inputfield qty y lo calculo a medida que paso (qty*rate) a value . Cuando agregue el nuevo onchange ( getUnitdiscount ), no se pasa el value campo calcificado. En lugar de eso, obtengo unitdiscount . Además, no estoy seguro de cómo puedo calcular a partir de 3 campos de entrada.

Calculé el value con la ayuda de Pasar los datos calculados en un texbox no desde ningún modelo en forma dinámica yii2

Mi código actual parece ...

_formar

<div class="col-xs-1 col-sm-1 col-lg-1 nopadding"> <?= $form->field($modelsProductsales, "[{$i}]rate")->label(false)->textInput([''maxlength'' => true,''onchange'' => ''getValue($(this))'', ''onkeyup'' => ''getValue($(this))'',''onchange'' => ''getUnitdiscount($(this))'', ''onkeyup'' => ''getUnitdiscount($(this))'',''placeholder'' => ''Rate'']) ?> </div> <div class="col-xs-1 col-sm-1 col-lg-1 nopadding"> <?= $form->field($modelsProductsales, "[{$i}]qty")->label(false)->textInput([''maxlength'' => true,''onchange'' => ''getTotal($(this))'', ''onkeyup'' => ''getTotal($(this))'',''onchange'' => ''getValue($(this))'', ''onkeyup'' => ''getValue($(this))'',''onchange'' => ''getUnitdiscount($(this))'', ''onkeyup'' => ''getUnitdiscount($(this))'',''placeholder'' => ''Qty'']) ?> </div> <div class="col-xs-1 col-sm-1 col-lg-1 nopadding"> <?= $form->field($modelsProductsales, "[{$i}]free")->label(false)->textInput([''maxlength'' => true,''onchange'' => ''getTotal($(this))'', ''onkeyup'' => ''getTotal($(this))'',''placeholder'' => ''Free'']) ?> </div> <div class="col-xs-1 col-sm-1 col-lg-1 nopadding"> <?= $form->field($modelsProductsales, "[{$i}]discount")->label(false)->textInput([''maxlength'' => true,''placeholder'' => ''Discount'']) ?> </div> <div class="col-xs-1 col-sm-1 col-lg-1 "> <input type="text" class="form-control" id="productsales-<?= $i ?>-value"> </div> <input type="text" class="form-control" id="productsales-<?= $i ?>-unitdiscount">

Función JS

<?php /* start getting the product value */ $script = <<< JS function getValue(item) { var index = item.attr("id").replace(/[^0-9.]/g, ""); var total = current = next = 0; var id = item.attr("id"); var myString = id.split("-").pop(); if(myString == "qty") { fetch = index.concat("-rate"); } else { fetch = index.concat("-qty"); } temp = $("#productsales-"+fetch+"").val(); if(!isNaN(temp) && temp.length != 0) { next = temp; } current = item.val(); if(isNaN(current) || current.length == 0) { current = 0; } if(!isNaN(current) && !isNaN(next)) { total =parseFloat((parseFloat(current) * parseFloat(next))).toFixed(2); } valueField = "productsales-".concat(index).concat("-value"); $("#"+valueField+"").val(total); } JS; $this->registerJs($script, View::POS_END); /* end getting the product value */ ?> <?php /* start getting the product Unit discount */ $script = <<< JS function getUnitdiscount(item) { var index = item.attr("id").replace(/[^0-9.]/g, ""); var total = current = next = 0; var id = item.attr("id"); var myString = id.split("-").pop(); if(myString == "qty") { fetch = index.concat("-rate"); } else { fetch = index.concat("-qty"); } temp = $("#productsales-"+fetch+"").val(); if(!isNaN(temp) && temp.length != 0) { next = temp; } current = item.val(); if(isNaN(current) || current.length == 0) { current = 0; } if(!isNaN(current) && !isNaN(next)) { total =parseFloat((parseFloat(current) * parseFloat(next))).toFixed(2); } unitdiscountField = "productsales-".concat(index).concat("-unitdiscount"); $("#"+unitdiscountField+"").val(total); } JS; $this->registerJs($script, View::POS_END); /* end getting the product Unit discount */ ?>

Actualización: he cambiado los inptfields y he puesto onchange(getUnitdiscount) delante de onchange ( getUnitdiscount ). Ahora estoy obteniendo la unitdiscount tanto en unitdiscount como en value .

He intentado con el siguiente javascript que no da el resultado correcto.

<?php /* start getting the total udisc */ $script = <<< JS function getUdisc(item) { var index = item.attr("id").replace(/[^0-9.]/g, ""); var total = current = next = previous =0; var id = item.attr("id"); var myString = id.split("-").pop(); if(myString == "qty") { fetch2 = index.concat("-discount"); fetch1 = index.concat("-rate"); } else if(myString == "discount") { fetch3 = index.concat("-qty"); fetch1 = index.concat("-rate"); } else { fetch2 = index.concat("-discount"); fetch3 = index.concat("-qty"); } temp = $("#productsales-"+fetch1+"").val(); if(!isNaN(temp) && temp.length != 0) { next = temp; } current = item.val(); if(isNaN(current) || current.length == 0) { current = 0; } previous = item.val(); if(isNaN(previous) || previous.length == 0) { previous = 0; } if(!isNaN(current) && !isNaN(next) && !isNaN(previous)) { total = parseFloat(current) + parseFloat(next) + parseFloat(previous); } udiscField = "productsales-".concat(index).concat("-udisc"); $("#"+udiscField+"").val(total); } JS; $this->registerJs($script, View::POS_END); /* end getting the total udisc */ ?>

Mediante este javascript, si pongo rate = 50.50 , qty = 100 , discount = 10 debería dar el resultado 160.50 pero da 70.50 . (He tomado una fórmula simple como unitdiscount = rate + qty + discount para probar si unitdiscount = rate + qty + discount los valores correctamente, luego puedo cambiar la fórmula a una compleja).


Pruebe de esta manera:

function getUdisc(item) { var index = item.attr("id").replace(/[^0-9.]/g, ""); var total = current = next = previous = 0; var id = item.attr("id"); var myString = id.split("-").pop(); if (myString == "qty") { fetch1 = index.concat("-discount"); fetch2 = index.concat("-rate"); } else if (myString == "discount") { fetch1 = index.concat("-qty"); fetch2 = index.concat("-rate"); } else { fetch1 = index.concat("-discount"); fetch2 = index.concat("-qty"); } temp1 = $("#productsales-"+fetch1+"").val(); temp2 = $("#productsales-"+fetch2+"").val(); if (!isNaN(temp1) && temp1.length != 0) { next = temp1; } if (isNaN(temp2) || temp2.length == 0) { previous = temp2; } current = item.val(); if (isNaN(current) || current.length == 0) { current = 0; } if (!isNaN(current) && !isNaN(next) && !isNaN(previous)) { total = (parseFloat(current) + parseFloat(next) + parseFloat(previous)).toFixed(2); } udiscField = "productsales-".concat(index).concat("-udisc"); $("#"+udiscField+"").val(total); }