Routa skončí chybou – použití filtrů (spojení array)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
MartinitCZ
Člen | 580
+
0
-

ERROR: rawurldecode() expects parameter 1 to be string, array given

Vždy je označen řádek:

$this->presenter->redirect("Homepage:default", array("data" => (array) $this->data));
$FrontendRouter[] = new Route("[datas/<data>/][parts/<part>/]", array(
		"presenter" => "Homepage",
		"action" => "default",
		"data" => array(
			Route::VALUE => NULL,
			Route::FILTER_IN => function($s) {
				if ($s !== NULL) {
					return explode('+', $s);
				};
				return NULL;
			},
			Route::FILTER_OUT => function($s) {
				if ($s !== NULL) {
					return implode('+', $s);
				};
				return NULL;
			},
		),
		"part" => NULL,
));

Pokud nepoužiji routu, tak vše funguje spávně.
Tvar URL:

?data[0]=soul&data[1]=metal&data[2]=disco

Nevíte, co je na routě špatně? Hledal jsem informace na foru, viděl video přednášku o routách, a podle toho je vše OK, aspon si to myslim.
Díky

Editoval martinit (29. 6. 2012 18:24)

jtousek
Člen | 951
+
0
-

Nette routy z nějakého (pro mne naprosto nepochopitelného) důvodu nepodporují parametry typu array nebo object, přestože filtry by s tím klidně ještě mohly něco udělat. Sám používám parametry typu objekt takže jsem si kvůli tomu drobně upravil Nette. Konkrétně za to může tenhle řádek.

MartinitCZ
Člen | 580
+
0
-

jtousek: Díky. Nahlásim to :)

MartinitCZ
Člen | 580
+
0
-

Funguje to úplně stejně, jako kdybych ten tvůj příklad nepoužil.

rawurldecode() expects parameter 1 to be string, array given

Označený řádek:
return parent::constructUrl($appRequest, $refUrl);

Filip Procházka
Moderator | 4668
+
0
-

Na malou chvilku jsem znejistěl, takže jsem to vyzkoušel.

app/bootstrap.php

$container->router[] = new MyDataRoute('datas/<data>/', array(
	"presenter" => "Homepage",
	"action" => "default",
	"data" => NULL
));

HomepagePresenter

public function renderDefault(array $data = array())
{
	$this->template->params = $this->params;
}

Homepage/default.latte

{? dump($params)}
<a n:href="this, data => ['bu', 'bu', 'bu']">{plink this, data => ["bu", "bu", "bu"]}</a>

a důkaz místo slibů

Chyba je u tebe. Máš Nette 2.0.3 ?

Editoval HosipLan (30. 6. 2012 11:46)

MartinitCZ
Člen | 580
+
0
-

Sorry. Už to jede díky ;). Jen mě teda … štve, že vzniklá URL vypadá tak hrozně neco.cz/data/aaaa%2Bbbbb%2Bdrama%2Bcccc
Místo + v url je %2B

Editoval martinit (30. 6. 2012 12:11)

Filip Procházka
Moderator | 4668
+
0
-

To můžeš upravit pomocí filtrů

$container->router[] = new MyDataRoute('datas/<data>/', array(
        "presenter" => "Homepage",
        "action" => "default",
        "data" => array(
		MyDataRoute::FILTER_IN => function ($data) {
			return rawurldecode(str_replace('+', '%2B', $s));
		},
		MyDataRoute::FILTER_OUT => function ($data) {
			return str_replace('%2B', '+', rawurlencode($s));
		}
	)
));
MartinitCZ
Člen | 580
+
0
-

HosipLan: Díky. Možná by bylo dobré zauvažovat nad tím, zda toho nenapsat trochu víc (doladit) a hodit toto „téma“ do kuchařky :)