Pedir DNI en el checkout (Magento 2.3)

bravo_88

Miembro
Hola,

estoy buscando como añadir el dni en el checkout cuando la comrpa sea superior a 400€. Encontre esta solucion:


Pero solo es aplicable cuando el usuario añade una nueva direccion o es invitado (porque es cuando se pide el campo) Que ocurre con un usuario ya logueado? Como le obligo a poner el dni en compras superiores a ese precio en la sección del checkout?

Alguien conoce alguna manera?

Gracias, un saludo!
 

Toni FactoriaDigital

Experto en Magento de Factoría Digital
Miembro del equipo
Hola bravo,

Como idea, se me ocurre que podrías poner un condicional que compruebe el subtotal de la compra y muestre el campo en cualquier paso que lo quisieras poner, no necesariamente en las direcciones.
Si además no necesitas validación de que sea un campo requerido, más fácil aún, ya que con que establezcas que el input tenga como nombre shipping_address[vat_id] (este dato te lo estoy dando de memoria, puede que el name sea distinto), debería aceptarlo como campo de la dirección.

Un saludo.
 

bravo_88

Miembro
Si, el campo seria requerido siempre que la compra sea +400. De tu propuesta entiendo que en el checkout deberia poner el input:

<input name="shipping_address[vat_id] " id="" value="".../>

Y esto lo reconoceria como el DNI y lo trataría en BD y demas una vez haga el submit?
 

Toni FactoriaDigital

Experto en Magento de Factoría Digital
Miembro del equipo
Sí, debería, ya que al final es un formulario AJAX y se procesa el quote con los parámetros recibidos por POST y ese input se mandará también al estar dentro del mismo formulario.

El input sería tal y como comentas, sí, siempre y cuando el name sea el correcto, que es del que te he comentado que te lo dije de memoria. Si quieres, compáralo con el de una nueva dirección o pedido de invitado, que ahí seguro que te queda más claro.

Al ser requerido, ya no sé si podrás validarlo siempre, aunque siempre puedes hacer uso de los validadores de formulario en frontend de Magento, poniendo un required-entry o similar como class del input, aunque sea.

Un saludo.
 

bravo_88

Miembro
A ver, he procedido de otra manera. Mi intención es ocultar siempre el campo dni en el checkout y mostrarlo si la compra es superior a 400. Consigo recuperar el total de la compra y hago la correspondiente condición y funciona, siempre y cuando utilice un evento onclick de javascript.


Insertar CODE, HTML o PHP:
<script >

      function myFunction() {

         document.getElementsByName("vat_id")[0].style.display='none';

        document.getElementsByName("shippingAddress.vat_id")[0].style.display='none';

      }

</script>

window.onload = myFunction;

Ese trozo (simplificado) me funciona siempre y cuando un boton tenga el evento onclick. Si veis tengo dos elementos que cojo (vad_id) y (shippingAddress.vat_id).


El de vad_id es uno que yo puse para ver si podia mostrarlo y ocultarlo. Una vez que funcionaba probe con el del formulario del checkout, el segundo. Bien pues funcionan con onclick. Pero quiero que esto funcione cargandose la pagina asi que utilizo: window.onload = myFunction;


En este caso me oculta de primera hora mi campo llamado vat_name pero el del formulario del checkout(shippingAddress.vat_id) no se oculta. Y esta correcto porque como digo con onclick funciona... Creo que tiene que ver algo mas con ajax o la manera que carga el formulario ( que no se como lo hace)


Todo este código lo estoy implementando en vendor/magento/module-checkout/view/frontend/templates/onepage.html


Aqui el código completo:


Insertar CODE, HTML o PHP:
<?php

/**

* Copyright © Magento, Inc. All rights reserved.

* See COPYING.txt for license details.

*/


/** @var $block \Magento\Checkout\Block\Onepage */

?>


<?php

//cogemos el total del carro

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

$cart = $objectManager->get('\Magento\Checkout\Model\Cart');

$grandTotal = $cart->getQuote()->getGrandTotal();

echo "total:".$grandTotal;


//si el total es mayor a x ocultamos campo VAT


if ($grandTotal>=10) {

?>

<button onclick ="myFunction()">Disable Text field</button>

<input name="vat_id" id="vat_id" value="..." />






<?php

}

elseif ($grandTotal<10) {

    echo "no dni";

}

?>


<div id="checkout" data-bind="scope:'checkout'" class="checkout-container">

    <div id="checkout-loader" data-role="checkout-loader" class="loading-mask" data-mage-init='{"checkoutLoader": {}}'>

        <div class="loader">

            <img src="<?= $block->escapeUrl($block->getViewFileUrl('images/loader-1.gif')) ?>"

            alt="<?= $block->escapeHtmlAttr(__('Loading...')) ?>"

            style="position: absolute;">

        </div>

    </div>

    <!-- ko template: getTemplate() --><!-- /ko -->

    <script type="text/x-magento-init">

        {

            "#checkout": {

            "Magento_Ui/js/core/app": <?= /* @noEscape */ $block->getJsLayout() ?>

        }

    }

</script>

<script>

    window.checkoutConfig = <?= /* @noEscape */ $block->getSerializedCheckoutConfig() ?>;

        // Create aliases for customer.js model from customer module

        window.isCustomerLoggedIn = window.checkoutConfig.isCustomerLoggedIn;

        window.customerData = window.checkoutConfig.customerData;

       // window.onload = myFunction;

    </script>

    <script >

      function myFunction() {

         document.getElementsByName("vat_id")[0].style.display='none';

        document.getElementsByName("shippingAddress.vat_id")[0].style.display='none';

      }

   

</script>

    <script>

        require([

            'mage/url',

            'Magento_Ui/js/block-loader'

            ], function(url, blockLoader) {

                blockLoader("<?= $block->escapeJs($block->escapeUrl($block->getViewFileUrl('images/loader-1.gif'))) ?>");

                return url.setBaseUrl('<?= $block->escapeJs($block->escapeUrl($block->getBaseUrl())) ?>');

            })

         window.onload = myFunction;

        </script>


    </div>

A ver si alguien me arroja luz y porque con windows.onload no me funciona


Gracia!
 

josecruzchavez

Nuevo usuario
Creo más conveniente crear un plugin que te permita realizar una verificación cuando se actualice el precio, esto por el tema de los cupones o las reglas de carrito.
En el siguiente enlace te muestran como crear un plugin que se ejecuta después de que se actualice le precio
 
Arriba