Cómo pasar variable a js externo en magento 2

9

En magento 1

podemos llamar a esta función prototipo en phtml por ejemplo

function ABC(){
     var a = '<?php echo $a;?>'
    alert(a);
 }

pero en magento 2 no podemos agregar este tipo de función en phtml, para eso tenemos que crear requirejs-config.js

var config = {
map: {
    '*': {
        'exam': 'js/example',
    }
}
};

como este y example.js

 function ABC(){

    alert(a);
 }

en phtml

require(['jquery','exam'], function($){
    var a= <?php echo $a; ?>;
});

Estoy tratando de pasar variables como esta pero no funciona, cómo pasar variables de phtml a js externo en magento 2

Novato
fuente

Respuestas:

19

Hay dos formas de incluir JavaScript desde la plantilla en Magento 2: el <script type="text/x-magento-init">y el data-mage-initatributo. De cualquier manera se puede usar para pasar datos al script dentro de la definición json. Por ejemplo, usando la etiqueta de script x-magento-init, en la plantilla que tiene:

<script type="text/x-magento-init">
    {
        "*": {
            "js/example": {
                "a": "<?php echo 'Hello from template' ?>"
            }
        }
    }
</script>

Y en el archivo JS, tienes:

define([
    'jquery'
], function ($) {
    'use strict';

    return function (config) {
        console.log(config); // will output {a: "Hello from template"}
        alert(config.a); // would be equal to alert("Hello from template");
    }
});
Aaron Allen
fuente
Estoy usando este código, pero mi alerta aparece dos veces; sin embargo, si escribo una alerta antes de "return function (config) {" aparece solo una, no puedo encontrar por qué las alertas dentro de "return function (config) {"vienen dos veces.
Deepika Janiyani
Gran información, pero ¿cómo obtendría acceso a los datos en el objeto de configuración desde otro archivo js? Por ejemplo, si envié los datos anteriores: '"a": "<? Php echo' Hello from template '?>" A un archivo js / model / example.js, ¿cómo podría extraer esos datos en una vista / archivo sample.js? ¡Muchas gracias!
MikeMason
Intentar pasar datos entre diferentes archivos .js parece que probablemente no funcionaría. Puede pasar los datos a las configuraciones de ambos archivos en la plantilla. O, si tiene algunos datos que desea que sean accesibles para varios archivos js, puede usar el mecanismo de 'contenido privado' de Magento: devdocs.magento.com/guides/v2.0/config-guide/cache/… que es lo que es utilizado internamente para el mini-carrito, datos del cliente, comparar productos, etc.
Aaron Allen
2
Como nota al margen, si intenta esto y no funciona, asegúrese de estar usando definey no require. Esto no funciona cuando se usa require.
Ben Crook
@ Aaron Allen Muy buena respuesta
Pandurang