Coger el pais seleccionado en el summary checkout (Magento 2)

bravo_88

Miembro
Buenas,

tengo que mostrar un periodo de envio estimado en el summary del checkout. La logica es:
PHP:
 $getCountry = $this->getQuote()->getShippingAddress()->getCountry();
      
        if($getCountry  == "ES"){
            echo "<p><strong>Tiempo estimado de env&iacute;o: 48 H</strong></p>";
        }
        else{
            echo "<p><strong>Tiempo estimado de env&iacute;o: 96 H</strong></p>";
        }
        ?>
Esto lo hago en: /var/www/clients/client1/web5/web/vendor/magento/module-checkout/view/frontend/templates/cart/shipping.phtml.

Lo que ocurre es que en $getCountry = $this->getQuote()->getShippingAddress()->getCountry(); guardo el pais de la direcion agregada por el usuario en su libro de direcciones, pero necesito coger el pais que se selecciona en el momento de la simulación de envio en el sumary como muestro en la captura.

Gracias!!

Un saludo!
 

Adjuntos

Toni FactoriaDigital

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

Al recargarse a través de AJAX, la dirección de envío que recoges a través de PHP es el valor que tenía el objeto cuando cargaste la página, por tanto, siempre que cambie el selector, en principio tendrías que recargar la página para ver aplicado tu cambio.

Si quieres hacerlo en vivo, deberías utilizar KnockoutJS en la plantilla que estés utilizando o haciendo uso de requirejs, inyectando el quote y la dirección de envío para recoger el valor.
Sin haberlo probado, podrías utilizar algo así:

JavaScript:
require([
        'jquery',
        'Magento_Checkout/js/model/quote'
    ], function($, quote) {
        $('#target').on('change', function(e) {
            var shippingAddress = quote.shippingAddress();
            var country = shippingAddress.getCountry();
        });
    });
Recuerda cambiar #target por el ID de tu selector de país.

Espero que te sirva,
Un saludo.
 

bravo_88

Miembro
buah, pues no tengo ni idea de KnockoutJS ... tengo poca experiencia en M2... Donde debería poner ese código? porque entiendo que en el phtml que estoy trabjando no, no?
 

Toni FactoriaDigital

Experto en Magento de Factoría Digital
Miembro del equipo
Sí, ese fragmento te puede servir dentro del phtml, ya que es requirejs. Prueba primero con ese y a ver qué tal.
Lo único que deberás cambiar es el ID del selector HTML, sustituyendo #target en el snippet que te he pasado.

Si tras var country, etc, pones:

console.log(country);

Deberías ver por consola el código de país que está cogiendo cada vez que cambies el selector. Si te devuelve el que necesitas, ya solo tendrás que mostrar el mensaje que corresponda, que podría ser mostrando u ocultando un DIV en la página, si no te quieres poner a hacer virguerías.

Un saludo.
 

bravo_88

Miembro
No consigo nada. Si en la consola pongo el codigo me sale un "localRequire..." como viene en la captura...

Lo siento, pero es que de KnockoutJS no tengo ni idea...
 

Adjuntos

Toni FactoriaDigital

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

En consola no puedes ponerlo directamente, ya que requirejs funciona diferente. Suele localizar las dependencias y las agrupa juntas, creando la inyección de la librería.
Si lo ejecutas directamente, no funcionará, solo deberías probar a pegar la parte de jQuery, que es a partir de $('#country_id'), si es que quieres probarlo directamente ahí.

De todas formas, ¿has probado a ponerlo en el .phtml dentro de un tag <script> y no te ha funcionado?

Un saludo.
 

bravo_88

Miembro
Si, ahi está el código:
PHP:
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

?>
<?php /** @var $block \Magento\Checkout\Block\Cart\Shipping */ ?>

<div id="block-shipping"
class="block shipping"
data-mage-init='{"collapsible":{"openedState": "active", "saveState": true}}'
>
<div class="title" data-role="title">
    <strong id="block-shipping-heading" role="heading" aria-level="2">
        <?= $block->getQuote()->isVirtual()
        ? $block->escapeHtml(__('Estimate Tax'))
        : $block->escapeHtml(__('Estimate Shipping and Tax'))
        ?>
    </strong>
</div>

<div id="block-summary"
data-bind="scope:'block-summary'"
class="content"
data-role="content"
aria-labelledby="block-shipping-heading"
>
<!-- ko template: getTemplate() --><!-- /ko -->
<script type="text/x-magento-init">
    {
        "#block-summary": {
        "Magento_Ui/js/core/app": <?= /* @noEscape */ $block->getJsLayout() ?>
    }
}
</script>
<script>
    window.checkoutConfig = <?= /* @noEscape */ $block->getSerializedCheckoutConfig() ?>;
    window.customerData = window.checkoutConfig.customerData;
    window.isCustomerLoggedIn = window.checkoutConfig.isCustomerLoggedIn;
    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())) ?>');
        })
    </script>
    <script>

        require([
            'jquery',
            'Magento_Checkout/js/model/quote'
            ], function($, quote) {
                $('#country_id').on('change', function(e) {
                    var shippingAddress = quote.shippingAddress();
                    var country = shippingAddress.getCountry();
                    alert(country);
                });
                
            });

        </script>
        <!--mostrar tiempo estimado----->
        <?php
        //$test = $block->getJsLayout();
        $getCountry = $this->getQuote()->getShippingAddress()->getCountry();

        if($getCountry  == "ES"){
            echo "<p><strong>Tiempo estimado de env&iacute;o: 48 H</strong></p>";
        }
        else{
            echo "<p><strong>Tiempo estimado de env&iacute;o: 96 H</strong></p>";
        }
        ?>
        <!--fin mostrar envio-->
    </div>
</div>
 

bravo_88

Miembro
Además, no estoy seguro del ID, porque el que me aparece en el inspector de codigo cambia con cada recarga, vi el "name=country_id" y probe con ese.... pero es que tampoco doy con el archivo donde carga ese select y no se como sacar su id exacto.... Esta siendo un dolor de cabeza esto
 

Adjuntos

Toni FactoriaDigital

Experto en Magento de Factoría Digital
Miembro del equipo
El ID en este caso sería TQ6OA96, pero se estará auto-generando, así que no te va a servir.
Al ser jQuery puedes seleccionarlo diferente a través del atributo name así:

$('select [name="country_id"]')

Un saludo.
 

bravo_88

Miembro
He puesto como me has dicho
JavaScript:
<script>

        require([
            'jquery',
            'Magento_Checkout/js/model/quote'
            ], function($, quote) {
                $('select [name="country_id"]').on('change', function(e) {
                    var shippingAddress = quote.shippingAddress();
                    var country = shippingAddress.getCountry();
                    alert(country);
                });
                
            });

        </script>
Pero ni me saca alert ni veo como si me coge o no el pais....
 

Toni FactoriaDigital

Experto en Magento de Factoría Digital
Miembro del equipo
Pues no se me ocurre cómo ayudarte. Lo que yo haría sería intentar debugear ese código. Sácalo a fuera del bloque de jQuery, a ver si simplemente al cargar la página funciona. De ser así, significa que no tienes bien el selector jQuery del select de país.

Quedaría algo así:

JavaScript:
<script>
    require([
        'jquery',
        'Magento_Checkout/js/model/quote'
    ], function($, quote) {
        var shippingAddress = quote.shippingAddress();
        var country = shippingAddress.getCountry();
        alert(country);
    });
</script>
Y a malas, solo debugear el objeto de shippingAddress, poniendo algo así:

console.debug(shippingAddress);

A ver si te da una pista del array key que deberías coger.

Un saludo.
 

bravo_88

Miembro
Buenas, hay que activar el debuger de alguna manera? Porque no me funciona nada del código, ni el debuger si quiera, o no se donde puedo mirar que muestra el console.debug(shippingAddress);

Al sacarlo a fuera del bloque de jQuery el resumen de compra deja de funciona y no carga tampoco.

Un saludo!
 

Toni FactoriaDigital

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

No, no es necesario activar nada, los console.X aparecen siempre en la consola del navegador, sea cual sea el navegador, deberías ver esos mensajes ahí. Por ejemplo, para Google Chrome, pulsa F12 y pulsa sobre la pestaña "Consola".

Ahí también te aparecerán los errores de JS, por los cuales te deje de funcionar el resto de la página, donde te darán también una idea de lo que está pasando.

Un saludo.
 

bravo_88

Miembro
Aqui un error:

Uncaught TypeError: Cannot read property 'getCountry' of null
at (index):846
at Object.execCb (require.js:1650)
at Module.check (require.js:866)
at Module.<anonymous> (require.js:1113)
at require.js:132
at require.js:1156
at each (require.js:57)
at Module.emit (require.js:1155)
at Module.check (require.js:917)
at Module.<anonymous> (require.js:1113)

getCountry es null
 

Toni FactoriaDigital

Experto en Magento de Factoría Digital
Miembro del equipo
Realmente null sería en este caso "shippingAddress", prueba con el código que te comenté, para ver lo que devuelve el objeto de dirección:

JavaScript:
var shippingAddress = quote.shippingAddress();
console.debug(shippingAddress);
Y elimina o comenta la parte de getCountry.
 

bravo_88

Miembro
Mi Script:
JavaScript:
<script>
    require([
        'jquery',
        'Magento_Checkout/js/model/quote'
    ], function($, quote) {
        var shippingAddress = quote.shippingAddress();
        console.debug(shippingAddress);
        //var country = shippingAddress.getCountry();
        //alert(country);
    });
</script>
En la captura puedes ver la consola que no dice mucho:
 

Adjuntos

Última edición:
Arriba