createURL und GET Parameter

Hallo,

gibt es eine elegante Möglichkeit, eine URL, die ich mittels yii erzeuge (z.B. createUrl) um die aktuellen GET Parameter zu erweitern? Also um jene, mit der die action aufgerufen wurde.

Angenommen ich rufe die Action wie folgt auf:

http://localhost/seite/index?wert1=1&wert2=2

die Index-Action soll nun (u.a.) einen Link bauen, in dem die o.g. Get Parameter wieder gesetzt sind, sofern es sie gibt und weitere Parameter anfügen.

Alternative 1:

CController::createUrl("index",array("wert3"=>"3")

liefert: http://localhost/seite/index?wert3=3

Alternative 2:

CController::createUrl("index",array("wert1"=>$_GET["wert1"],"wert1"=>$_GET["wert1"],"wert3"=>"3")

liefert: http://localhost/seite/index?wert1=1&wert2=2&wert3=3

Sieht im ersten Moment gut aus.

Problem: 1.) muss ich beim createUrl wissen, welche Variablen alle in Frage kämen und 2.) könnte auch eine URL wie folgt rauskommen: http://localhost/seite/index?wert1=&wert2=&wert3=3 . Nämlich dann, wenn wert1 und wert2 nicht gesetzt sind. Das ist dann problematisch, denn isset($_GET["wert1"]) liefert trotzdem true.

Alternative 3:

CController::createUrl("index",array($_GET,"wert3"=>"3")

Liefert auch im 1. Durchgang den richtigen Wert.

http://localhost/seite/index?wert1=1&wert2=2&wert3=3

Im 2. Durchgang jedoch: http://localhost/seite/index?wert1=1&wert2=2&wert3=3&wert3=3

Im 3. Durchgang: http://localhost/seite/index?wert1=1&wert2=2&wert3=3&wert3=3&wert3=3

Auch nicht das, was ich suche.

Bevor ich nun eine neue Funktion schreibe die Frage: gibt es da vielleicht schon eine Lösung bei yii?

Danke und Gruß :slight_smile:

Hallo,

ein besonderes ‘Bordmittel’ fällt mir dazu spontan nicht ein, aber man könnte es als Einzeiler unterbringen:


CController::createUrl("index",array_merge(array_filter($_GET,'strlen'),array("wert3"=>"3")));

So’n Quatsch ist natürlich nur in PHP möglich. ^^

array_filter($_GET,‘strlen’) entfernt alle Einträge deren Wert eine Länge von 0 hat, also leer ist (deshalb meinte ich “nur in PHP”, weil 0 zu FALSE evaluiert, während alles >= 1 zu TRUE wird). Anschließend kannst du deine neuen Werte per array_merge hinzufügen, weil die Einträge des hinteren Arrays die des Vorderen überschreiben (solange Strings als Schlüssel verwendet werden).

Aber um ehrlich zu sein würde ich mir lieber eine kleine Funktion schreiben, in der du dich auch um etwaige Spezialfälle kümmern kannst, z.B. Parameter die nicht leer sind, aber immer wegfallen sollen usw.

Schönen Gruß