Created
December 29, 2015 20:19
-
-
Save NoelDavies/78d85a2e54461a7c10bb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| use Nette\Application\Routers\Route; | |
| use Nette\Application\Routers\RouteList; | |
| use Nette\Caching\Cache; | |
| use Nette\Caching\Storages\FileStorage; | |
| use Nette\Utils\Strings; | |
| /** | |
| * Class ApplicationRouter | |
| */ | |
| class ApplicationRouter { | |
| /** @var \DibiConnection */ | |
| public $db; | |
| /** @var RouteList */ | |
| public $router; | |
| /** @var array */ | |
| public $variables; | |
| /** @var FileStorage */ | |
| private $storage; | |
| /** @var array */ | |
| private $languages; | |
| /** | |
| * @param RouteList $router | |
| * @param array $variables | |
| * @param DibiConnection $db | |
| * @param FileStorage $storage | |
| */ | |
| public function __construct(RouteList $router, array $variables, DibiConnection $db, FileStorage $storage) { | |
| $this->router = $router; | |
| $this->variables = $variables; | |
| $this->db = $db; | |
| $this->storage = $storage; | |
| } | |
| /** | |
| * @internal param $router | |
| * @internal param array $variables | |
| */ | |
| public function createRoutesServer() { | |
| $router = $this->router; | |
| $variables = $this->variables; | |
| $url = $variables['url']; | |
| $presenter = $variables['presenter']; | |
| $action = $variables['action']; | |
| $lang = $variables['lang']; | |
| $matskup = $variables['matskup']; | |
| $router[] = new Route('index.php', 'Eshop:' . $presenter . ':' . $action, Route::ONE_WAY); | |
| $router[] = new Route('sitemap.xml', 'Eshop:Response:generateSitemap', Route::ONE_WAY); | |
| $this->defineRoutesAdmin($router, $url, 'Admin', $lang); | |
| $this->defineRoutesOdbyt($router, $url, 'Odbyt'); | |
| $this->defineRoutesEshop($router, $url, 'Eshop', $lang, $matskup); | |
| } | |
| /** | |
| * @param $router | |
| * @param $url | |
| * @param $module | |
| * | |
| * @param $def_lang | |
| * | |
| * @return array | |
| */ | |
| protected function defineRoutesAdmin($router, $url, $module, $def_lang) { | |
| $router[] = $adminRouter = new RouteList($module); | |
| $adminRouter[] = new Route( | |
| '//' . $url . '/[!<lang [a-z]{2}>/]' . strtolower($module) . '/<presenter>/<action>[/<id>]', | |
| [ | |
| "presenter" => "Default", | |
| "action" => "default", | |
| "lang" => $def_lang, | |
| ] | |
| ); | |
| return $router; | |
| } | |
| /** | |
| * @param $router | |
| * @param $url | |
| * @param $module | |
| * | |
| * @return mixed | |
| */ | |
| protected function defineRoutesOdbyt($router, $url, $module) { | |
| $router[] = $moduleRouter = new RouteList($module); | |
| $lang = 'sk'; | |
| $module = strtolower($module) . '/'; | |
| $page = '?page=<paginator-page>'; | |
| $id = '[/<id>]'; | |
| $matskup = '[/<matskup>]'; | |
| $langs = '/[!<lang [a-z]{2}>/]'; | |
| $key = '[/<key>]'; | |
| $way = '//' . $url . $langs . $module; | |
| $cmpSelect = '[/<companiesSelect-tab p|f|null>][/<companiesSelect-p-page=0 [0-9]>]'; | |
| $cmpSelectTable = [ | |
| 'f' => 'companies', | |
| 'p' => 'traffics', | |
| null => 'all', | |
| ]; | |
| $moduleRouter[] = new Route( | |
| $way . 'vyber-subjektu' . $cmpSelect, [ | |
| 'presenter' => 'Login', | |
| 'action' => 'select', | |
| 'companiesSelect-tab' => [ | |
| Route::FILTER_IN => function ($tab) use ($cmpSelectTable) { | |
| return $cmpSelectTable[$tab === '' || $tab === 'all' ? '' : $tab]; | |
| }, | |
| Route::FILTER_OUT => function ($tab) use ($cmpSelectTable) { | |
| return array_search($tab, $cmpSelectTable, true); | |
| }, | |
| ], | |
| 'lang' => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'katalog/akcie' . $matskup . $id . $page, [ | |
| "presenter" => "Catalog", | |
| "action" => "discounts", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'katalog/novinky' . $matskup . $id . $page, [ | |
| "presenter" => "Catalog", | |
| "action" => "introductions", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'katalog/vypredaj' . $matskup . $id . $page, [ | |
| "presenter" => "Catalog", | |
| "action" => "sales", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'katalog' . $matskup . $id . $page, [ | |
| "presenter" => "Catalog", | |
| "action" => "view", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'hladaj' . $id . $page, [ | |
| "presenter" => "Catalog", | |
| "action" => "search", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'kategorie' . $matskup . $id . $page, [ | |
| "presenter" => "Catalog", | |
| "action" => "categories", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| /** odtialto */ | |
| $moduleRouter[] = new Route( | |
| $way . 'objednavky' . $id . $page, [ | |
| "presenter" => "Orders", | |
| "action" => "default", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'objednavka' . $key . $id . $page, [ | |
| "presenter" => "Orders", | |
| "action" => "view", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $cart = 'kosiky'; | |
| $moduleRouter[] = new Route( | |
| $way . $cart . $id . $page, | |
| ["presenter" => "Cart", "action" => "default", "lang" => $lang] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . $cart . '/detail' . $key . $id . $page, [ | |
| "presenter" => "Cart", | |
| "action" => "view", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . $cart . '/kontrola' . $key . $id . $page, [ | |
| "presenter" => "Cart", | |
| "action" => "view", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . $cart . '/doprava' . $key . $id . $page, [ | |
| "presenter" => "Cart", | |
| "action" => "options", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . $cart . '/doprava' . $key . $id . $page, [ | |
| "presenter" => "Tranposrt", | |
| "action" => "default", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'prihlasenie' . $key . $id . $page, [ | |
| "presenter" => "Login", | |
| "action" => "login", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'kontakty' . $id . $page, | |
| ["presenter" => "Homepage", "action" => "contacts", "lang" => $lang] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'uvod' . $id . $page, | |
| ["presenter" => "Homepage", "action" => "default", "lang" => $lang] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'obchodne-podmienky' . $id . $page, [ | |
| "presenter" => "Homepage", | |
| "action" => "terms", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'prepravne-podmienky' . $id . $page, [ | |
| "presenter" => "Homepage", | |
| "action" => "dop", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| $moduleRouter[] = new Route( | |
| $way . 'produkt' . $key . $id . $page, [ | |
| "presenter" => "Product", | |
| "action" => "default", | |
| "lang" => $lang, | |
| ] | |
| ); | |
| /** sem */ | |
| $moduleRouter[] = new Route( | |
| $way . '<presenter>/<action>' . $matskup . $id, [ | |
| "presenter" => 'Cart', | |
| "action" => 'default', | |
| "lang" => $lang, | |
| ] | |
| ); | |
| return $router; | |
| } | |
| /** | |
| * @param $router | |
| * @param $url | |
| * @param $module | |
| * @param $lang | |
| * @param $smatskup | |
| * | |
| * @internal param $matskup | |
| * @return array | |
| */ | |
| protected function defineRoutesEshop($router, $url, $module, $lang, $smatskup) { | |
| $moduleRouter = new RouteList($module); | |
| $slang = '/[!<lang [a-z]{2}>/]'; | |
| $way = '//' . $url; | |
| $extends['catalog'] = '[/<matskup>]?page=<paginator-page>'; | |
| $extends['product'] = '/<key>[/<key2>]'; | |
| $md5 = md5("{$url}-{$lang}"); | |
| $cache = new Cache($this->storage); | |
| if ($cache->offsetExists('eshop-router-' . $md5) && !in_array( | |
| $_SERVER['REMOTE_ADDR'], | |
| ['127.0.0.1', 'localhost'] | |
| ) | |
| ) { | |
| $this->customRoutes($router, $lang, $way); | |
| $router[] = $cache->load('eshop-router-' . $md5); | |
| return $router; | |
| } | |
| $this->languages = $this->db | |
| ->select('*') | |
| ->from('jazyky') | |
| ->fetchPairs('skratka', 'skratka'); | |
| $routes = $this->db | |
| ->select('webalized, link, unique_key, enabled, primar') | |
| ->from('menu') | |
| ->where('link like %~like~', ':') | |
| // ->where('enabled IN %in', [1, 2]) | |
| ->fetchAssoc('unique_key'); | |
| $primare_routes = []; | |
| $catalog_routes = []; | |
| foreach ($routes as $key => $page) { | |
| $builded = false; | |
| if ($page->unique_key !== 'carts' && | |
| (Strings::startsWith($page->unique_key, 'cart') || | |
| Strings::startsWith($page->unique_key, 'transport') || | |
| $page->unique_key === 'thanks-giving') | |
| ) { | |
| $this->routeGroup( | |
| $page, | |
| $routes['carts'], | |
| ['way' => $way, 'extend' => '[/<key>]'], | |
| $moduleRouter | |
| ); | |
| $builded = true; | |
| } elseif ($page->unique_key !== 'catalog' && Strings::startsWith($page->unique_key, 'catalog')) { | |
| $this->routeGroup( | |
| $page, | |
| $routes['catalog'], | |
| ['way' => $way, 'extend' => $extends['catalog']], | |
| $moduleRouter | |
| ); | |
| $builded = true; | |
| } elseif ($page->unique_key === 'order') { | |
| $this->routeGroup( | |
| $page, | |
| $routes['orders'], | |
| ['way' => $way, 'extend' => '[/<key>]'], | |
| $moduleRouter | |
| ); | |
| $builded = true; | |
| } elseif ($page->unique_key !== 'register' && Strings::startsWith($page->unique_key, 'register')) { | |
| $this->routeGroup( | |
| $page, | |
| $routes['register'], | |
| ['way' => $way, 'extend' => null], | |
| $moduleRouter | |
| ); | |
| $builded = true; | |
| } elseif ($page->unique_key !== 'cms' && Strings::startsWith($page->link, 'Cms:')) { | |
| $this->routeGroup( | |
| $page, | |
| $routes['cms'], | |
| ['way' => $way, 'extend' => null], | |
| $moduleRouter | |
| ); | |
| $builded = true; | |
| } elseif ($page->unique_key !== 'account' && Strings::startsWith($page->unique_key, 'account')) { | |
| $this->routeGroup( | |
| $page, | |
| $routes['account'], | |
| ['way' => $way, 'extend' => null], | |
| $moduleRouter | |
| ); | |
| $builded = true; | |
| } | |
| if ($builded === false || $page->primar) { | |
| list($presenter, $action) = explode(':', $page->link); | |
| $un = @unserialize($page->webalized); | |
| if ($un !== false) { | |
| $not_set = []; | |
| if (count($un) !== count($this->languages)) { | |
| $not_set = array_diff_key($this->languages, $un); | |
| } | |
| foreach ($un as $l => $web) { | |
| //@todo: Commented, who knows why its not working | |
| // if (!empty($primare_routes)) { | |
| // continue; | |
| // } | |
| if (!empty($not_set) && $l === $this->variables['lang']) { | |
| $not_set[] = $l; | |
| $r_lang = '/[!<lang (' . join('|', $not_set) . ')>/]'; | |
| } else { | |
| $r_lang = '/[!<lang (' . $l . ')>/]'; | |
| } | |
| if (count($un) === 1) { | |
| $r_lang = '/[!<lang [a-z]{2}>/]'; | |
| } | |
| if (!$page->primar) { | |
| $route = new Route( | |
| $way . $r_lang . $web . | |
| (isset($extends[$page->unique_key]) ? $extends[$page->unique_key] : null), | |
| [ | |
| 'presenter' => $presenter, | |
| 'action' => $action, | |
| 'lang' => $l, | |
| ] | |
| ); | |
| if ($page->unique_key === 'catalog' && $page->link === 'Catalog:categories') { | |
| $url = $way . $r_lang . $web . | |
| (isset($extends[$page->unique_key]) ? $extends[$page->unique_key] : null); | |
| $url = str_replace('[/<matskup>]', '/<matskup>', $url); | |
| $catalog_routes[] = new Route( | |
| $url, | |
| [ | |
| 'presenter' => 'Catalog', | |
| 'action' => 'view', | |
| 'lang' => $l, | |
| ] | |
| ); | |
| } elseif ($page->unique_key === 'catalog' && $page->link !== 'Catalog:categories') { | |
| $catalog_routes[] = $route; | |
| } else { | |
| $moduleRouter[] = $route; | |
| } | |
| } else { | |
| if ($page->unique_key === 'catalog' && $page->link === 'Catalog:categories') { | |
| $url = $way . $r_lang . $web . | |
| (isset($extends[$page->unique_key]) ? $extends[$page->unique_key] : null); | |
| $url = str_replace('[/<matskup>]', '/<matskup>', $url); | |
| $catalog_routes[] = new Route( | |
| $url, | |
| [ | |
| 'presenter' => 'Catalog', | |
| 'action' => 'view', | |
| 'lang' => $l, | |
| ] | |
| ); | |
| } | |
| $primare_routes[] = new Route( | |
| $way . $r_lang . $web . | |
| (isset($extends[$page->unique_key]) ? $extends[$page->unique_key] : null), | |
| [ | |
| 'presenter' => $presenter, | |
| 'action' => $action, | |
| 'lang' => $l, | |
| ] | |
| ); | |
| $primare_routes[] = new Route( | |
| $way . | |
| '/[!<lang (' . join('|', array_keys($un)) . ')>/]<presenter>/<action>' . | |
| (isset($extends[$page->unique_key]) ? $extends[$page->unique_key] : null), | |
| [ | |
| 'presenter' => $presenter, | |
| 'action' => $action, | |
| 'matskup' => $smatskup, | |
| 'lang' => $l, | |
| ] | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| foreach ($catalog_routes as $route) { | |
| $moduleRouter[] = $route; | |
| } | |
| foreach ($primare_routes as $l => $route) { | |
| $moduleRouter[] = $route; | |
| } | |
| $cache->save( | |
| 'eshop-router-' . $md5, | |
| $moduleRouter, | |
| [ | |
| Cache::EXPIRATION => '+4 hours', | |
| Cache::TAGS => ['menu', 'router'], | |
| ] | |
| ); | |
| $this->customRoutes($router, $lang, $way . $slang); | |
| $router[] = $moduleRouter; | |
| return $router; | |
| } | |
| private function routeGroup($page, $main, array $route_parts, &$router) { | |
| if ($page->primar) { | |
| return; | |
| } | |
| $main_webalized = @unserialize(@$main->webalized); | |
| $un = @unserialize($page->webalized); | |
| list($presenter, $action) = explode(':', $page->link); | |
| if ($un !== false) { | |
| // Check all languages, which not have translation | |
| $not_set = []; | |
| if (count($un) !== count($this->languages)) { | |
| $not_set = array_diff_key($this->languages, $un); | |
| } | |
| foreach ($un as $l => $web) { | |
| if (!$web) { | |
| $web = $main_webalized[$this->variables['lang']]; | |
| } | |
| if (!empty($not_set) && $l === $this->variables['lang']) { | |
| $not_set[] = $l; | |
| $r_lang = '/[!<lang (' . join('|', $not_set) . ')>/]'; | |
| } else { | |
| $r_lang = '/[!<lang (' . $l . ')>/]'; | |
| } | |
| if (count($un) === 1) { | |
| $r_lang = '/[!<lang [a-z]{2}>/]'; | |
| } | |
| $web_main = isset($main_webalized[$l]) | |
| ? $main_webalized[$l] | |
| : $main_webalized[$this->variables['lang']]; | |
| $route = new Route( | |
| $route_parts['way'] . $r_lang . $web_main . '/' . $web . | |
| $route_parts['extend'], | |
| [ | |
| 'presenter' => $presenter, | |
| 'action' => $action, | |
| 'lang' => $l, | |
| ] | |
| ); | |
| $router[] = $route; | |
| } | |
| } | |
| } | |
| /** | |
| * @param $router | |
| * @param $lang | |
| * @param $way | |
| */ | |
| protected function customRoutes(&$router, $lang, $way) { | |
| /******** CUSTOM *********/ | |
| $router[] = new Route( | |
| $way . 'servis[/<id>]', [ | |
| 'module' => 'Eshop', | |
| 'presenter' => 'Service', | |
| 'action' => 'client', | |
| 'lang' => $lang, | |
| 'id' => [ | |
| Route::FILTER_IN => function ($id) { | |
| switch ($id) { | |
| case 'odstupenie-od-zmluvy': | |
| return 'withdrawal'; | |
| case 'reklamacny-protokol': | |
| return 'claim'; | |
| default: | |
| return $id; | |
| } | |
| }, | |
| Route::FILTER_OUT => function ($id) { | |
| switch ($id) { | |
| case 'withdrawal': | |
| return 'odstupenie-od-zmluvy'; | |
| case 'claim': | |
| return 'reklamacny-protokol'; | |
| default: | |
| return $id; | |
| } | |
| }, | |
| ], | |
| ] | |
| ); | |
| /******** *********/ | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment