2015-11-03 13 views
7

Próbuję utworzyć aplikację lokalizatora sklepu przy użyciu tego tutorial i Laravel 5. Ludzie w tych pytaniach Here i Here wydają się używać pętli @foreach i innego języka szablonowego ostrza, aby uruchomić ich współrzędne długości/długości. Jak oni to robią?Jak używać Laravel Blade w pliku skryptowym?

W zasadzie nie wiem, jak przechodzić przez współrzędne przy użyciu ostrza, gdy mój kod mapy jest w pliku js? Jak to możliwe? Czy robię coś całkowicie nie tak?

pokazuję moją mapę z pliku js (maps.js), który ma następujący kod:

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 

} 

Ale oczywiście, że utknie na linii @foreach.

PS: Jeśli ktokolwiek skorzystał z tego samouczka z Laravel 5, byłbym wdzięczny za wszelkie informacje na ten temat: Wyprowadzanie XML z PHP.

Odpowiedz

15

Nie ma możliwości użycia szablonów Blade w zewnętrznym pliku Javascript.

Laravel może przekazywać dane tylko do widoku/szablonu; Pliki JavaScript są ładowane zewnętrznie i dlatego dane aplikacji nie są do nich przekazywane.

Aby obejść ten problem, należy utworzyć <script> tagów wewnątrz pliku szablonu 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> 

Upewnij się, że ten fragment pochodzi przed kod na tym pliku maps.js. Jeśli masz plik maps.js w swoich tagach <head>, będziesz musiał przenieść ten fragment kodu do dołu strony.

Jest to raczej podstawowe rozwiązanie. Lepszym sposobem byłoby użycie AJAX do pobrania danych z twojego pliku maps.js po inicjalizacji.

Wymagałoby to oczywiście utworzenia nowej metody kontrolera i odpowiedniej trasy, która może obsłużyć żądanie i zwrócić wymagane dane.

+0

To działało idealnie dla mnie! Ale czy jest jakiś sposób na zrobienie tego za pomocą wielu zmiennych? Na przykład, jeśli chcę umieścić zawartość w każdym ze znaczników. Jak mogłem to zrobić? – AlmostPitt

+0

co masz na myśli? w twoim kontrolerze możesz po prostu przekazać więcej zmiennych .. jak 'view ('myView', ['variable1' => $ variable1, 'variable2' => $ variable2, etc ...])'; – heisian

+0

Tak, chciałbym umieścić oddzielne tablice w zmiennych lokalizacjach. Na przykład dla każdej lokalizacji chciałbym również wprowadzić nazwę lokalizacji i inne informacje. Po obejrzeniu tego postu opublikowałem kolejne pytanie w tym zakresie. Może to pomoże wyjaśnić moje pytanie: https://stackoverflow.com/questions/45924237/laravel-5-4-blade-javascript-google-maps-insert-foreach-with-multiple-variabl – AlmostPitt

1

Można utworzyć JavaScript obiekt z obiektu Eloquent, na przykład przyjrzeć się następującym kodem:

// index.blade.php 
<script>var userObj = {{ $authUser or 'undefined' }}</script> 

To blade widok, a ja po prostu ładowanie view i przejściu do collection widok używając coś jak to (za pomocą view composer):

View::composer('layouts.master', function($view) { 
    $user = null; 
    if(Auth::check()) { 
     $user = Auth::user(); 
    } 
    $view->with('authUser', $user); 
}); 

więc, moim view mam $authUser więc ok n przekształcić go JS obiektu łatwo jak:

<script>var userObj = {{ $authUser or 'undefined' }}</script> 

Więc teraz, mogę używać go jako JS obiektu, który jest w userObj zmiennej (JavaScript). Sprawdź, this article of mine, którą napisałem prawie rok temu dla Laravel-4.

1

W dostarczonych próbkach używają ostrza, ponieważ znajdują się w pliku typu blade, a wszystkie JavaScript znajdują się między tagami. Nie jest to typ pliku .js, więc możesz w ten sposób korzystać z funkcji języka blade.

Powiązane problemy