2015-11-03 9 views
7

私はこのtutorialとLaravel 5を使って店舗ロケーターアプリを作ろうとしています。これらの質問HereHereの人々は、緯度/経度座標を実行するために@foreachループと他のブレードテンプレート言語を使用しているようです。彼らはどうしているのですか?スクリプトファイルでLaravel Bladeを使用するには?

マップコードがjsファイルにあるときに、ブレードを使用して座標をループする方法は基本的にわかりません。そんなことがあるものか?私は何か完全に間違っているのですか?

私は、次のコードを持っているのjsファイル(maps.js)と私のマップを示す午前:

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 

} 

をしかし、明らかにそれは@foreachライン上で立ち往生。

PS:誰かがこのチュートリアルをLaravel 5に従えば、私はこの部分の情報:PHPでXMLを出力することに感謝します。

答えて

15

外部Javascriptファイル内でBladeテンプレートを使用する方法はありません。

Laravelは、ビュー/テンプレートにのみデータを渡すことができます。 Javascriptファイルは外部から読み込まれるため、Appデータはそれらに渡されません。

これを回避するために、あなたはあなたのブレードテンプレートファイル内<script>タグを作成する必要があります。

{{-- 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> 

このスニペットは、あなたのmaps.jsファイルを含むため前にコードを付属していることを確認してください。 <head>タグ内のmaps.jsファイルを見つけた場合は、そのインクルードスニペットをページの下部に移動する必要があります。

しかしこれはやや初歩的な解決策です。より良い方法は、AJAXを使用して、初期化時にmaps.jsファイル内のデータを取得することです。

これはもちろん、要求を処理して必要なデータを返す新しいControllerメソッドと対応するルートを作成する必要があります。

+0

これは私にとって完璧でした!しかし、複数の変数でそれを行う方法はありますか?たとえば、それぞれのマーカーにコンテンツを入れたいと思ったとします。どうすればいい? – AlmostPitt

+0

どういう意味ですか? あなたのコントローラには 'view( 'myView'、['variable1' => $ variable1、 'variable2' => $ variable2、etc ...])のようなもっと多くの変数を渡すことができます。 – heisian

+0

ええ、私は変数の場所内に別々の配列を入れたいと思います。例えば、それぞれの場所については、その場所のタイトルとその他の情報も入力したいと思っています。このポストを見た後、私はこの点に関して別の質問を投稿しました。たぶんこれは私の質問を明確にするのに役立ちます:https://stackoverflow.com/questions/45924237/laravel-5-4-blade-javascript-google-maps-insert-foreach-with-multiple-variabl – AlmostPitt

1

あなたは、たとえば、次のコードを見て、EloquentオブジェクトからJavaScriptオブジェクトを作成することができます

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

これはblade図であり、私はちょうどviewをロードし、collectionに渡しています(使用view composer)このようなビュー使用して何か:

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

だから、私のviewに私は、私はCA $authUserましたn個のように簡単にJSオブジェクトに変換します。だから今

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

、私はuserObj変数(JavaScriptの)であるJSオブジェクトとして使用することができます。私がLaravel-4のためにほぼ1年前に書いたthis article of mineをチェックしてください。

1

提供されたサンプルでは、​​ブレードファイル内にあり、すべてのJavaScriptがタグの間にあるため、ブレードを使用しています。これは.jsファイルタイプではないため、この方法でブレード言語機能を使用できます。

関連する問題