Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In TWIG, is possible to get absolute url of a link with twig variables in it?

Tags:

twig

symfony

I have several URLs that look as follows:

{{domainID}}/action/{{userId}}/anotherAction

And the latter URL points to:

http://localhost/viewA/{{domainID}}/action/{{userId}}/anotherAction

However, If I try to load viewA from viewB through an iframe, the link inside viewA instead of pointing to:

http://localhost/viewA/{{domainID}}/action/{{userId}}/anotherAction

it will point to:

http://localhost/viewB/{{domainID}}/action/{{userId}}/anotherAction

and the user will end up in a 404 page if it follows the latter.

My question is:

Is there anyway to get the absolute path of a url built that way in twig?

EDIT

The route definition is:

@Route("/domain/details/{domainId}", name="domain_detailed_view")

I tried to get the absolute path this way:

{{ url({{domainID}}/action/{{userId}}/anotherAction) }}

but I get this error:

A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses

like image 371
ILikeTacos Avatar asked Jul 15 '13 19:07

ILikeTacos


People also ask

How do I get the current URL in twig?

You can get the current URL in Twig/Silex 2 like this: global. request. attributes. get('_route') .

How do you make an absolute URL?

If you prefix the URL with // it will be treated as an absolute one. For example: <a href="//google.com">Google</a> . Keep in mind this will use the same protocol the page is being served with (e.g. if your page's URL is https://path/to/page the resulting URL will be https://google.com ).

How do you use variables in twig?

In Twig templates variables can be accessed using double curly braces notation {{ variableName }} .


3 Answers

The url or path functions take the route name, not the path. You can give it an associative array as an optional second argument if the route requires parameters.

For example:

{{ url('domain_detailed_view', { 'domainId': domainId, 'userId': userId }) }}

http://symfony.com/doc/master/reference/twig_reference.html

like image 120
kunal Avatar answered Oct 06 '22 14:10

kunal


I know it's old and answered, but with symfony 3 & twig you can do:

{{ app.request.getSchemeAndHttpHost() }}

/* will match even port :) i.e.
 * http://localhost:8000
 * http://localhost
 * http://example.com
 */

which is extremely helpful :D

like image 41
Tom St Avatar answered Oct 06 '22 12:10

Tom St


You have two ways to do the same thing. Generally you could use url() or path inside absolute_url function like so absoulute_url(path(...)). Consider the following:

// example 1:
{{ url('domain_detailed_view', { 'domainId': domainId, 'userId': userId }) }}
// example 2:
{{ absolute_url(path('domain_detailed_view', { 'domainId': domainId, 'userId': userId })) }}">

// note - those two do the same thing

Generally since Symfony 2.7 you could use absolute_url() with asserts and relative path also (relative to web/root folder). This is how you could use them to set absolute path to image in bundle and in main web folder:

[app/src/UserBundle/Resources/public/img/image.jpg]

<img src="{{ absolute_url(asset('bundle/user/img/image.jpg')) }}" /> // new way since 2.7 up
<img src="{{ asset('bundle/user/img/image.jpg', absolute: true ) }}" /> // old way below 2.7 removed in symfony 3.0

[web/css/img/some.jpg]

<img src="{{ absolute_url('css/img/some.jpg') }}" /> 

This is what symfony recommends to use while rendering email view. http://symfony.com/doc/current/email.html

like image 43
DevWL Avatar answered Oct 06 '22 14:10

DevWL