Proč router hledá další routu když už jednu našel
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.

- jasin755
 - Člen | 116
 
Zdravím,
řeším pro mě nepochopitelný problém. Napsal jsem si vlastní router a
router list. Router se dotazuje nějakých jiných tříd zda ta adresa je
platná vrací to jenom TRUE nebo FALSE. No a nastala situace kdy to najde
správnou routu, ale z nepochopitelného důvodu je tam další redirect (viz.
screen) a na uplný nesmysl. Může mi prosím někdo toto chování objasnit
nějak tomu nerozumim :(
Screen
https://scontent-a-ams.xx.fbcdn.net/…646332_o.jpg
Router
<?php
namespace Exsys\Router;
class Router extends \Nette\Application\Routers\Route{
	/**
	 *
	 * @var string
	 */
	private $url_facade;
	public function __construct($mask,$metadata = array(),\Exsys\Url\UrlFacade $url_facade,$flags = 0){
		$this->url_facade = $url_facade;
		parent::__construct($mask,$metadata,$flags);
	}
	private function modificateParams(array &$params,\Exsys\Url\ProtectedUrl $protected_url = NULL){
		$values = $protected_url->getValues();
		if(is_array($values)){
			$values = implode('+',$values);
		}
		$params[$protected_url->getValueName()] = $values;
		$child = $protected_url->getChild();
		if(!empty($child)){
			$this->modificateParams($params, $child['object']);
		}
	}
	private function translateParams(\Nette\Application\Request $request){
	}
	public function constructUrl(\Nette\Application\Request $appRequest, \Nette\Http\Url $refUrl){
		return parent::constructUrl($appRequest, $refUrl);
	}
	public function match(\Nette\Http\IRequest $http_request){
		$app_request = parent::match($http_request);
		if(is_null($app_request)){
			return NULL;
		}
		$params = $app_request->getParameters();
		$protected_url = $this->url_facade->getProtectedUrl($params);
		if(!empty($protected_url)){
			$result = $this->url_facade->checkProtectedValues($protected_url);
		}
		if(!empty($result)){
			if($result === TRUE){
				$this->modificateParams($params, $protected_url);
			}else{
				return NULL;
			}
		}elseif(!empty($protected_url)){
			return NULL;
		}
		//print_r($app_request);
		$app_request->setParameters($params);
		return $app_request;
	}
}
RouterList
<?php
namespace Exsys\Router;
use Nette\Application\Routers\RouteList;
use Exsys\Errors\RouterError;
class RouterList{
	private $httprequest;
	private $repository;
	private $shop_facade;
	private $product_facade;
	private $category_facade;
	private $url_facade;
	public function __construct(
			\Nette\Http\Request $httprequest,
			\Exsys\Router\RouterRepository $router_repository,
			\Exsys\Shop\ShopFacade $shop_facade,
			\Exsys\Products\ProductsFacade $product_facade,
			\Exsys\Categories\CategoriesFacade $category_facade,
			\Exsys\Url\UrlFacade $url_facade
			){
		$this->httprequest = $httprequest;
		$this->router_repository = $router_repository;
		$this->shop_facade = $shop_facade;
		$this->category_facade = $category_facade;
		$this->product_facade = $product_facade;
		$this->url_facade = $url_facade;
	}
	public function getRouterList($host = false){
		if($host === false){
			$host = $this->httprequest->getUrl()->getHost();
		}
		$routes = $this->router_repository->getWebRouterList($host);
		if(!$routes){
			throw new RouterError('Nenalezena routa pro tento web');
		}
		$routelist = new RouteList();
		$url_facade = $this->url_facade;
		foreach($routes AS $route){
			$web = $route->getWeb();
			if($web->getActive() === 0){
				continue;
			}
			$module = ucfirst($web->getModule());
			$submodule = FALSE;
			preg_match("@^/(-?\d+)/@",$this->httprequest->url->getPath(),$matches);
			if($matches){
				$shop_id = $matches[1];
			}else{
				$shop_id = null;
			}
			if($this->shop_facade instanceof \Exsys\Shop\ShopFacade && $module === 'Web1localhost' && (int)$shop_id === -1){
				$submodule = 'System';
			}elseif($module === 'Web1localhost'){
				$submodule = 'Shop';
			}else{
				$submodule = FALSE;
			}
			$routelist[] = new \Exsys\Router\Router('//'.$host.$route->router_declaration,array(
					'module' => $module.($submodule ? ':'.$submodule : ''),
					'presenter' => ucfirst($route->presenter),
					'action' => $route->action
			),$this->url_facade);
		}
		return $routelist;
	}
}