Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Twig en archivos JavaScript

5 de agosto de 2015

Hola qué tal?

Les hago una consulta, resulta que tengo una página con un mapa en el cual se visualizan unos marcadores. Actualmente los estoy cargando de manera estática, pero necesito hacerlo de manera dinámica, y todo el código relacionado, lo tengo en un archivo llamado mapa.js Es decir tengo mi página: direcciones.html.twig. que contiene:

<script src="{{ asset('bundles/main/js/mapa.js')}}"></script>

El problema que tengo es que al intentar poner código twig en mi archivo .js, obviamente consigo un error.

Mi pregunta: ¿cómo puedo hacer para solucionar éste problema? Ya que no quisiera tener que poner el código de carga de marcadores dentro de unas etiquetas: <script></script> dentro de mi página direcciones.html.twig


Respuestas

#1

La primera solución, que a algunos les parecerá horrible, pero es "razonable" sería poner el enlace a mano sin usar la función asset(). Obviamente esto solo es posible si la aplicación ya es madura y no va a cambiar mucho esa parte. Si no, el enlace se podría romper con frecuencia.

La otra solución sería procesar el archivo JavaScript con Twig. Para ello, cambia su extensión a .js.twig y después inclúyelo en la plantilla como si fuera una plantilla normal:

<head>
    {{ include('@Mibundle/js/mapa.js.twig') }}
</head>

En este caso, la plantilla mapa.js.twig debería estar en src/MibundleBundle/Resources/views/js/

@javiereguiluz

5 agosto 2015, 10:58
#2

He convertido mi archivo: mapa.js en mapa.js.twig y ahora si me deja agregar código Twig dentro del mismo. Pero cuando se carga la página y tiene que cargar la imagen:

var image = new google.maps.MarkerImage({{asset('bundles/main/img/pin-em.png') }});

en la consolaJs me sale el siguiente error en esa línea de código:

Unexpected Token {

Mi archivo: mapa.js.twig, lo estoy vinculando a mi página de direcciones.html.twig de la siguiente manera:

<script src="{{ asset('bundles/main/js/mapa.js.twig')}}"></script>

Porque si a mi archivo mapa.js.twig, lo muevo a la carpeta public/js/ del bundle en el que tiene que estar, me sale un error twig que dice: no se pudo encontrar el archivo. El include en este caso lo estoy haciendo de la siguiente manera:

{{ include( 'Main/js/mapa.js.twig') }}

Siendo Main, el nombre de mi bundle: MainBundle.

¿Estoy usando mal el include()?

@MrXXX0323

5 agosto 2015, 23:29
#3

Respecto al error "Unexpected Token", prueba a encerrar entre comillas la cadena de texto que genera la función asset():

var image = new google.maps.MarkerImage("{{ asset('bundles/main/img/pin-em.png') }}");

Y respecto al include(), cuando te refieres a bundles, hay que incluir el carácter @ por delante:

{{ include( '@Main/js/mapa.js.twig') }}

@javiereguiluz

6 agosto 2015, 9:07
#4

Si si si si!! Feliz de la vida! xD

No sé porque no lo estaba entendiendo!!!

La solución fue:

Dentro de mi bundle (MainBundle/Resources/View/) creé una carpeta llamada FrontEnd/ y una subcarpeta llamada mapa/. Dentro de ésta carpeta mapa creé una plantilla llamada mapa.html.twig solo con el siguiente código:

<script>
function cargarMarcadores(){
     var image = new google.maps.MarkerImage("{{asset('bundles/main/img/pin-em.png') }}");
}
</script>

En síntesis lo que hice fue crear una plantilla Twig que solo tuviera las etiquetas de <script> para poder poner todo el código JS que necesitaba. T luego desde mi página direcciones.html.twig tengo un bloque llamado block js en el cual hago un include() de la siguiente manera:

{% block js %}
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true&libraries=places"></script>
    {% include 'MainBundle:FrontEnd:mapa/index_map.html.twig' %}
{% endblock %}

Y funciona de maravilla! :D

Muchas gracias @javiereguiluz por toda tu ayuda! :D

@MrXXX0323

6 agosto 2015, 20:34
#5

Me alegro mucho que ya te funcione. Sólo un comentario final: usar include() como etiqueta está declarado obsoleto en Twig y ahora se utiliza como función:

{# antes #}
{% include 'MainBundle:FrontEnd:mapa/index_map.html.twig' %}
 
{# ahora #}
{{ include('MainBundle:FrontEnd:mapa/index_map.html.twig') }}

Opcionalmente, también puedes usar la notación de bundles de Symfony:

{# antes #}
{{ include('MainBundle:FrontEnd:mapa/index_map.html.twig') }}
 
{# ahora #}
{{ include('@Main/FrontEnd/mapa/index_map.html.twig') }}

@javiereguiluz

6 agosto 2015, 22:39
#6

Mil gracias!!! de verdad! :D

@MrXXX0323

7 agosto 2015, 6:15