2012-04-04 4 views
2

내 템플릿의 현재 링크를 어떻게 만듭니 까?Symfony 2 현재 페이지 링크

현재 페이지에 링크해야하는 언어 전환기를 만들려면 모든 매개 변수가 로케일에 대해 동일한 exept이어야합니다.

답변

7

나는이에 대한 내 자신의 기능을 압연 끝낸다. 나는 처음에는 FrameworkBundle 어딘가에 포함되었지만 그것에 대해 아무것도 발견하지 못했습니다. 여기 내가 취한 조치들.

처음에는 사용자가 현재 방문하고있는 것과 동일한 경로 (매개 변수 및 쿼리 문자열 포함)를 출력하는 Twig 확장 함수를 만들었습니다. 나는이 단계를 너에게 맡겼다. Twig 확장 기능을 만드는 방법에 대한 설명은 Symfony2의 좋은 자습서에서 this link을 보면 알 수 있습니다. 네가 필요하다면 내가 너를 도울 수있어.

다음 단계는 현재 경로의 로케일을 전환 할 함수 자체를 만드는 것입니다. 이 함수는 RequestRouter 객체를 종속성으로 필요로합니다. 제 개인적인 경우에이 서비스를 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; 
} 

은 $ 로케일 매개 변수는 새 로케일로 전환하고자하는 것입니다. 여기서 함수 :

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은 라우트 속성에서 개인 속성을 제거합니다. 이러한 속성은 밑줄로 시작하는 것으로 경로 생성기로 다시 전달하면 안됩니다. 여기에 그 (고화질) :

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

편집 :

여기

내 나뭇 가지 끝에서

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

    return $filteredAttributes; 
} 

, 나는 로케일을 전환하는 링크를 만들 내 나뭇 가지보기에이 수 있어요 확장 서비스 정의 :

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

그리고 나뭇 가지 확장 기능 나는이 전화를 가지고 : $routingHelper = $this->container->get('acme.helper.routing');

이것은 twig 확장이 요청 범위에 없기 때문에 발생하는 예외 확대 범위를 해결해야합니다.

업데이트 : 심포니 2.1 이전보다 더 쉬운 방법으로 로케일 스위처를 가지고

그것은 지금 가능하다. 사실, 2.symfony의 1 버전에서는 경로를위한 새로운 매개 변수가 도입되어 more 로켈 전환기를 사용하기가 쉽습니다. 여기에 모든 나뭇 가지

{% 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) }} 

그것은 여전히 ​​나뭇 가지 몇 줄의 코드이지만, 쉽게 재사용을위한 나뭇 가지 블록에 포함 할 수있는 코드. 위의 코드에 대한 Symfony 커뮤니티의 stof에 대한 크레딧.

희망이 당신이 찾고있는 것입니다.

감사합니다,
매트

+0

자, 직접 작성해야합니다. 필자는 본질적인 기능이기 때문에 프레임 워크에 그런 것이 있어야한다고 생각했습니다. 나는 플러그인과 도우미 클래스를 작성했지만 이제는 범위에 문제가 있습니다. 도우미와 나뭇 가지 확장은 "scope :"요청 ""이고 나뭇 가지 자체는 그렇지 않습니다. (Scope Widening Injection detected : 정의 "twig"는 좁은 범위에 속하는 "s2_tools.twig.routing_helper"서비스를 참조합니다.). 이걸 어떻게 관리 했어? – Johni

+0

그래, 나는 이걸 또한 습격했지만 아직 아무것도 찾지 못했다. 나는 무언가를보고 싶어한다. 나는 내 헬퍼를 가져 오는 것보다 전체 서비스 컨테이너를 주입하여이 문제를 관리했다. 나는 이것을 반영하기 위해 나의 대답을 편집했다. – Matt

+0

자, 이제 전체 서비스 컨테이너를 주입했습니다. 이제 작동합니다. 감사. – Johni

1
<a href="{{ path(app.request.get('_route'), {'_locale': 'en'}) }}">English</a> 
+1

네, 이미 발견 한 것, 매개 변수가있는 페이지의 경로를 작성하려면 현재 매개 변수가 필요합니다. – Johni