かなり奇妙な問題です。質問して申し訳ありませんが、私はSymfony/Twigが初めてです。私のルートには必須のregion_id
パラメーターが必要です。
ajax_provinces_by_region:
pattern: /ajax/region/{region_id}/provinces
defaults: {_controller: SWAItaliaInCifreBundle:Ajax:provincesByRegion }
requirements: {region_in: \d+}
質問:JavaScriptのselect
要素に基づいてこのルートを生成するにはどうすればよいですか(以下のコード)?
問題は:region_id
パラメータ(this.value
)を指定する必要があるため、Symfonyのpath
およびurl
ヘルパーを使用できませんjavascript変数であるためアクセスできません(およびTwigはサーバー側でコンパイルされます)。
$(document).ready(function() {
$('select#regions').change(function(){
// Make an ajax call to get all region provinces
$.ajax({
url: // Generate the route using Twig helper
});
});
});
FOSJsRoutingBundle を使用できます。
私はそれが古い質問であることを知っていますが、FOSJsRoutingBundleのようなバンドルをインストールしたくない場合のために、ちょっとしたハックがあります:
var url = '{{ path("yourroute", {'region_id': 'region_id'}) }}';
url = url.replace("region_id", this.value);
'region_id'はプレースホルダーとして使用され、JSで実際の変数this.valueに置き換えます
url: "{{ path('SampleBundle_route',{'parameter':controller_value}) }}"
どこ SampleBundle_route
はrouting.ymlまたはannotatinsで定義された有効なパスです。
テストのために、これをtwigテンプレートに書きます:
<script>
var url= "{{ path('SampleBundle_route') }}";
alert(url);
</script>
* @Route("/{id}/edit", name="event_edit", options={"expose"=true})
HTMLでデータ属性を使用できます。
<select id="regions">
{% for region in regions %}
<option data-path="{{ path('ajax_provinces_by_region', {'region_id': region.id}) }}">...</option>
{% endfor %}
</select>
あなたのjavascriptで:
$('select#regions').on('change', function() {
let path = $(this).find(':selected').data('path')
$.ajax({
'url': path
})
})