Yii рдореЗрдВ рд╕реНрдерд┐рд░ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдирд╛

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕реНрдереИрддрд┐рдХ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд┐рдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрд╛рд░реНрдп рдмрд▓реНрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╣рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдРрд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЫреЛрдЯреА рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрдЧреЗ рд░рдЦреЗ рдЧрдП рд╕реНрдереИрддрд┐рдХ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдирд╣реАрдВ рд╣реИрдВ:


рдЪреВрдВрдХрд┐ рд╡рд░реНрдгрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдмрдирд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБред

рд╣рдорд╛рд░реА рдкреВрд░реА рдкреНрд░рдгрд╛рд▓реА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреА рд╣реИ, рдЗрд╕реЗ рдкрде рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╣рддреЗ рд╣реИрдВ ред рд╕рд░рдгреА рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдПрдХ рдЕрд▓рдЧ рдкреГрд╖реНрда рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬрд┐рдпрд╛рдБ (рдмрд╛рдж рдореЗрдВ рдЖрдИрдбреА) рд╕рд░рдгреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЗ рдкрде рдХреЛ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд╛рд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:


рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП SQL рдХреНрд╡реЗрд░реА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

CREATE TABLE IF NOT EXISTS `pages` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `root` int(10) unsigned NOT NULL, `lft` int(10) unsigned NOT NULL, `rgt` int(10) unsigned NOT NULL, `level` int(10) unsigned NOT NULL, `parent_id` int(10) unsigned NOT NULL, `slug` varchar(127) NOT NULL, `layout` varchar(15) DEFAULT NULL, `is_published` tinyint(1) unsigned NOT NULL DEFAULT '0', `page_title` varchar(255) NOT NULL, `content` text NOT NULL, `meta_title` varchar(255) NOT NULL, `meta_description` varchar(255) NOT NULL, `meta_keywords` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `root` (`root`), KEY `lft` (`lft`), KEY `rgt` (`rgt`), KEY `level` (`level`) ); 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреНрд╡реЗрд░реА рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, "рдиреЗрд╕реНрдЯреЗрдб рд╕реЗрдЯ" рдкреЗрдбрд╝реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рднрд╛рдЧ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рд╕реЗрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛ред

рдЕрдЧрд▓рд╛, рдЬреАрдЖрдИрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдореЙрдбреНрдпреВрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ (рдЗрд╕реЗ рдкреЗрдЬ рдХрд╣рддреЗ рд╣реИрдВ), рд╕рд╛рде рд╣реА рдирдП рдмрдирд╛рдП рдЧрдП рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ (рд╣рдо рдЗрд╕реЗ рдкреЗрдЬ рдХрд╣реЗрдВрдЧреЗ) рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред

рдмрдирд╛рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХреЛрдб рдХреЛ рдареАрдХ рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖рддрд╛ $ cacheId рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдХреИрд╢реНрдб рдкрде рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред

рдЬрдм рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЪреЗрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд╛рде рдореИрдк рдХреИрд╢ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреЙрд▓ рдХреЗ рд╕рдордп рдЬреЛ рдореИрдк рдЪрд╛рд▓реВ рд╣реИ, рд╡рд╣ рдЬреЗрдирд░реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо init () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рд╣рдо рддреАрди рддрд░реАрдХреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рдирд╛, рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрддрд╛ рд╣реИ:

 class PagesModule extends CWebModule { /** * @var string ,       */ public $cacheId = 'pagesPathsMap'; public function init() { if (Yii::app()->cache->get($this->cacheId) === false) $this->updatePathsMap(); $this->setImport(array( 'pages.models.*', 'pages.components.*', )); } /** *     . * @return mixed */ public function getPathsMap() { $pathsMap = Yii::app()->cache->get($this->cacheId); return $pathsMap === false ? $this->generatePathsMap() : $pathsMap; } /** *         . * @return void */ public function updatePathsMap() { Yii::app()->cache->set($this->cacheId, $this->generatePathsMap()); } /** *   . * @return array ID  =>    */ public function generatePathsMap() { $nodes = Yii::app()->db->createCommand() ->select('id, level, slug') ->from('pages') ->order('root, lft') ->queryAll(); $pathsMap = array(); $depths = array(); foreach ($nodes as $node) { if ($node['level'] > 1) $path = $depths[$node['level'] - 1]; else $path = ''; $path .= $node['slug']; $depths[$node['level']] = $path . '/'; $pathsMap[$node['id']] = $path; } return $pathsMap; } } 

рд╣рдо рдореЙрдбреНрдпреВрд▓ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд░рдгреА рдХреЗ рдореЙрдбреНрдпреВрд▓ рдЧреБрдг рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рднреВрд▓ рди рдХрд░реЗрдВред

рдЕрдм CBUUrlRule рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдЖрдП PagesUrlRule рд░реВрд▓ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВред рдпрд╣ рдХреЗрд╡рд▓ рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: URL рдмрдирд╛рдиреЗ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред URL рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╛ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 public function createUrl($manager, $route, $params, $ampersand) { $pathsMap = Yii::app()->getModule('pages')->getPathsMap(); if ($route === 'pages/default/view' && isset($params['id'], $pathsMap[$params['id']])) return $pathsMap[$params['id']] . $manager->urlSuffix; else return false; } 

рд╡рд┐рдзрд┐ рдореЗрдВ, рдкрде рдХреЗ рдирдХреНрд╢реЗ рдореЗрдВ рдкреГрд╖реНрда рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЬрдм рдпрд╣ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкрде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ (URL рдкреНрд░рддреНрдпрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛! рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдкрддреЗ рдПрдХ рд╕реНрд▓реИрд╢ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ)ред

URL рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдХреЛрдб (рдпрд╣рд╛рдВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреГрд╖реНрда рдЖрдИрдбреА рдХреЛ рдЗрд╕рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рд╣реИ):

 public function parseUrl($manager, $request, $pathInfo, $rawPathInfo) { $pathsMap = Yii::app()->getModule('pages')->getPathsMap(); $id = array_search($pathInfo, $pathsMap); if ($id === false) return false; $_GET['id'] = $id; return 'pages/default/view'; } 

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд░рдгреА рдореЗрдВ рдирд┐рдпрдо рд╡рд░реНрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред рдЦреИрд░, рдЪреВрдВрдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреЛрдб рдЖрдЙрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

 class DefaultController extends Controller { public function actionView($id) { $page = $this->loadModel($id); $this->render('view', array( 'page' => $page, )); } public function loadModel($id) { $model = Page::model()->published()->findByPk($id); if ($model === null) throw new CHttpException(404, '   .'); return $model; } } 

рджрд░рдЕрд╕рд▓, рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ, URL рдмрдирд╛рдиреЗ рдФрд░ рдЖрдЧрдВрддреБрдХ рдХреЛ рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддреИрдпрд╛рд░ рд╣реИред рдФрд░ рдкреЗрдЬ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдпрд╣ рдХрд╛рдлреА рдорд╛рдирдХ рд╣реИ), рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

UPD1ред рдХреИрд╢ рдХреЗ рд╕рд╛рде рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдп, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛, рд╕рдорд╛рдкреНрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рд▓рд┐рдВрдХред

Source: https://habr.com/ru/post/In155927/


All Articles