redirect()

Laut http://www.yiiframework.com/doc/api/CController#redirect-detail

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.

Ok, gelesen und getan


$this->redirect(array('controller/action', '2'));

erzeugt mir


http://localhost/blog2/controller/action/0/2



$this->redirect(array('controller/action', 'value' => '2'));

erzeugt mir


http://localhost/blog2/controller/action/value/2


Aber ich will das hier


http://localhost/blog2/controller/action/2

mfg

yii

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.

habe ich soweit ja gemacht




'urlManager'=>array(

	'urlFormat'		=> 'path',

	'caseSensitive'		=> true,

	'showScriptName'	=> false,

	'urlFormat'		=> 'path',

	'useStrictParsing'	=> true,

	'rules'=>array(

		'controller/action/value/<value:[0-9]+>' => 'engine/search',       <<<< funktioniert   *

		'controller/action/<value:[0-9]+>' => 'engine/search',       <<<< funktioniert nicht   **

	),



*)

$this->redirect(array(‘controller/action’, ‘value’ => ‘2’));

**)

$this->redirect(array(‘controller/action’, ‘2’));

Du musst die URL in beiden Fällen so generieren:


$this->redirect(array('controller/action', 'value' => '2'));

aber das erzeugt ständig


http://localhost/blog2/controller/action/value/2

Fehler gefunden, man muss das so schreiben:

$this->redirect(array("controller/action/{$variable}"));

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.

Mit dieser Konfiguration muss es klappen:


'urlManager'=>array(

        'urlFormat'             => 'path',

        'caseSensitive'         => true,

        'showScriptName'        => false,

        'urlFormat'             => 'path',

        'useStrictParsing'      => true,

        'rules'=>array(

                // nur eine Regel:

                'controller/action/<value:[0-9]+>' => 'engine/search',      

        ),

Ein Aufruf mit createUrl (wird intern auch von redirect() verwendet):


echo $this->createUrl('engine/search',array('value'=>123));



liefert bei mir:


http://localhost/controller/action/123



hier ist mein Probel, denn das liefert mir


http://localhost/blog2/controller/action/value/123

das value kommt einfach drin vor

Die Regel wird nur für die angegebene Route verwendet. Hast du auch ‘engine/search’ als Parameter verwendet oder ‘controller/action’?

ich könnte mich grad selbst aufessen…

;D

Hab das Klick bis hier gehört… ;)

Danke bis hierhin schonmal ;D ;D ;D

Manchmal ist man einfach blind

Mal noch eine Frage zum Abschluss

Nehmen wir an, ich würde gerne meine Seite internationalisieren wollen. (deutsch, englisch, französich, etc.)

Mein URLManager würde nun wie folgt aussehen




'urlManager'=>array(

        'urlFormat'             => 'path',

        'caseSensitive'         => true,

        'showScriptName'        => false,

        'urlFormat'             => 'path',

        'useStrictParsing'      => true,

        'rules'=>array(

                'maschine/suchen/<value:[0-9]+>' => 'engine/search',

                'machine/search/<value:[0-9]+>' => 'engine/search',

                'leMachine/leSuchen/<value:[0-9]+>' => 'engine/search',

        ),



Wie könnte ich jetzt “sprachabhängig”, die URL’s aufrufen?

Sprich der User benutzt die englische Sprache und bekommt dadurch

http://localhost/blog2/machine/search/12 ???ß

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 würde mich für eine Internationalisierung meiner Seite interessieren.

Wo kann ich denn erfahren wie dort der Stand der Dinge ist, bzw. ob das überhaupt geplant ist?

Geplant ist hier soweit ich weiß noch nichts. Aber du kannst ja mal im englischen Bereich fragen, evtl. hat da schon jemand eine Lösung.

Ja ok

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.


Yii::app()->urlManager->rules = $newRules;

Yii::app()->urlManager->init();

Das hört sich sehr interessant an, könntest du das vielleicht etwas genauer erläutern? Beispielcode etc.?

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:





// de.php


return array(

  

  'kontakt' => 'site/contact',


);








// en.php


return array(

  

  'contact' => 'site/contact',


);




Ich denke das sollte dir einen Eindruck verschaffen. Den Code hier habe ich jetzt nicht getestet, kann also sein das Fehler drin sind. :D