Nette routy nepodporují parametry typu array nebo object
- MartinitCZ
- Člen | 580
Narazil jsem na problém při předávání array do redirectu u kterého mi Honza Tvrdík vysvětlil, že už je upraven v DEV verzi.
Jelikož je tento bug opraven, bylo by dobré upravit i další bug, který souvisí Routami. Jelikož ty mají problém s array (object).
Máme tuto routu:
$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,
));
Ta vznikne díky tomuto:
$this->presenter->redirect("Homepage:default", array("data" => (array) $this->data));
Ale skončí chybou:
ERROR: 'rawurldecode() expects parameter 1 to be string, array given'
Řešení popsal jtousek . To spočívá ve smazání řádku #312 v souboru Nette\Application\Routers\Route. Ale určitě by to ještě chtělo otestovat a případně vymyslet lepší řešení, než jen smazání. ;)
Snad jsem to popsal dost jasně a chopí se toho nějaký GURU, resp někdo,
kdo může poslat issue na github.
( Přitom by mohl poslat i issue na toto https://forum.nette.org/…-vs-template#… )
Editoval martinit (29. 6. 2012 20:21)
- Filip Procházka
- Moderator | 4668
Ale kdepak, takhle je to správně a nic se mazat nebude.
class MyDataRoute extends Nette\Application\Routers\Route
{
public function match(Nette\Http\IRequest $httpRequest)
{
// matchnu routu
if (!$appRequest = parent::match($httpRequest)) {
return $appRequest;
}
// upravím parametry
$params = $appRequest->getParameters();
if (isset($params['data'])) {
$params['data'] = explode('+', $params['data']);
}
$appRequest->setParameters($params);
// vrátím
return $appRequest;
}
public function constructUrl(Nette\Application\Request $appRequest, Nette\Http\Url $refUrl)
{
// upravím parametry
$params = $appRequest->getParameters();
if (isset($params['data'])) {
$params['data'] = implode('+', (array)$params['data']);
}
$appRequest->setParameters($params);
// vytvořím url
return parent::constructUrl($appRequest, $refUrl);
}
}
Do parametrů v masce totiž pole nepatří.
Editoval HosipLan (30. 6. 2012 11:41)