Ich möchte meinem Redirect auch eine Variable übergeben, jedoch steht in der Doku, dass nur Controller & Action übergeben werden kann.
Redirects the browser to the specified URL or route (controller/action).
Gibt es eine andere Methode controller/action/parameter???
Weiter heißt es
the URL to be redirected to. If the parameter is an array, the first element must be a route to a controller action and the rest are GET parameters in name-value pairs.
Standardmäßig werden Variablen bei urlFormat=path immer als name/wert an die URL gehängt. Damit die URLs so generiert werden, wie du das möchtest, musst du eine URL-Regel im UrlManager konfigurieren. Dann wird die URL in deinem letzten redirect()-Aufruf richtig erzeugt.
Das solltest du nicht machen. So musst du jedesmal überall alles anpassen, wenn du dein URL-Schema mal ändern willst. Genau das nimmt dir der UrlManager ja ab.
Dazu gibts noch keine so richtige Lösung innerhalb von Yii. Aber man hat ja an der Stelle alle Möglichkeiten von PHP, muss sich also selbst eine kleine Logik einfallen lassen. Bedenke allerdings, dass zum Zeitpunkt wenn main.php gelesen wird, Yii::app() noch nicht initialisiert wurde, du also noch nicht darauf zugreifen kannst um z.B. das locale auszulesen.
Das Yii-Framework gefällt mir soweit sehr gut, ich habe es ausgesucht, da es unter anderem damit geworben hat, dass es “internationalisierungsfähig” ist. Ich hoffe das jemand das gleiche Problem wie ich schon hatte
Also multilanguage-url’s habe ich mit einem einfachen Component gelöst. Das wird über preload in der config vorgeladen, erkennt anhand von z.B. cookie oder country-code die gewünschte Sprache und bindet dann die dazugehörigen url-rules ein (z.B. ../i18n/urlRules/de.php). Diese rules müssen dann an den urlManager übergeben werden.
Habe den Code gerade nicht hier, aber so in etwa sieht das aus:
<?php
class I18n extends CComponent
{
// Die unterstützten Sprachen (language-codes). Diese Variable sollte am Besten über die config
// gesetzt werden.
public $supportedLanguages = array('de', 'en');
public function init()
{
// Hier muss der language-code "erkannt" werden. Zum Beispiel über Cookie, GeoIp-CountryCode
// oder den Http-Request-Header. Natürlich muss auch überprüft werden ob der languagce-code
// unterstützt wird ($this->supportedLanguages ...). Zu Testzwecken halt einfach mal auf
// "de" setzen
$languageCode = 'de';
// Hier holen wir die url-rules ...
$rules = include(Yii::app()->basePath . "/i18n/urlRules/{$languageCode}.php");
// ... und übergeben sie an den urlManager
Yii::app()->urlManager->rules = $rules;
// ... der dann nochmal neu geladen wird und die "neuen" rules übernimmt
Yii::app()->urlManager->init();
}
}
?>
Dann in der config:
...
preload => array('log', 'i18n'),
...
In der eigentlichen Config sollte dann auch keine Rule stehen. Die rules kommen in den urlRules-Ordner: