Nette routy nepodporují parametry typu array nebo object

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

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
+
0
-

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)