urlManager Probleme mit rules

Hallo,

ich habe Probleme mit einigen rules und hoffe auf eure Hilfe.

Meine view sieht folgendermaßen aus




<?php echo CHtml::beginForm(array('translation/search'), 'get', array('name' => 'frm') ); ?>

<input type="text" name="value"/>

<select name="lang">

	<option value="de">german</option>

	<option value="en">english</option>

</select>

<input type="submit" value="<?php echo Yii::t('standard', 'search'); ?>" />

<?php echo CHtml::endForm(); ?>



Die passende Rule ist folgende

‘<lang:[a-zA-ZöäüÖÄÜß\-\+[:space:]]+>/<value:[a-zA-ZöäüÖÄÜß\-\+[:space:]]+>’ => ‘translation/search’,

Wenn ich aber auf Suche klicke, dann erscheint folgende URL


http://localhost/cneu/translation/search.html?value=waschmaschine&lang=de

Meine .htaccess




RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php [L]


RewriteRule !.+ index.php [L]




Wer sieht mein Problem? dank für die Lösungen!

Guck mal in den Quelltext bezüglich "action" der Form. Alle Parameter (value, lang) werden da einfach drangehangen sobald du submit klickst. Woher soll die Form auch von deiner rule wissen?

Mit JavaScript könntest du vor dem submit die gewünschte Url bauen.

dafür ist doch die Rule da?!

‘<lang:[a-zA-ZöäüÖÄÜß\-\+[:space:]]+>/<value:[a-zA-ZöäüÖÄÜß\-\+[:space:]]+>’ => ‘translation/search’,

Wenn ich diesen Code submitte


<?php echo CHtml::beginForm(array('translation/search'), 'get', array('name' => 'frm') ); ?>

<input type="text" name="value"/>

<select name="lang">

dann rufe ich den Controller translation auf mit der Action search und übergebe die Parameter value und lang.

localhost/translation/search?value=wert&lang=de

müsste nach der Rule doch umgewandelt werden in

localhost/de/wert

Das


<?php echo CHtml::beginForm(array('translation/search'), 'get', array('name' => 'frm') ); ?>



hat die gewünschte Url ja noch nicht erstellt (die Angabe der Parameter fehlt ja noch). Beim Klick auf submit ist Yii garnicht mehr mit von der Partie (PHP-Script beendet). Wo soll da jetzt noch was generiert werden? Wie gesagt, die Parameter werden einfach hinten drangehangen.

Probier es mal direkt mit createUrl, das wird dir die gewünschte Url ausspucken.

Y!! hat recht, nur als Zusatz zum Verständnis weil ers noch nicht gesagt hat:

Diese URL erzeugt dein Browser! Das ist die Art und Weise wir Parameter bei Formularen mit Action GET übergeben werden.

ok danke für die Antworten.

Aber

Was wenn ich $this->redirect verwendet? Ich habe eine Methode in meinem Controller geschrieben die auf die entsprechende Methode ein redirect ausführt. Diese müsste doch nun die Regel umschreiben?

Meine View mit translation/search


<?php echo CHtml::beginForm(array('translation/search'), 'get', array('name' => 'frm') ); ?>

	<center>

		<input type="text" name="languages" value="english">

		<input type="text" name="value"/>

		<input type="submit" value="<?php echo Yii::t('standard', 'Übersetzen'); ?>" />

	</center>

<?php echo CHtml::endForm();> ?>

Die ruft nun die Action search im Controller translation auf


public function actionSearch()

{

	$sValue		= trim(Yii::app()->request->getParam('value'));

	$sLanguages = trim(Yii::app()->request->getParam('languages'));


	// Pattern entscheiden welcher redirect stattfindet

	$sPattern_alpha	 = "/^[a-zA-ZčćšđžČĆŠĐŽöäüÖÄÜß\-\_\+\.\:\;\,[:space:]]+$/";


	// Satz oder Wort

	if( preg_match ( $sPattern_alpha, $sValue ) )

	{

		$this->redirect(

			array( "translation/phrase", 

				"value"		=> $sValue, 

				"languages"	=> $sLanguages

			)

		);

	}

}



Diese ruft nun ein redirect auf und ruft die Action phrase im Controller translation auf!

Aber vorher müsste doch das Framework in meinen Rules nachgucken.

Sprich folgende Regel müsste doch Beachtung finden:

‘<languages:[a-zA-ZöäüÖÄÜß\-\+[:space:]]+>/<value:[a-zA-ZöäüÖÄÜß\-\+[:space:]]+>’ => ‘translation/phrase’,

und mir folgende URL erzeugen:

localhost/english/auto

Ich bekomme aber


http://localhost/translation/search.html?languages=english&value=auto

Die Lösung:

  1. Parametrisierte Routen