Yiiで静的ページを操作する

この記事では、静的ページを操作するための基本的な機能の作成を検討します。 タスクはかなり平凡に思えますが、ページのネストが必要な場合は、より複雑になることを認めなければなりません。 この記事では、このようなタスクのためのシンプルなソリューションを提供したいと思います。これは、小さなWebサイトによって提示される静的ページの要件のほとんどをカバーできるように思えます。



実際、要件はそれほど多くありません。





記述されている要件は、作成されるほとんどのサイトに必要な機能に提示されているため、モジュールとして設計し、将来はプロジェクトからプロジェクトにコピーするだけです。



システム全体は単純な配列を中心に展開するため、パスマップと呼びましょう。 配列の各要素は、個別のページを特徴付けます。 データベース内のページの主キー(以降ID)は配列インデックスとして使用され、対応するページへのパスは値として使用されます。



したがって、タスクは次のことを行うコードを記述することです。





それでは始めましょう。 ページを保存するためのテーブルを作成することから始めましょう。 このための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`) );
      
      





クエリからわかるように、階層構造を構築するには、ツリーの「ネストされたセット」を保存する方法が使用されます。したがって、モジュールの管理部分を追加するときは、 ネストされたセットの動作拡張を使用するのが理にかなっています。



次に、Giiを使用して、モジュールフレームワークを生成し(ページと呼びましょう)、新しく作成したテーブルを操作するためのモデル(ページと呼びます)を生成します。



作成したモジュールのコードを修正してください。 キャッシュされたパスマップの識別子を格納する属性$ cacheIdを追加します。



モジュールを初期化するとき、キャッシュにパスマップが存在するかどうかを確認する必要があります。存在しない場合は、呼び出し時に最新のマップを生成する必要があります。 これを行うには、init()関数を追加します。



また、パスのマップを生成、更新、返すという3つのメソッドを追加します。 合計で、モジュールコードは次の形式を取ります。



 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; } }
      
      





モジュールクラスはこれで完了です。構成配列のモジュールプロパティにモジュール識別子を追加して、アプリケーションにそのことを知らせることを忘れないでください。



次に、CBaseUrlRuleから継承したPagesUrlRuleルールクラスを作成します。 URLを作成および解析するためのメソッドを2つだけ宣言するだけで十分です。 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を解析するためのメソッドのコード(ここでは、ページIDが途中で検索されます):



 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。 キャッシュの修正、テーブルへのインデックスの追加、完成したプロジェクトのファイルへのリンクの更新。



All Articles