2

テンプレートで現在へのリンクを作成するにはどうすればよいですか?

さまざまな言語で現在のページにリンクする言語スイッチャーを作成したいので、すべてのパラメーターはロケールを除いて同じでなければなりません。

4

3 に答える 3

7

私はこれのために自分の機能をロールアウトすることになります。最初はどこかに含まれていましFrameworkBundleたが、それについては何も見つかりませんでした。ここで私が取った手順。

最初に、ユーザーが現在アクセスしているルートと同じルートを出力する Twig 拡張関数を作成しました (パラメーターとクエリ文字列が含まれています)。このステップはあなたに任せました。まだ方法がわからない場合は、Twig 拡張機能の作成方法の説明について、Symfony2 の優れたチュートリアルからこのリンクを参照できます。必要があればお手伝いします。

次のステップは、現在のルートのロケールを切り替える関数自体を作成することです。この関数は、依存関係としてRequestおよびRouterオブジェクトを必要とします。私の個人的なケースでは、この関数を service という名前の専用サービスに入れましたRoutingHelper。このサービスは、私の Twig 拡張機能によって使用されます。依存関係コンテナーに追加したサービス定義は次のとおりです。

acme.helper.routing:
    class: Application\AcmeBundle\Helper\RoutingHelper
    scope: "request"
    arguments:
        request: "@request"
        router: "@router"

そして私のサービスのコンストラクタ:

protected $request;
protected $router;

public function __construct($request, $router)
{
    $this->request = $request;
    $this->router = $router;
}

$locale パラメータは、切り替え先の新しいロケールです。ここで機能:

public function localizeCurrentRoute($locale)
{
    $attributes = $this->request->attributes->all();
    $query = $this->request->query->all();
    $route = $attributes['_route'];

    # This will add query parameters to attributes and filter out attributes starting with _
    $attributes = array_merge($query, $this->filterPrivateKeys($attributes));

    $attributes['_locale'] = $locale;

    return $this->router->generate($route, $attributes);
}

基本的に、他の人がこれまでに行ったことを行いますが、パラメーターとクエリ文字列も処理します。このメソッドfilterPrivateKeysは、ルート属性からプライベート属性を削除します。これらの属性はアンダースコアで始まる属性であり、ルート ジェネレーターに戻すべきではありません。ここでその定義:

private function filterPrivateKeys($attributes)
{
    $filteredAttributes = array();
    foreach ($attributes as $key => $value) {
        if (!empty($key) && $key[0] != '_') {
            $filteredAttributes[$key] = $value;
        }
    }

    return $filteredAttributes;
}

最後に、Twig ビューでこれを実行して、ロケールを切り替えるためのリンクを作成できます。

{% block language_bar %}
        <a href="{{ localize_route('en') }}"> English </a>
        <a href="{{ localize_route('fr') }}"> Français </a>
{% endblock %}

編集

ここに私の小枝拡張サービスの定義があります:

acme.twig.extension:
    class: Application\AcmeBundle\Twig\Extension\AcmeExtension
    arguments:
      container: "@service_container"
    tags:
      -  { name: twig.extension }

小枝拡張機能では、次の呼び出しがあります。$routingHelper = $this->container->get('acme.helper.routing');

これにより、小枝拡張機能がリクエストスコープにないために発生するスコープ拡大例外が解決されるはずです。

アップデート:

Symfony 2.1 では、以前よりも簡単な方法でロケール スイッチャーを使用できるようになりました。実際、Symfony の 2.1 バージョンでは、ルートの新しいパラメーターが導入され、ロケール スイッチャーをより簡単に実行できるようになりました。ここにコード、すべて小枝で

{% set route_params = app.request.attributes.get('_route_params') %}

{# merge the query string params if you want to keep them when switching the locale #}
{% set route_params = route_params|merge(app.request.query.all) %}

{# merge the additional params you want to change #}
{% set route_params = route_params|merge({'_locale': 'fr'}) %}

{{ path(app.request.attributes.get('_route'), route_params) }} 

まだ数行の twig コードですが、再利用しやすいように Twig ブロックに含めることができます。上記のコードについては、Symfony コミュニティの stof に感謝します。

これがあなたが探しているものであることを願っています。

よろしく、
マット

于 2012-04-04T15:25:14.603 に答える
1
<a href="{{ path(app.request.get('_route'), {'_locale': 'en'}) }}">English</a>
于 2012-04-04T12:35:40.383 に答える
1
<a href="{{ path(app.request.attributes.get('_route')) }}">Current page</a>

同様の質問:現在のページを変更せずに言語を切り替える

于 2012-04-04T12:16:32.590 に答える