recap of the story below
I have a multi-language URL structure like: domain.com/de/read/car
After changing the language (through the Language controller) vistors are sent back to the page they came from via $this->redirect($this->referer())
Problem is: if they came from domain.com/de/read/car they are sent back to that URL ( domain.com/de/read/car), but I would like that to be: domain.com/new-language/read/car
end recap
Hi peoples,
I am putting together a multilingual site. Most things are going pretty well, but there’s one thing that I can’t seem to figure out. I dont even know if it is possible at all (but I think it just might be).
Thing is: I have set the routing up to include the language as part of the URL:
domain.com/de/read/car (and domain.com/en/read/car etc).
I have also set up the routing, so that /read connects to the Articles controller.
I have a languagecotroller with a ‘change’ action to change the locale/language . It sets the new lanuage (I18n::setLocale) and stores it in session. After this action (after language has changed), I would like people to go back where they came from. So, I ended the action with: $this->redirect($this->referer); Works like a charm.
But the problem is: the referral could be something like:
domain.com/de/read/car, so after someone had changed the language to ‘en’, they are referred back to domain.com/de/read/car. And I would, of course, like that to be domain.com/en/articles/car
So, my question is: Is it possible to change that part of the referral? (and: how?)
What I have done so far, is: Tried to deconstruct the $this->referer data. As follows:
$refer_url = $this->referer(’/’, true);
$parse_url_params = Router::parse($refer_url);
when I now debug($parse_url_params), I get something like this:
Array
(
[language] => de
[pass] => Array
(
[0] => car
)
[controller] => Articles
[action] => view
[plugin] =>
[_matchedRoute] => /:language/read/*
)
Looks good! What I did then is:
$refer_url = $this->referer(’/’, true);
$parse_url_params = Router::parse($refer_url);
$parse_url_params[‘language’]= ‘en’;
debug($parse_url_params);
Now I get:
Array
(
[language] => en
[pass] => Array
(
[0] => car
)
[controller] => Articles
[action] => view
[plugin] =>
[_matchedRoute] => /:language/read/*
)
In my LanguageController, at the end of the ‘change’ action, I have changed this:
$this->redirect($this->referer);
to this:
$this->redirect($parse_url_params);
----Now to test it out:
When I am on this page/url:
https://localhost/site/de/read/car
and I change the language, I am referred to this:
https://localhost/site/en/read?pass[0]=car&_matchedRoute=%2F%3Alanguage%2Fread%2F*
So: I am almost there, I think. Since the language did indeed change. But the variable/param ‘car’ is not passed as it should. (and &_matchedRoute=%2F%3Alanguage%2Fread%2F* should not be visible at all).
But I can’t figure out to get this working. How to ‘reconstruct’ or ‘unparse’ or ‘rebuild’ the changed referral.
If anyone could help me out, I would greatly appriciate it
Kind regards,
Elbert