1.テンプレートを使用した作業の最適化(VIEWS)
各テンプレートがゼロからページを作成する必要性を気にしませんか(Doctype、スタイルなどを含む)? 静的に切り替えるのはそう長くはありません。 したがって、最初の考えは、ネストされたテンプレートを実装することです。
すべてのテンプレートには特定の共通部分があり、個別のファイルに配置され、各コントローラーメソッドで接続されます。 viewsフォルダーにindex.phpファイルを作成します。
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < html > < head > <? php echo html::stylesheet ( array ( 'assets/css/style' ), array ( 'screen' ), FALSE ); ? > < title > CD COLLECTION </ title > </ head > < body > <!-- BEGIN NAVIGATION MENU --> < ul id ="navigation" > < li ><? =html::anchor('album', 'Albums')? ></ li > </ ul > <!-- END NAVIGATION MENU --> <? =$content? > </ body > </ html > * This source code was highlighted with Source Code Highlighter .
別のファイルにページヘッダーを配置し、独自にナビゲーションメニューを追加しました(これまでのところ、ある時点からですが、後で拡張します)。 コントローラーAlbum_Controllerの結果が含まれる変数$ contentに注意してください 。 style.cssファイルに次の行を追加します(ナビゲーションメニューの規則):
*このソースコードは、 ソースコードハイライターで強調表示されました。
- #navigation {
- オーバーフロー:非表示。
- list-style-type:なし;
- }
- #navigation li {
- float:左;
- マージン左:0.5em;
- 境界線:1px黒一色;
- }
- #navigation li a {
- フォントサイズ:14px;
- ディスプレイ:ブロック;
- パディング:2px 5px;
- テキスト装飾:なし;
- 色:#fff;
- 背景:#666;
- }
次に、使用可能なテンプレートの余分な部分をすべて切り取ります。 list.phpファイルの例を使用して、最終結果を表示します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- <? 定義済みの php ( 'SYSPATH' ) または die ( '直接スクリプトアクセスなし' );
- echo html :: image ( 'assets / images / add.png' );
- echo html :: anchor ( 'album / show_create_editor' 、 'Add new album' );
- ? >
- < table class = "list" cellspacing = "0" >
- < tr >
- < td colspan = "5" class = "list_title" > CDコレクション</ td >
- </ tr >
- < tr >
- < td class = "headers" >アルバム名</ td >
- < td class = "headers" >著者</ td >
- < td colspan = '3' class = "headers" >ジャンル</ td >
- </ tr >
- <? php
- foreach ($ albums_list as $ item )
- {
- echo " < tr > ";
- echo " < td class = 'item' > "。$ item- > name。 " </ td > ";
- echo " < td class = 'item' > "。$ item- > author。 " </ td > ";
- echo " < td class = 'item' > "。$ item- > genre- > name。 " </ td > ";
- echo " < td class = 'item' > " .html :: anchor( 'album / delete /'.$ item- > id、html :: image(' asset / images / delete.png '))。 " </ td > ";
- echo " < td class = 'item' > " .html :: anchor( 'album / show_update_editor /'.$ item- > id、html :: image(' asset / images / edit.png '))。 " </ td > ";
- echo " </ tr > ";
- }
- ? >
- </ 表 >
ご覧のとおり、テンプレートにはアルバムのリストの出力に直接関連する情報のみが含まれています。 ただし、テンプレートだけを変更するだけでは不十分です。Album_Controllerコントローラーにアクセスする必要があります( show_albums_list()メソッドで変更を示します)。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- //コントローラーはTemplate_Controllerの子孫になりました!
- Album_ControllerクラスはTemplate_Controllerを拡張します
- {
- //ベーステンプレートを指定します
- public $ template = 'index';
- ...
- プライベート関数show_albums_list()
- {
- $ albums_list = $ this- > album_model- > get_list();
- $ this- > template- > content = View :: factory( 'list')
- - >セット( 'albums_list'、$ albums_list);
- }
- ...
最初に、 Template_Controllerから継承しました。 つまり これで、各コントローラーに$ this->テンプレートプロパティが表示されます。これにはベーステンプレートが含まれます(コントローラーで$テンプレート変数はViewクラスのオブジェクトになります )。 さらに、デフォルトでは、この基本テンプレートは自動的に表示されます。 各メソッドの最後に$ this-> template-> render(TRUE)を呼び出す必要はなくなりました。
第二に、テンプレート(および他のオブジェクト)に好きなだけ他のパターンを配置できます。 したがって、上記の例では、 list.phpテンプレートを含む$ this->テンプレートプロパティに変数 ' content 'を設定し、変数 ' albums_list 'を渡しています。 したがって、 $ list_viewのような変数を保存する必要がなくなりました(コントローラーから削除します)。
テンプレートに変数の値を設定するには、いくつかの方法があります。 set()メソッドは、オブジェクトを順次操作する場合に便利です。この場合、呼び出しの一種のチェーンを取得します。 値を直接割り当てる( $ this-> template-> content = ... )は同じことを行いますが、読むほうがより快適です(IMHO)。
原則として、何も変更されていませんが、CSSファイルまたはナビゲーションメニューの項目のリストを変更する必要がある場合、1つのファイル( index.php )のみを編集します。
そして、あなたはアプリケーションのURLを気にしませんか?
もちろん、 localhost / kohana / index.php / albumは何とか見えません。 すべての進歩的な人類は長い間、そしてオフィスで.htaccessを使用してきました。 サイトには設定方法に関する情報があり、 config / config.phpファイルを少し調整します 。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- / **
- *このアプリケーションのフロントコントローラーの名前。 デフォルト:index.php
- *
- *これは、URL書き換えを使用して削除できます。
- * /
- $ config ['index_file'] = '';
これで、URL内のフロントコントローラーの名前( index.php )を省略できます。 さらに、 Album_Controllerコントローラーでデフォルトのルーティングを構成します。
// config / routes.php $ config ['_ default'] = 'album';
これで、 localhost / kohanaがlocalhost / kohana / index.php / albumに移動します 。
著者によるモデルの使用
Album_Model-> read($ id)メソッドを検討してください。これは、識別子$ idのアルバムを返すはずです:
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック関数読み取り($ id)
- {
- $ this- > db- > where( 'id'、$ id);
- $ query = $ this- > db- > get($ this- > album_table);
- return $ query- > result_array();
- }
アルバムが1つしかない場合に、データベースからレコードの配列を選択する理由がわかりません。 メソッドをやり直します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック関数読み取り($ id)
- {
- return $ this- > db
- - > where( 'id'、$ id)
- - >取得($ this- > album_table)
- - >現在();
- }
1つのレコードのみに関心があるため、 現在の()メソッドを使用して最初の行を取得します。 レコードが見つからない場合、 FALSEが返されます。 したがって、 show_update_editor()も変更されます(たとえば、アルバムフィールドを個別に保存する代わりに、レコード全体を保存するだけで済みます)。次のようになります。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック関数show_update_editor($ id)
- {
- $ album_data = $ this- > album_model- > read($ id);
- if(FALSE === $ album_data)
- イベント::実行( 'system.404');
- $ this- > template- > content = View :: factory( 'update')
- - >セット(「アルバム」、$ album_data)
- - > set( 'genres_list'、$ this- > get_genres_list());
- }
メソッドの最初に、編集されたアルバムの存在のチェックが追加され、見つからない場合、システムメッセージ ' system.404 'が生成され、対応するエラーが発生します。 見つかったアルバムに関するすべての情報は、 $ album変数としてテンプレートに保存されるため、 views / update.phpファイルも変更します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- <? php echo form :: open ( 'album / update' ); ? >
- < テーブル クラス = 'エディター' >
- < tr >
- < td colspan = '2' class = 'editor_title' >アルバムの更新</ td >
- </ tr >
- <? php
- echo " < tr > ";
- echo " < td > " .form :: label( 'name'、 'Name:')。 " </ td > ";
- echo " < td > " .form :: input( 'name'、$ album- > name)。 " </ td > ";
- echo " </ tr > ";
- echo " < tr > ";
- echo " < td > " .form :: label( 'author'、 'Author:')。 " </ td > ";
- echo " < td > " .form :: input( 'author'、$ album- > author)。 " </ td > ";
- echo " < tr /> ";
- echo " < tr > ";
- echo " < td > " .form :: label( 'genre'、 'Genre:')。 " </ td > ";
- echo " < td > " .form :: dropdown( 'genre_id'、$ genres_list、$ album- > genre_id)。 " </ td > ";
- echo " < tr /> ";
- echo " < tr > ";
- echo " < td colspan = '2' align = 'left' > " .form :: submit( 'submit'、 'Update album')。 " </ td > ";
- echo " </ tr > ";
- ? >
- </ 表 >
- <? php
- echo form :: hidden ( 'album_id' 、$ album- > id);
- エコー形式:: close();
- ? >
ステージへのORM!
行われた変更はすべて、ほとんど表面的なものです。 ただし、 Kohanaで最も人気のあるツールの1つであるORMライブラリを表示するときが来ました。 多くの機能を備えた既製のライブラリがある場合、データベースから選択するためのさまざまなメソッドを手動で記述するのはなぜですか?
Album_ModelモデルとCategories_ModelモデルをORMビューに追加してみましょう。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- Album_ModelクラスはORMを拡張します
- {
- protected $ belongs_to = array( 'genre');
- }
- ジャンル_モデルの拡張ORM {
- protected $ has_many = array( 'albums');
- }
それだけです! さらに(今のところ)私たちのニーズには何も必要ありません。 しかし、最も興味深いのは、コントローラーでORMを使用する方法です。 アルバムのリストを表示する例を見てみましょう:
*このソースコードは、 ソースコードハイライターで強調表示されました。
- プライベート関数show_albums_list()
- {
- $ albums_list = ORM :: factory( 'album')- > with( 'genre')- > find_all();
- $ this- > template- > content = View :: factory( 'list')
- - >セット( 'albums_list'、$ albums_list);
- }
レコードORM :: factory( 'album')-> with( 'genre')-> find_all()は、「ジャンルに関する情報とともにすべてのアルバムを選択する」、つまり アルバムとジャンルテーブル間の結合が自動的に生成されます。 その結果、 ORM_Iteratorオブジェクトが返されますが、配列として操作するだけです。 ;)
実際、 with()メソッドの呼び出しをコメントアウトすると、すべてが機能します! ORMは「遅延読み込み」を実装しているため、 $ album-> genreプロパティにアクセスしようとすると、データベースに対してクエリが実行されます。 ループ内でジャンルの追加サンプルを作成するよりも、1つの結合を作成する方が簡単です。 アルバムとともに毎回手動でジャンルを選択したくない場合は、 Album_Modelに次の行を追加します。
protected $ load_with = array( 'genre');
その後、ジャンルがアルバムとともに自動的に読み込まれます。
ジャンルのドロップダウンリストを生成する
覚えているように、 Album_Controllerコントローラー内のジャンルのリストを取得するために、 get_genres_list()メソッドが作成されました。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- プライベート関数get_genres_list()
- {
- $ db_genres_list = $ this- > genre_model- > get_list();
- $ genres_list = array();
- if(sizeof($ db_genres_list) > = 1)
- {
- foreach($アイテムとしてのdb_genres_list)
- {
- $ genres_list [$ item- > id] = $ item- > name;
- }
- }
- return $ genres_list;
- }
魔法の杖を振ると、メソッドは1行に変わります。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- プライベート関数get_genres_list()
- {
- return ORM :: factory( 'genre')- > find_all()- > select_list( 'id'、 'name');
- }
ORMオブジェクトの作成と編集
最後に、最もおいしい。 create()およびupdate()メソッドはチェックを実行せず、入力されたデータをAlbum_Modelモデルにスリップしようとするだけです。 しかし、 KohanaにはORMで使用するのに非常に便利な素晴らしい検証ライブラリがあります!
まず、 Album_Modelモデルに数行を追加します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック関数の検証(配列&$配列、$ save = FALSE)
- {
- $ array = Validation :: factory($配列)
- - > pre_filter( 'トリム')
- - > add_rules(「名前」、「必須」)
- - > add_rules(「作成者」、「必須」)
- - > add_rules( 'genre_id'、 'required')
- - > add_callbacks( 'name'、array($ this、 '_album_available'));
- 親を返す:: validate($配列、$ save);
- }
- public function _album_available(検証$配列、$フィールド){
- $ result =(bool)! $ this- > db
- - > where(array( 'name' = > $ array ['name']、 'author' = > $ array ['author']、 'id!=' = > $ this- > id))
- - > count_records($ this- > table_name);
- if(!$ result)$ array- > add_error($ field、 'album_exists');
- return $ result;
- }
これは、検証ライブラリを使用して入力されたデータを検証するvalidate()メソッドと、アルバムとアーティストの組み合わせの一意性を処理する非標準ルール(より正確には、 コールバック )を処理します 。 それらの使用は非常に簡単です。修正されたcreate()メソッドを検討してください。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック関数create()
- {
- if($ this- > input- > post())
- {
- $データ=配列
- (
- 'name' = > NULL、
- 'author' = > NULL、
- 'genre_id' = > NULL
- );
- $ data = arr :: overwrite($ data、$ this- > input- > post());
- $ album = ORM :: factory( 'album');
- if($ album- > validate($ data、TRUE)){
- url ::リダイレクト( 'アルバム');
- }
- その他{
- Session :: instance()- > set( 'errors'、$ data- > errors( 'album'));
- セッション::インスタンス()- > set( 'data'、$ data- > as_array());
- }
- }
- url :: redirect( 'album / show_create_editor');
- }
$ _POSTのデータの可用性を順番に確認し、対象のフィールドを$ data配列にロードし(このためにarrヘルパーoverwrite()メソッドを使用)、検証のためにvalidate()メソッドに送信しました。 TRUEに設定された2番目のパラメーターは、検証が成功した場合、 ORMオブジェクトが保存されることを意味します。 検証エラーが発生した場合、エラーの説明と現在の値をセッションのフォームから保存し(小さなタイプミスのために多数のフォームフィールドを再び運転するのは本当に好きではありません)、エディターにリダイレクトします。 したがって、 show_create_editor()メソッドとそのテンプレート( create.php )を変更する必要があります。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック関数show_create_editor()
- {
- $ errors = Session :: instance()- > get_once( 'errors'、array());
- $ data = array( 'name' = > ''、 'author' = > '' '、' genre_id '= > ' ');
- $ data = arr :: overwrite($ data、Session :: instance()- > get_once( 'data'、array()));
- $ genres_list = $ this- > get_genres_list();
- $ this- > template- > content = View :: factory( 'create')
- - >設定(「genres_list」、$ genres_list)
- - >設定(「エラー」、$エラー)
- - > set( 'data'、$ data);
- }
*このソースコードは、 ソースコードハイライターで強調表示されました。
- <? php echo form :: open ( 'album / create' ); ? >
- <? php foreach ($ エラー として $ エラー )
- echo " < div class = 'error' > "。$ error。 " </ div > " ;? >
- < テーブル クラス = 'エディター' >
- < tr >
- < td colspan = '2' class = 'editor_title' >新しいアルバムを作成</ td >
- </ tr >
- <? php
- echo " < tr > ";
- echo " < td > " .form :: label( 'name'、 'Name:')。 " </ td > ";
- echo " < td > " .form :: input( 'name'、$ data ['name'])。 " </ td > ";
- echo " </ tr > ";
- echo " < tr > ";
- echo " < td > " .form :: label( 'author'、 'Author:')。 " </ td > ";
- echo " < td > " .form :: input( 'author'、$ data ['author'])。 " </ td > ";
- echo " < tr /> ";
- echo " < tr > ";
- echo " < td > " .form :: label( 'genre'、 'Genre:')。 " </ td > ";
- echo " < td > " .form :: dropdown( 'genre_id'、$ genres_list、$ data ['genre_id'])。 " </ td > ";
- echo " < tr /> ";
- echo " < tr > ";
- echo " < td colspan = '2' align = 'left' > " .form :: submit( 'submit'、 'Create album')。 " </ td > ";
- echo " </ tr > ";
- ? >
- </ 表 >
- <? PHP エコー フォーム:: close (); ? >
このメソッドの変更のほとんどは、セッションからデータを取得し、ユーザーに表示するためにテンプレートにデータを代入する試みです。 エラーはフォームの最初に表示されますが、対応する入力フィールドの前にエラーを表示する人はいません。 同様の変更をupdate() 、 show_update_redactor()メソッド、およびupdate.phpテンプレートに対して行う必要があります。
検証エラー出力
create()メソッドの17行目の$ data-> errors( 'album')メソッドに注目してください。 配列にとってはちょっと変ですよね? 実際には、 $データ配列がvalidate()メソッドに渡されると、 Validationオブジェクトになります。 そして、既にその中に検証エラーを返すerror()メソッドがあります。 i18nファイルの名前を転送すると、指定されたファイルを使用してエラーが翻訳されます。 考えられるエラーを翻訳しましょう:
*このソースコードは、 ソースコードハイライターで強調表示されました。
- //ファイルi18n / ru_RU / album.php
- <? 定義済みの php ( 'SYSPATH' ) または die ( '直接スクリプトアクセスなし' );
- $ lang = array
- (
- 'name' = >配列(
- 'required' = > 'アルバム名が指定されていません'、
- 'album_exists' = > 'アルバム+アーティストの組み合わせは既に追加されています'、
- )、
- 'author' = >配列
- (
- '必須' = > 'アーティスト名が指定されていません'、
- )、
- 'genre_id' = >配列
- (
- '必須' = > 'アルバムのジャンルが選択されていません'、
- )、
- );
*このソースコードは、 ソースコードハイライターで強調表示されました。
- //ファイルi18n / en_US / album.php
- <? 定義済みの php ( 'SYSPATH' ) または die ( '直接スクリプトアクセスなし' );
- $ lang = array
- (
- 'name' = >配列(
- '必須' = > 'アルバム名が必要です'、
- 'album_exists' = > 'アルバムとアーティストの組み合わせは既に存在します'、
- )、
- 'author' = >配列
- (
- '必須' = > '著者名が必要です'、
- )、
- 'genre_id' = >配列
- (
- 'required' = > 'Genre required'、
- )、
- );
2つのファイルを作成しました。ロシア語と英語で、テキストリソースはフォームフィールド名でグループ化されています。 アプリケーションでデフォルトで使用されるファイルを推測しますか? もちろん、英語。 locale.phpファイルをsystem / configフォルダーからコピーし、ロシア語の値を修正します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- <? php定義(「SYSPATH」)またはダイ(「直接アクセス不可」);
- / **
- * @package Core
- *
- *デフォルトの言語ロケール名。
- *最初の項目は有効な国際化ディレクトリ名である必要があり、後続の項目は代替ロケールです
- *最初のものをサポートしていないOS(Windowsなど)の場合。 配列内の最初の有効なロケールが使用されます。
- * @see php.net/setlocale
- * /
- $ config ['language'] = array( 'ru_RU'、 'Russian_Russia');
- / **
- *ロケールのタイムゾーン。 サーバーのタイムゾーンを使用するデフォルト。
- * @see php.net/timezones
- * /
- $ config ['timezone'] = '';
まとめ
それは私が言ったすべての主要なポイントのようです。 NetTutsプロジェクトに変更を加えてみてください。そうなった場合は 、私が手に入れたアーカイブを覗くことができます。 もちろん、ささいなこと(特定のアーティストやジャンルによる並べ替え、選択)が十分に多くあるわけではありませんが、これはこの記事の枠組みの中で非現実的です。 独立して作業したい場合は、アーティストを別のテーブルに配置することもできます。これには、コントローラーとテンプレートを変更するための手間がかかります。