thomas jaunismo
Estoy tratando de hacer una aplicación de localización de tiendas usando esto tutorial y Laravel 5. Las personas en estas preguntas Aquí y Aquí parecen estar usando bucles @foreach y otro lenguaje de plantillas de hoja para ejecutar sus coordenadas de latitud/longitud. ¿Cómo están haciendo eso?
Básicamente, no sé cómo recorrer las coordenadas usando Blade cuando mi código de mapa está en un archivo js. ¿Cómo es eso posible? ¿Estoy haciendo algo totalmente mal?
Estoy mostrando mi mapa con un archivo js (maps.js) que tiene el siguiente código:
function initialize() {
var map_canvas = document.getElementById('map');
// Initialise the map
var map_options = {
center: location,
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(map_canvas, map_options)
// Put all locations into array
var locations = [
@foreach ($articles as $article)
[ {{ $article->lat }}, {{ $article->lng }} ]
@endforeach
];
for (i = 0; i < locations.length; i++) {
var location = new google.maps.LatLng(locations[i][0], locations[i][1]);
var marker = new google.maps.Marker({
position: location,
map: map,
});
}
// marker.setMap(map); // Probably not necessary since you set the map above
}
Pero obviamente eso se atasca en la línea @foreach.
PD: si alguien ha seguido este tutorial con Laravel 5, agradecería cualquier información sobre esta parte: Salida de XML con PHP.
Heisiano
No hay forma de usar plantillas Blade dentro de un archivo Javascript externo.
Laravel solo puede pasar datos a una vista/plantilla; Los archivos Javascript se cargan externamente y, por lo tanto, no se les pasan datos de la aplicación.
Para evitar esto, necesita crear <script>
etiquetas dentro de su archivo de plantilla Blade:
{{-- Code in your template file, e.g., view.blade.php --}}
<script type="text/javascript">
// Put all locations into array
var locations = [
@foreach ($articles as $article)
[ "{{ $article->lat }}", "{{ $article->lng }}" ],
@endforeach
];
// NOTE: I've added a comma which will be needed to delimit each array within the array.
// Quotes will also be needed since lat and long are not integers.
</script>
Asegúrate de que este fragmento viene antes de el código para incluir su maps.js
expediente. Si ha incluido el maps.js
archivo dentro de su <head>
etiquetas, tendrá que mover ese fragmento de inclusión hasta la parte inferior de la página.
Esta es una solución bastante rudimentaria, sin embargo. Una mejor manera sería usar AJAX para recuperar los datos desde dentro de su maps.js
archivo después de la inicialización.
Esto, por supuesto, requerirá que cree un nuevo método de Controlador y la ruta correspondiente que pueda manejar la solicitud y devolver los datos requeridos.
-
¡Esto funcionó perfecto para mí! Pero, ¿hay alguna forma de hacerlo con múltiples variables? Por ejemplo, si quisiera poner contenido en cada uno de los marcadores. ¿Cómo podría hacer eso?
– Brad Ahrens
28 de agosto de 2017 a las 16:47
-
¿qué quieres decir? en su controlador podría simplemente pasar más variables … como
view('myView', ['variable1' => $variable1, 'variable2' => $variable2, etc...])
;– Heisian
28 de agosto de 2017 a las 21:33
-
Sí, me gustaría colocar matrices separadas dentro de las ubicaciones de las variables. Por ejemplo, para cada ubicación, también me gustaría inyectar el título de la ubicación y alguna otra información. Después de ver esta publicación, publiqué otra pregunta al respecto. Tal vez esto ayude a aclarar mi pregunta: stackoverflow.com/questions/45924237/…
– Brad Ahrens
28 de agosto de 2017 a las 22:23
Puedes crear un JavaScript
objeto de la Eloquent
objeto, por ejemplo, eche un vistazo al siguiente código:
// index.blade.php
<script>var userObj = {{ $authUser or 'undefined' }}</script>
Esto es un blade
ver y solo estoy cargando el view
y pasando el collection
a la vista usando algo como esto (Usando un ver compositor):
View::composer('layouts.master', function($view) {
$user = null;
if(Auth::check()) {
$user = Auth::user();
}
$view->with('authUser', $user);
});
Entonces, en mi view
He $authUser
para que pueda convertirlo en JS
objeto fácilmente como:
<script>var userObj = {{ $authUser or 'undefined' }}</script>
Así que ahora, puedo usarlo como un JS
objeto que está en userObj
variables (JavaScript). Controlar este articulo mio que he escrito hace casi un año para Laravel-4
.
En los ejemplos que proporcionó, están usando blade porque están en un archivo blade y todo JavaScript está entre etiquetas. No es un tipo de archivo .js, por lo que puede usar las características del lenguaje blade de esta manera.