Routa skončí chybou – použití filtrů (spojení array)
- MartinitCZ
- Člen | 580
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
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
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
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
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
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
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 :)