Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch 'master' into 93-relational-beforefind-criteria-modifica…

…tion

* master: (180 commits)
  Updated changelog with last-modified date change.
  Changed the CHttpCacheFilter to use RFC 1123 complaint dates when returning the last-modified header.
  tabs...
  gii: better default validation "length" rule for fixed-point / floating-point field type (MYSQL)
  fixes #1319
  updated comment in CHttpSession
  Update framework/YiiBase.php
  Update docs/guide/database.arr.txt
  New unit test for enhanced $gCProbability s/getters in CHttpSession #486. Fixed those methods to process corner cases properly. Initial $gCProbability is now double(1.0), was > 1.0 before.
  Bug #112: MSSQL: database abstraction layer now uses native transaction support of the SQLSRV driver.
  Forgot about spaces in comments creating procedure call. [ci skip]
  Better comments testing method name.
  Forgot about local MSSQL database settings.
  MSSQL unit testing SQL file reformatted and decorated. MSSQL testing class improved. Added unit tests for column comments retrieving.
  Removed old message.
  Update docs/guide/topics.i18n.txt
  Update docs/guide/topics.i18n.txt
  Requirements checker: russian (ru_RU) messages.
  Minor fixes and refinements to the MSSQL unit tests.
  better fix for issues #124
  ...

Conflicts:
	UPGRADE
  • Loading branch information...
commit be1fbf198213642f4e39f0ebbe793083aef3511e 2 parents 21da317 + 2147fae
@cebe cebe authored
Showing with 3,728 additions and 3,699 deletions.
  1. +1 −1  .travis.yml
  2. +31 −3 CHANGELOG
  3. +9 −3 UPGRADE
  4. +1 −1  docs/blog/comment.admin.txt
  5. +2 −2 docs/blog/comment.model.txt
  6. +37 −9 docs/blog/ja/comment.admin.txt
  7. +21 −21 docs/blog/ja/comment.create.txt
  8. +18 −18 docs/blog/ja/comment.model.txt
  9. +5 −5 docs/blog/ja/final.deployment.txt
  10. +3 −3 docs/blog/ja/final.future.txt
  11. +2 −2 docs/blog/ja/final.logging.txt
  12. +10 −11 docs/blog/ja/final.url.txt
  13. +9 −9 docs/blog/ja/portlet.comments.txt
  14. +42 −42 docs/blog/ja/portlet.menu.txt
  15. +12 −13 docs/blog/ja/portlet.tags.txt
  16. +15 −15 docs/blog/ja/post.admin.txt
  17. +16 −16 docs/blog/ja/post.create.txt
  18. +17 −17 docs/blog/ja/post.display.txt
  19. +49 −48 docs/blog/ja/post.model.txt
  20. +43 −41 docs/blog/ja/prototype.auth.txt
  21. +38 −35 docs/blog/ja/prototype.database.txt
  22. +60 −59 docs/blog/ja/prototype.scaffold.txt
  23. +8 −7 docs/blog/ja/prototype.summary.txt
  24. +28 −32 docs/blog/ja/start.design.txt
  25. +11 −10 docs/blog/ja/start.overview.txt
  26. +13 −13 docs/blog/ja/start.requirements.txt
  27. +32 −33 docs/blog/ja/start.testdrive.txt
  28. +6 −6 docs/blog/ja/toc.txt
  29. +3 −3 docs/blog/post.admin.txt
  30. +2 −1  docs/blog/ru/comment.create.txt
  31. +1 −1  docs/guide/database.arr.txt
  32. +342 −0 docs/guide/fr/basics.controller.txt
  33. +55 −0 docs/guide/fr/basics.mvc.txt
  34. +82 −0 docs/guide/fr/caching.overview.txt
  35. +49 −42 docs/guide/fr/toc.txt
  36. BIN  docs/guide/images/gii-model.png
  37. +48 −50 docs/guide/ja/basics.application.txt
  38. +9 −9 docs/guide/ja/basics.best-practices.txt
  39. +69 −85 docs/guide/ja/basics.component.txt
  40. +94 −119 docs/guide/ja/basics.controller.txt
  41. +88 −116 docs/guide/ja/basics.convention.txt
  42. +11 −11 docs/guide/ja/basics.entry.txt
  43. +7 −10 docs/guide/ja/basics.model.txt
  44. +41 −79 docs/guide/ja/basics.module.txt
  45. +26 −26 docs/guide/ja/basics.mvc.txt
  46. +58 −73 docs/guide/ja/basics.namespace.txt
  47. +28 −46 docs/guide/ja/basics.view.txt
  48. +19 −23 docs/guide/ja/basics.workflow.txt
  49. +74 −104 docs/guide/ja/caching.data.txt
  50. +17 −29 docs/guide/ja/caching.dynamic.txt
  51. +54 −95 docs/guide/ja/caching.fragment.txt
  52. +24 −37 docs/guide/ja/caching.overview.txt
  53. +41 −63 docs/guide/ja/caching.page.txt
  54. +22 −22 docs/guide/ja/changes.txt
  55. +173 −164 docs/guide/ja/database.ar.txt
  56. +175 −167 docs/guide/ja/database.arr.txt
  57. +48 −73 docs/guide/ja/database.dao.txt
  58. +33 −23 docs/guide/ja/database.migration.txt
  59. +6 −10 docs/guide/ja/database.overview.txt
  60. +61 −37 docs/guide/ja/database.query-builder.txt
  61. +53 −69 docs/guide/ja/extension.create.txt
  62. +17 −31 docs/guide/ja/extension.integration.txt
  63. +19 −19 docs/guide/ja/extension.overview.txt
  64. +64 −98 docs/guide/ja/extension.use.txt
  65. +19 −34 docs/guide/ja/form.action.txt
  66. +189 −186 docs/guide/ja/form.builder.txt
  67. +91 −137 docs/guide/ja/form.model.txt
  68. +6 −9 docs/guide/ja/form.overview.txt
  69. +16 −26 docs/guide/ja/form.table.txt
  70. +24 −33 docs/guide/ja/form.view.txt
  71. +4 −4 docs/guide/ja/index.txt
  72. +3 −3 docs/guide/ja/quickstart.apache-nginx-config.txt
  73. +3 −3 docs/guide/ja/quickstart.first-app-yiic.txt
  74. +41 −42 docs/guide/ja/quickstart.first-app.txt
  75. +10 −10 docs/guide/ja/quickstart.installation.txt
  76. +19 −18 docs/guide/ja/quickstart.what-is-yii.txt
  77. +15 −12 docs/guide/ja/test.fixture.txt
  78. +26 −15 docs/guide/ja/test.functional.txt
  79. +33 −21 docs/guide/ja/test.overview.txt
  80. +25 −13 docs/guide/ja/test.unit.txt
  81. +53 −53 docs/guide/ja/toc.txt
  82. +154 −178 docs/guide/ja/topics.auth.txt
  83. +44 −57 docs/guide/ja/topics.console.txt
  84. +54 −92 docs/guide/ja/topics.error.txt
  85. +98 −44 docs/guide/ja/topics.gii.txt
  86. +98 −161 docs/guide/ja/topics.i18n.txt
  87. +40 −47 docs/guide/ja/topics.logging.txt
  88. +41 −55 docs/guide/ja/topics.performance.txt
  89. +32 −43 docs/guide/ja/topics.prado.txt
  90. +47 −83 docs/guide/ja/topics.security.txt
  91. +91 −110 docs/guide/ja/topics.theming.txt
Sorry, we could not display the entire diff because it was too big.
View
2  .travis.yml
@@ -12,6 +12,6 @@ before_script:
- psql -q -c 'CREATE DATABASE yii WITH OWNER = test;' -U postgres
- psql -q -c 'GRANT ALL PRIVILEGES ON DATABASE yii TO test;' -U postgres
- echo 'y' | pecl install memcache > ~/memcache.log || ( echo "=== MEMCACHE BUILD FAILED ==="; cat ~/memcache.log )
- - echo "extension=memcache.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
+ - if [ $TRAVIS_PHP_VERSION \< 5.4 ]; then echo "extension=memcache.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi
script: phpunit --colors --coverage-text --exclude-group mssql framework
View
34 CHANGELOG
@@ -1,12 +1,40 @@
Yii Framework Change Log
========================
-Version 1.1.12 work in progress
+Version 1.1.13 work in progress
-------------------------------
-- Bug #1077: Fixed the problem with alias in CSort (creocoder)
+- Bug #112: MSSQL: database abstraction layer now uses native transaction support of the SQLSRV driver (resurtm)
+- Bug #124: Added CMysqlCommandBuilder to handle JOIN directive on update commands correctly (cebe, DaSourcerer)
+- Enh #486: CHttpSession::$gCProbability and CDbHttpSession::$gCProbability are floats now. Minimal possible $gCProbability value has been changed to the ≈0.00000005% (1/2147483647), was integer 1% before, default value left unchanged (1%) (resurtm)
+- Enh #556: CDbColumnSchema::$comment property has been added. It stores comment for the table column, comment retrieving is working for MySQL, PgSQL and Oracle (resurtm)
+- Enh #1289: Added support for column comments for MSSQL (CDbColumnSchema::$comment property) (resurtm)
+- Enh: Fixed the check for ajaxUpdate false value in jquery.yiilistview.js as that never happens (mdomba)
+- Enh: Requirements checker: added check for Oracle database (pdo_oci extension) and MSSQL (pdo_dblib, pdo_sqlsrv and pdo_mssql extensions) (resurtm)
+- Chg: MSSQL unit tests updated and actualized, added SQLSRV driver support (resurtm)
+- Chg: Updated CHttpCacheFilter to use dates as specified by RFC 1123 (bramp)
+
+Version 1.1.12 August 19, 2012
+------------------------------
+- Bug #190: WSDL return tag was not generated by CWsdlGenerator when Macintosh line endings were used inside service describing docblock (resurtm)
+- Bug #1066: CMemCache: expiration time higher than 60*60*24*30 (31536000) seconds led the value to expire right away after saving (resurtm)
- Bug #1072: Fixed the problem with getTableAlias() in defaultScope() (creocoder)
+- Bug #1076: CJavaScript::encode() was not compatible with PHP 5.1 (samdark)
+- Bug #1077: Fixed the problem with alias in CSort (creocoder)
+- Bug #1083: CFileValidator is now unsafe by default. This will prevent setting attribute when no file was uploaded (samdark)
+- Bug #1087: Reverted changes to CCookieCollection::add() introduced in 1.1.11 as they were triggering E_STRICT on some old PHP-versions (suralc)
+- Bug #1088: Fixed usage of proper CActiveForm id property when it's supplied with htmlOptions (mdomba)
+- Bug #1094: CGridView with enabled history used to clear page title in case sorting or paging performed (Opera and Firefox only) (resurtm)
+- Bug #1109: Fixed "js:" encoding BC-break in CHtml::ajax() and related methods introduced in 1.1.11 (samdark)
+- Bug #1120: Fixed duplicate events processing in CGridView when ENTER was pressed for filtering (mdomba)
+- Bug #1192: CHttpCacheFilter failed to comply with RFC 2616, section 10.3.5 (DaSourcerer)
+- Bug #1207: Fixed an issue in CHtml::resolveValue() which occurs when handling tabular data input (Qiang)
+- Bug #1225: Fixed the bug that $.fn.yiiGridView.getChecked was not working always if a custom CGridView::template was used (mdomba)
+- Bug #1243: Fixed the bug that when using CUrlManager::addRules with $append=false rules were added in reverse order (samdark)
+- Enh #243: CWebService is now able to deal with the customized WSDL generator classes, was hardcoded to the CWsdlGenerator before, added CWebService::$generatorConfig property (resurtm)
- Enh #636: CManyManyRelation now parses foreign key for the junction table data internally, and provide public interface to access it (klimov-paul)
-
+- Enh #1163: CGridview does not create empty class attributes anymore (cebe)
+- Chg #1099: Changed connectionId dropdown to sticky text field in Gii model generator (mdomba)
+- Chg #1167: Reverted back the change to CComponent::evaluateExpression() about global function support (Qiang)
Version 1.1.11 July 29, 2012
----------------------------
View
12 UPGRADE
@@ -1,5 +1,5 @@
- Upgrading Instructions for Yii Framework v1.1.12
+ Upgrading Instructions for Yii Framework v1.1.13
================================================
!!!IMPORTANT!!!
@@ -9,8 +9,8 @@ if you want to upgrade from version A to version C and there is
version B between A and C, you need to following the instructions
for both A and B.
-General upgrade intructions
----------------------------
+General upgrade instructions
+----------------------------
- Make a backup.
- Clean up your 'assets' folder.
- Replace 'framework' dir with the new one or point GIT to a fresh
@@ -38,6 +38,12 @@ Upgrading from v1.1.12
Upgrading from v1.1.11
----------------------
+- Changes in CCookieCollection::add() (introduced in 1.1.11) were reverted as they were triggering E_STRICT on some old PHP-versions
+ If your application relies on these newly added changes. You should change your code from
+
+ $cookies->add(new CHttpCookie($name, $value));
+ to
+ $cookies[$name] = new CHttpCookie($name, $value);
Upgrading from v1.1.10
----------------------
View
2  docs/blog/comment.admin.txt
@@ -7,7 +7,7 @@ Comment management includes updating, deleting and approving comments. These ope
Updating and Deleting Comments
------------------------------
-The code generated by `yiic` for updating and deleting comments remains largely unchanged.
+The code generated by `Gii` for updating and deleting comments remains largely unchanged.
Approving Comments
View
4 docs/blog/comment.model.txt
@@ -1,13 +1,13 @@
Customizing Comment Model
=========================
-For the `Comment` model, we mainly need to customize the `rules()` and `attributeLabels()` methods. The `attributeLabels()` method returns a mapping between attribute names and attribute labels. We do not need to touch `relations()` since the code generated by the `yiic` tool is good enough.
+For the `Comment` model, we mainly need to customize the `rules()` and `attributeLabels()` methods. The `attributeLabels()` method returns a mapping between attribute names and attribute labels. We do not need to touch `relations()` since the code generated by the `Gii` tool is good enough.
Customizing `rules()` Method
----------------------------
-We first customize the validation rules generated by the `yiic` tool. The following rules are used for comments:
+We first customize the validation rules generated by the `Gii` tool. The following rules are used for comments:
~~~
[php]
View
46 docs/blog/ja/comment.admin.txt
@@ -1,21 +1,21 @@
コメントの管理
==============
-コメントの管理には、コメントの更新・削除・承認があります。これらの操作は`CommentController`クラスのアクションとして実装します。
+コメントの管理には、コメントの更新・削除・承認があります。これらの操作は `CommentController` クラスのアクションとして実装します。
コメントの更新と削除
--------------------
-`yiic`で生成したコードの、コメント更新・削除の部分はほとんど変更せずに使います。
+`Gii` で生成したコードの、コメント更新・削除の部分はほとんど変更せずに使います。
コメントの承認
--------------
-コメントが新しく作成されたとき、コメントは承認待ちの状態になります。ゲストユーザに見えるようにするためには承認が必要です。コメントの承認は、基本的にコメントのステータス・カラムを変更するだけです。
+コメントが新しく作成されたとき、コメントは承認待ちの状態になります。ゲストユーザに見えるようにするためには承認が必要です。コメントの承認は、基本的にコメントの `status` カラムを変更するだけです。
-`CommentController``actionApprove()`メソッドを以下のように作成します
+`CommentController` に以下のような `actionApprove()` メソッドを作成します
~~~
[php]
@@ -32,9 +32,37 @@ public function actionApprove()
}
~~~
-上記コードでは、POSTリクエスト経由で`approve`アクションが呼ばれたときに、`Comment`モデルで定義した`approve()`メソッドを呼んでステータスを変更します。それから、このコメントが属する記事を表示するページに、ブラウザをリダイレクトします。
+上記コードでは、POST リクエスト経由で `approve` アクションが呼ばれたときに、`Comment` モデルで定義した `approve()` メソッドを呼んでステータスを変更します。それから、このコメントが属する記事を表示するページに、ブラウザをリダイレクトします。
-また、すべてのコメントを表示するために`Comment`の`actionIndex()`メソッドを修正します。承認待ちのコメントを先頭に表示するようにします。
+もちろん、上記に加えて、`Comment` モデルに `approve()` メソッドを作成する必要もあります。以下のようにします。
+
+~~~
+[php]
+public function approve()
+{
+ $this->status=Comment::STATUS_APPROVED;
+ $this->update(array('status'));
+}
+~~~
+
+していることは単純なことです。まず、コメントの `status` プロパティに `Comment` クラスで定義されている `承認済み` 状態を示す定数をセットします。
+
+~~~
+[php]
+class Comment extends CActiveRecord
+{
+ ...
+
+ const STATUS_PENDING=1;
+ const STATUS_APPROVED=2;
+
+ ..
+}
+~~~
+
+そして、次に、`update()` メソッドを呼んで新しくセットされたプロパティをデータベースに保存します。
+
+さらに、すべてのコメントを表示するために `CommentController` の `actionIndex()` メソッドを修正します。承認待ちのコメントを先頭に表示するようにします。
~~~
[php]
@@ -53,8 +81,8 @@ public function actionIndex()
}
~~~
-上記コードでは、`tbl_post``tbl_comment`の両方に`status``create_time`というカラムがあるので、曖昧さを無くすためにテーブルのエイリアス名を接頭辞として付ける必要があります。[ガイド](http://www.yiiframework.com/doc/guide/ja/database.arr#disambiguating-column-names)に記述されているように、リレーショナルなクエリーでは、プライマリテーブルのエイリアスは常に`t`です。そのため上記コードでは、`status`カラムと`create_time`カラムに接頭辞`t`を付けています
+上記コードでは、`tbl_post``tbl_comment` の両方に `status``create_time` というカラムがあるので、曖昧さを無くすためにテーブルのエイリアス名を接頭辞として付ける必要があります。[ガイド](http://www.yiiframework.com/doc/guide/ja/database.arr#sec-6) に記述されているように、リレーショナルなクエリーでは、プライマリテーブルのエイリアスは常に `t` です。そのため上記コードでは、`status` カラムと `create_time` カラムに接頭辞 `t` を付けて、それらの値をプライマリテーブル (`tbl_comment`) から取得すべきことを示しています
-記事のindexビューのように、`CommentController``index`ビューでも[CListView]を使ってコメント一覧を表示します。部分的ビューとして`/wwwroot/blog/protected/views/comment/_view.php`を使って、個々のコメントの詳細を表示します。ここでは詳細には立ち入りません。興味のある方はblogデモの対応するファイル`/wwwroot/yii/demos/blog/protected/views/comment/_view.php`を参照してください。
+記事の index ビューのように、`CommentController``index` ビューでも [CListView] を使ってコメント一覧を表示します。部分的ビューとして `/wwwroot/blog/protected/views/comment/_view.php` を使って、個々のコメントの詳細を表示します。ここでは詳細には立ち入りません。興味のある方はブログデモの対応するファイル `/wwwroot/yii/demos/blog/protected/views/comment/_view.php` を参照してください。
-<div class="revision">$Id: comment.admin.txt 1810 2010-02-18 00:24:54Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
42 docs/blog/ja/comment.create.txt
@@ -1,26 +1,26 @@
コメントの作成と表示
====================
-この節では、コメントの表示と作成の機能を実装します。
+このセクションでは、コメントの表示と作成の機能を実装します。
-ユーザのインタラクティブ性を向上するために、入力欄への入力が確定するたびにエラー表示をします。いわゆるクライアントサイドの入力検証(client-side input validation)です。これをYiiで行う方法を説明します。シームレスそして極めて簡単にできます。
+ユーザのインタラクティブ性を向上するために、入力欄への入力が確定するたびにエラー表示をします。いわゆるクライアントサイドの入力検証(client-side input validation)です。これを Yii で行う方法を説明します。シームレスそして極めて簡単にできます。この機能は Yii バージョン 1.1.1 以降でサポートされていることに注意して下さい
コメントの表示
--------------
-コメントの表示・作成に個別のページを使う代わりに、記事の詳細ページ`PostController``view`アクションで生成されるを使います。以下の記事内容の表示では、記事に属するコメント一覧を最初に表示し、それからコメントの投稿フォームを表示します
+コメントの表示・作成に個別のページを使う代わりに、記事の詳細ページ (`PostController``view` アクションで生成される) を使います。記事内容の表示の下に、まず、その記事に属するコメントをリスト表示し、次にコメントの投稿フォームを表示します
-記事の詳細ページにコメントを表示するため、ビュースクリプト`/wwwroot/blog/protected/views/post/view.php`を以下のように修正します。
+記事の詳細ページにコメントを表示するため、ビュースクリプト `/wwwroot/blog/protected/views/post/view.php` を以下のように修正します。
~~~
[php]
-...post view here...
+... ここに記事の表示 ...
<div id="comments">
<?php if($model->commentCount>=1): ?>
<h3>
- <?php echo $model->commentCount . 'comment(s)'; ?>
+ <?php echo $model->commentCount . '個のコメント'; ?>
</h3>
<?php $this->renderPartial('_comments',array(
@@ -31,14 +31,14 @@
</div>
~~~
-上の例では、現在の記事に属するコメント一覧を表示するために、`_comments`という部分的ビューを指定して`renderPartial()`を呼んでいます。ビューでは、`$model->comments`という式で、記事のコメントを取得できます。この式が使える理由は`Post`クラスで`comments`リレーションを宣言しているからです。この式が評価されると、暗黙的にデータベースのJOINクエリーが発行され、適切なコメントが返されます。この機能は[lazy relational query](http://www.yiiframework.com/doc/guide/ja/database.arr)として知られています。
+上の例では、現在の記事に属するコメント一覧を表示するために、`_comments` という部分的ビューを指定して `renderPartial()` を呼んでいます。ビューで `$model->comments` という式を使って記事に属するコメントを取得していることに注目して下さい。この式が使える理由は `Post` クラスで `comments` リレーションを宣言しているからです。この式が評価されると、暗黙的にデータベースの JOIN クエリーが発行され、適切なコメントが返されます。この機能は [遅延リレーショナルクエリ](http://www.yiiframework.com/doc/guide/ja/database.arr) として知られています。
-部分的ビュー(partial view)`_comments`はあまり興味深いものではありません。コメントを一つ一つ取り扱い、コメントの詳細を表示します。興味のある方は`/wwwroot/yii/demos/blog/protected/views/post/_comments.php`を参照してください。
+部分的ビュー (partial view)`_comments` はあまり興味深いものではありません。コメントを一つ一つ取り扱い、コメントの詳細を表示します。興味のある方は `/wwwroot/yii/demos/blog/protected/views/post/_comments.php` を参照してください。
コメントの作成
--------------
-コメントの作成を扱うために、`PostController``actionView()`メソッドを以下のように修正します。
+コメントの作成を扱うために、`PostController``actionView()` メソッドを以下のように修正します。
~~~
[php]
@@ -62,7 +62,7 @@ protected function newComment($post)
if($post->addComment($comment))
{
if($comment->status==Comment::STATUS_PENDING)
- Yii::app()->user->setFlash('commentSubmitted','Thank you for your comment. Your comment will be posted once it is approved.');
+ Yii::app()->user->setFlash('commentSubmitted','コメント、有難うございます。コメントは承認後に投稿されます。');
$this->refresh();
}
}
@@ -70,7 +70,7 @@ protected function newComment($post)
}
~~~
-それから`Post`モデルクラスを修正して、`addComment()`メソッドを以下のように追加します。
+それから `Post` モデルクラスを修正して、`addComment()` メソッドを以下のように追加します。
~~~
[php]
@@ -85,16 +85,16 @@ public function addComment($comment)
}
~~~
-上記コードでは、`view`を表示する前に`newComment()`メソッドを呼んでいます。`newComment()`メソッドでは、`Comment`インスタンスを生成し、コメントフォームが送信されたかどうかをチェックします。もし送信されていた場合、`$post->addComment($comment)`を呼んで記事にコメントを追加しようとします。問題なく進んだら記事の詳細ページをリフレッシュします。再表示されたページには、コメント承認制でなければ、新しく投稿されたコメントが表示されます。表示前にコメントの承認が必要な場合は、フラッシュ・メッセージを使って、承認が必要であることをユーザに示します。フラッシュ・メッセージは大抵、エンドユーザに確認メッセージを見せるものです。ユーザがブラウザの再読み込みボタンをクリックしたら、メッセージは消えます。
+上記コードでは、`view` を表示する前に `newComment()` メソッドを呼んでいます。`newComment()` メソッドでは、`Comment` インスタンスを生成し、コメントフォームが送信されたかどうかをチェックします。もし送信されていた場合、`$post->addComment($comment)` を呼んで記事にコメントを追加しようとします。問題なく進んだら記事の詳細ページをリフレッシュします。再表示されたページには、コメント承認制でなければ、新しく投稿されたコメントが表示されます。表示前にコメントの承認が必要な場合は、フラッシュメッセージを使って、承認が必要であることをユーザに示します。フラッシュメッセージは大抵、エンドユーザに確認メッセージを見せるものです。ユーザがブラウザの再読み込みボタンをクリックしたら、メッセージは消えます。
-さらに`/wwwroot/blog/protected/views/post/view.php`を修正します。
+さらに `/wwwroot/blog/protected/views/post/view.php` を修正します。
~~~
[php]
......
<div id="comments">
......
- <h3>Leave a Comment</h3>
+ <h3>コメントする</h3>
<?php if(Yii::app()->user->hasFlash('commentSubmitted')): ?>
<div class="flash-success">
@@ -109,15 +109,15 @@ public function addComment($comment)
</div><!-- comments -->
~~~
-上記コードでは、フラッシュ・メッセージがあれば、そのメッセージを表示します。もし無ければ、部分的ビュー`/wwwroot/blog/protected/views/comment/_form.php`を使ってコメント入力フォームを表示します。
+上記コードでは、フラッシュメッセージがあれば、そのメッセージを表示します。もし無ければ、部分的ビュー `/wwwroot/blog/protected/views/comment/_form.php` を使ってコメント入力フォームを表示します。
-クライアントサイド・バリデーション
+AJAX ベースの検証
----------------------------------
-コメントフォームのクライアントサイド・バリデーションをサポートするため、コメントフォームのビュー`/wwwroot/blog/protected/views/comment/_form.php`と、`newComment()`メソッドの両方に小さな変更を加える必要があります。
+ユーザエクスペリエンスを向上させるために、AJAX ベースのフォームフィールド検証を使うことが出来ます。AJAX ベースの検証によって、ユーザはフォーム項目に入力をするたびに検証のフィードバックを得ることが出来ます。すなわち、フォーム全体をサーバに送信する前に、検証のフィードバックが得られます。コメントの入力フォームに AJAX ベースの検証をサポートするために、コメントフォームのビュー `/wwwroot/blog/protected/views/comment/_form.php``newComment()` メソッドの両方に小さな変更を加える必要があります。
-`_form.php`では、[CActiveForm]ウィジェットを作成するときに、[CActiveForm::enableAjaxValidation]をtrueに設定します
+`_form.php` では、[CActiveForm] ウィジェットを作成するときに、[CActiveForm::enableAjaxValidation] を true に設定します
~~~
[php]
@@ -133,7 +133,7 @@ public function addComment($comment)
</div><!-- form -->
~~~
-`newComment()`メソッドでは、AJAXバリデーションのリクエストに応答するためのコードを追加します。このコードは`ajax`という名前の`POST`変数があるかどうかチェックします。もしあれば、[CActiveForm::validate]を呼んでバリデーション結果を表示します
+そして、`newComment()` メソッドにおいて、AJAX 検証のリクエストに応答するためのコードを追加します。このコードは `ajax` という名前の `POST` 変数があるかどうかチェックします。もしあれば、[CActiveForm::validate] を呼んで検証結果を表示します
~~~
[php]
@@ -153,7 +153,7 @@ protected function newComment($post)
if($post->addComment($comment))
{
if($comment->status==Comment::STATUS_PENDING)
- Yii::app()->user->setFlash('commentSubmitted','Thank you for your comment. Your comment will be posted once it is approved.');
+ Yii::app()->user->setFlash('commentSubmitted','コメント、有難うございます。コメントは承認後に投稿されます。');
$this->refresh();
}
}
@@ -161,4 +161,4 @@ protected function newComment($post)
}
~~~
-<div class="revision">$Id: comment.create.txt 3466 2011-11-28 04:23:54Z jefftulsa $</div>
+<div class="revision">$Id$</div>
View
36 docs/blog/ja/comment.model.txt
@@ -1,12 +1,12 @@
-Commentモデルのカスタマイズ
+Comment モデルのカスタマイズ
===========================
-`Comment`モデルでは、主に`rules()`メソッドと`attributeLabels()`メソッドをカスタマイズします。`attributeLabels()`メソッドは属性の名前と属性のラベルの対応表を返します。`relations()`は`yiic`ツールで生成したコードで十分なので手を入れる必要はありません。
+`Comment` モデルでは、主に `rules()` メソッドと `attributeLabels()` メソッドをカスタマイズします。`attributeLabels()` メソッドは属性の名前と属性のラベルの対応表を返します。`relations()` は `Gii` ツールで生成したコードで十分なので手を入れる必要はありません。
-`rules()`メソッドのカスタマイズ
+`rules()` メソッドのカスタマイズ
-------------------------------
-最初に、`yiic`ツールで生成したバリデーションルールをカスタマイズします。コメント用のルールは以下の通りです。
+最初に、`Gii` ツールで生成した検証ルールをカスタマイズします。コメント用のルールは以下の通りです。
~~~
[php]
@@ -21,36 +21,36 @@ public function rules()
}
~~~
-上記の指定内容は次のような意味です。`author``email``content`属性は必須、`author``email``url`は最大128字、`email`属性は有効なメールアドレスであること、`url`属性は有効なURLであること
+上記の指定内容は次のような意味です。`author`, `email`, `content` 属性は必須、`author`, `email`, `url` は最大128字、`email` 属性は有効なメールアドレスであること、`url` 属性は有効な URL であること
-`attributeLabels()`メソッドのカスタマイズ
+`attributeLabels()` メソッドのカスタマイズ
-----------------------------------------
-次に`attributeLabels()`メソッドをカスタマイズして、モデルの各属性を表示する際のラベルを宣言します。このメソッドは、名前-ラベルの組で構成される配列を返します。[CHtml::activeLabel()]を呼ぶと属性のラベルを表示できます。
+次に `attributeLabels()` メソッドをカスタマイズして、モデルの各属性を表示する際のラベルを宣言します。このメソッドは、名前-ラベルの組で構成される配列を返します。[CHtml::activeLabel()] を呼ぶと属性のラベルを表示できます。
~~~
[php]
public function attributeLabels()
{
return array(
- 'id' => 'Id',
- 'content' => 'Comment',
- 'status' => 'Status',
- 'create_time' => 'Create Time',
- 'author' => 'Name',
- 'email' => 'Email',
- 'url' => 'Website',
- 'post_id' => 'Post',
+ 'id' => 'ID',
+ 'content' => 'コメント',
+ 'status' => '状態',
+ 'create_time' => '作成日時',
+ 'author' => '名前',
+ 'email' => 'メール',
+ 'url' => 'ウェブサイト',
+ 'post_id' => '記事',
);
}
~~~
-> Tip: `attributeLabels()`で属性のラベルを宣言していない場合、アルゴリズムに従って適切なラベルが生成されます。例えば、`create_time``createTime`という属性には、`Create Time`というラベルが生成されます。
+> Tip|ヒント: `attributeLabels()` で属性のラベルを宣言していない場合、アルゴリズムに従って適切なラベルが生成されます。例えば、`create_time``createTime` という属性には、`Create Time` というラベルが生成されます。
保存プロセスのカスタマイズ
--------------------------
-コメントの作成時刻を記録したいので、`Post`モデルと同様に、`Comment``beforeSave()`メソッドをオーバーライドします。
+コメントの作成時刻を記録したいので、`Post` モデルと同様に、`Comment``beforeSave()` メソッドをオーバーライドします。
~~~
[php]
@@ -68,4 +68,4 @@ protected function beforeSave()
~~~
-<div class="revision">$Id: comment.model.txt 1733 2010-01-21 16:54:29Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
10 docs/blog/ja/final.deployment.txt
@@ -7,7 +7,7 @@
ホームページを変更する
------------------
-投稿一覧のページをホームページとして使用します。[アプリケーション構成](http://www.yiiframework.com/doc/guide/ja/basics.application#application-configuration) を下記のように修正します。
+記事一覧のページをホームページとして使用します。[アプリケーション初期構成](http://www.yiiframework.com/doc/guide/ja/basics.application#sec-2) を下記のように修正します。
~~~
[php]
@@ -24,7 +24,7 @@ return array(
スキーマキャッシュを有効にする
-----------------------
-アクティブレコードは、カラム情報を決定するために、テーブルに関するメタデータを必要とします。このため、メタデータを読み取って分析する時間が必要になります。このことは開発段階では問題にならないかもしれません。しかし、実運用モードで動作するアプリケーションにとっては、データベースのスキーマが変更されないのであれば、まったくの時間の浪費です。従って、アプリケーション構成を下記のように変更して、スキーマキャッシュを有効にするべきです。
+アクティブレコードは、カラム情報を決定するために、テーブルに関するメタデータを必要とします。このため、メタデータを読み取って分析する時間が必要になります。このことは開発段階では問題にならないかもしれません。しかし、実運用モードで動作するアプリケーションにとっては、データベースのスキーマが変更されないのであれば、まったくの時間の浪費です。従って、アプリケーション初期構成を下記のように変更して、スキーマキャッシュを有効にするべきです。
~~~
[php]
@@ -50,19 +50,19 @@ return array(
デバッグモードを無効にする
------------------------
-エントリスクリプトファイル `/wwwroot/blog/index.php` を修正して、定数 `YII_DEBUG` を定義している行を削除します。この定数は開発段階では役に立ちます。なぜなら、この定数を定義すると、Yii はエラーが生じた場合に、より多くのデバッグ情報を表示することが出来るようになるからです。しかし、アプリケーションを実運用モードで動作させる場合は、デバッグ情報を表示することはあまり望ましくありません。デバッグ情報は、スクリプトファイルの格納場所やファイルの内容など、注意を要する情報を含み得るからです
+エントリスクリプトファイル `/wwwroot/blog/index.php` を修正して、定数 `YII_DEBUG` を定義している行を削除します。この定数は開発段階では役に立ちます。なぜなら、この定数を定義すると、Yii はエラーが生じた場合に、より多くのデバッグ情報を表示することが出来るようになるからです。しかし、アプリケーションを実運用モードで動作させる場合は、デバッグ情報を表示することはあまり望ましくありません。デバッグ情報は、スクリプトファイルの格納場所やファイルの内容など、セキュリティ上の注意を要する情報を含み得るからです
アプリケーションを配備する
-------------------------
-最後の配備のプロセスは、`/wwwroot/blog` のディレクトリをターゲットディレクトリにコピーすることが主な作業となります。下記に必要なすべてのステップのチェックリストを示します:
+最後の配備のプロセスは、`/wwwroot/blog` のディレクトリをターゲットディレクトリにコピーすることが主な作業となります。下記に必要なすべてのステップをチェックリストとして示します:
1. もしまだであれば、Yii をターゲットの環境にインストールする。
2. `/wwwroot/blog` ディレクトリ全体をターゲットの環境にコピーする。
3. エントリスクリプトファイル `index.php` を編集して、変数 `$yii` が新しい Yii のブートストラップファイルを参照するようにする。
4. スクリプトファイル `protected/yiic.php` を編集して、変数 `$yiic` が新しい Yii の `yiic.php` ファイルを参照するようにする。
- 5. ディレクトリ `assets` と `protected/runtime` の権限を変更して、ウェブサーバのプロセスによる書き込みが出来るようにする。
+ 5. ディレクトリ `assets` と `protected/runtime` のパーミッションを変更して、ウェブサーバのプロセスによる書き込みが出来るようにする。
<div class="revision">$Id$</div>
View
6 docs/blog/ja/final.future.txt
@@ -4,7 +4,7 @@
テーマを使う
-------------
-私たちのブログアプリケーションに [テーマ](http://www.yiiframework.com/doc/guide/ja/topics.theming) を適用するためには、コードを書く必要は少しもありません。テーマを使うために必要なことは、主として、テーマで使用するビューファイルを書いてテーマを開発することです。例えば、異なったページレイアウトを使用する `classic` という名前のテーマを使うためには、`/wwwroot/blog/themes/classic/views/layouts/main.php` というレイアウトビューファイルを作成します。さらに、アプリケーション構成を変更して、`classic` テーマを選択したことを示す必要があります。
+私たちのブログアプリケーションに [テーマ](http://www.yiiframework.com/doc/guide/ja/topics.theming) を適用するためには、コードを書く必要は少しもありません。テーマを使うために必要なことは、主として、テーマで使用するビューファイルを書いてテーマを開発することです。例えば、異なったページレイアウトを使用する `classic` という名前のテーマを使うためには、`/wwwroot/blog/themes/classic/views/layouts/main.php` というレイアウトビューファイルを作成します。さらに、アプリケーション初期構成を変更して、`classic` テーマを選択したことを示す必要があります。
~~~
[php]
@@ -21,7 +21,7 @@ return array(
私たちはブログアプリケーションを国際化して、ブログのページが様々な言語を表示できるようにすることも出来ます。これには主として二つの側面があります。
-第一に、私たちは様々な異なる言語でビューファイルを作成することが出来ます。例えば、`PostController` の `index` ページに対して、`/wwwroot/blog/protected/views/post/zh_cn/index.php` というビューファイルを作成することが出来ます。アプリケーションが簡体中国語言語コード `zh_cn`を使用するように構成されると、Yii はオリジナルのビューファイルに代りに、この新しいビューファイルを自動的に使用します。
+第一に、私たちは様々な異なる言語でビューファイルを作成することが出来ます。例えば、`PostController` の `index` ページに対して、`/wwwroot/blog/protected/views/post/zh_cn/index.php` というビューファイルを作成することが出来ます。アプリケーションが簡体中国語 (言語コード `zh_cn`) を使用するように構成されると、Yii はオリジナルのビューファイルに代りに、この新しいビューファイルを自動的に使用します。
第二に、私たちはプログラムによって生成されるメッセージに対して、翻訳されたメッセージを作成することが出来ます。翻訳されたメッセージは、`/wwwroot/blog/protected/messages` というディレクトリの下にファイルとして保存されなければなりません。同時に、文字列を使用しているコードを修正して、元の文字列を `Yii::t()` メソッドで囲んで使用しなければなりません。
@@ -53,6 +53,6 @@ Yii フレームワークはそれ自体としては[非常に効率的](http://
新しい機能を追加する
-------------------
-私たちのブログアプリケーションは非常に基本的な機能しか持っていません。完全なブログシステムになるためには、カレンダーポートレット、メール通知、投稿のカテゴリー化、過去の投稿ポートレット、等々、さらに多くの機能が必要です。これらの機能を実装することは、興味を持った読者の手に委ねます。
+私たちのブログアプリケーションはきわめて基本的な機能しか持っていません。完全なブログシステムにするためには、カレンダーポートレット、メール通知、記事のカテゴリー化、過去の記事ポートレット、等々、さらに多くの機能が必要です。これらの機能を実装することは、興味を持った読者の手に委ねます。
<div class="revision">$Id$</div>
View
4 docs/blog/ja/final.logging.txt
@@ -4,7 +4,7 @@
実運用するウェブアプリケーションでは、しばしば、さまざまなイベントに対する洗練されたロギングが
必要になります。私たちのブログアプリケーションでも、使用中に生じるエラーをログに記録したいと思います。エラーはプログラム上の失敗であったり、ユーザーによるシステムの不正使用であったりします。これらのエラーをロギングすることは、ブログアプリケーションを改善することに役立つでしょう。
-[アプリケーション構成](http://www.yiiframework.com/doc/guide/ja/basics.application#application-configuration) を下記のように変更することによって、エラーのロギングを有効にします。
+[アプリケーション初期構成](http://www.yiiframework.com/doc/guide/ja/basics.application#sec-2) を下記のように変更することによって、エラーのロギングを有効にします。
~~~
[php]
@@ -28,7 +28,7 @@ return array(
);
~~~
-上記の構成によって、エラーまたは警告が生じた場合に、詳細な情報が記録され、`/wwwroot/blog/protected/runtime` のディレクトリの下のファイルに保存されます
+上記の構成によって、エラーまたは警告が生じた場合に、詳細な情報が記録され、`/wwwroot/blog/protected/runtime` ディレクトリ下のファイルに保存されます
`log` コンポーネントは、指定したリストのメールアドレスにログメッセージを送信したり、ログメッセージを JavaScript コンソールウィンドウに表示したりなど、さらに高度な機能を提供します。詳細については、 [ガイド](http://www.yiiframework.com/doc/guide/ja/topics.logging) を参照して下さい。
View
21 docs/blog/ja/final.url.txt
@@ -8,18 +8,17 @@ URL をきれいにする
/index.php?r=post/show&id=1&title=A+Test+Post
~~~
-この章では、これらの URL を見栄えの良い SEO フレンドリーなものにする方法を説明します。
-私たちの目的は、アプリケーションで以下のような URL を使うことが出来るようにすることです:
+このセクションでは、これらの URL を見栄えの良い SEO フレンドリーなものにする方法を説明します。
+目的は、アプリケーションで以下のような URL を使うことが出来るようにすることです:
- 1. `/index.php/posts/yii`: `yii` というタグを持つ投稿の一覧を表示するページに導きます
- 2. `/index.php/post/2/A+Test+Post`: ID が 2 であり、タイトルが `A Test Post` である投稿の詳細を表示するページに導きます
- 3. `/index.php/post/update?id=1`: ID が 1 である投稿の更新を許可するページに導きます
+ 1. `/index.php/posts/yii`: `yii` というタグを持つ記事の一覧を表示するページに導きます
+ 2. `/index.php/post/2/A+Test+Post`: ID が 2 であり、タイトルが `A Test Post` である記事の詳細を表示するページに導きます
+ 3. `/index.php/post/update?id=1`: ID が 1 である記事の更新を許可するページに導きます
-第二の URL の形式においては、URL に投稿のタイトルを含めていることに着目して下さい。
-これは主として URL を SEO フレンドリーにするためのものです。検索エンジンは、インデックス作成時に
-URL に含まれている単語も参照することがあると言われています。
+第二の URL の形式においては、URL に記事のタイトルを含めていることに着目して下さい。
+これは主として URL を SEO フレンドリーにするためのものです。検索エンジンは、インデックス作成時に URL に含まれている単語も参照することがあると言われています。
-私たちの目的を達するためには、[アプリケーション設定](http://www.yiiframework.com/doc/guide/ja/basics.application#application-configuration) を下記のように修正します。
+目的を達するためには、[アプリケーション初期構成](http://www.yiiframework.com/doc/guide/ja/basics.application#sec-2) を下記のように修正します。
~~~
[php]
@@ -41,8 +40,8 @@ return array(
上記において、[urlManager](http://www.yiiframework.com/doc/guide/ja/topics.url) コンポーネントの構成を変更し、`urlFormat` プロパティを `path` に設定し、一連の `rules` を追加しています。
-`urlManager` はこの規則を使用して、 私たちが希望する形式の URL を解釈し、かつ、生成します。例えば、第二の規則は、`/index.php/posts/yii` という URL が要求されたときには、`urlManager` はその要求を `post/index` という[ルート(route)](http://www.yiiframework.com/doc/guide/ja/basics.controller#route) に送出し、`yii` という値を持つ `tag` という名前の GET 引数を生成する責任を負うことを述べています。また一方では、`post/index` というルートと `tag` という引数で URL を生成する場合にも、`urlManager` コンポーネントはこの規則を使用して、私たちが希望する `/index.php/posts/yii` という URL を生成するでしょう。このような訳ですから、私たちは `urlManager` は双方向の URL マネージャであると言います。
+`urlManager` はこの規則を使用して、私たちが希望する形式の URL を解釈し、かつ、生成します。例えば、第二の規則は、`/index.php/posts/yii` という URL が要求されたときには、`urlManager` がその要求を `post/index` という[ルート (route)](http://www.yiiframework.com/doc/guide/ja/basics.controller#sec-2) に送出し、`yii` という値を持つ `tag` という GET 引数を生成することを述べています。また一方では、`post/index` というルートと `tag` という引数で URL を生成する場合にも、`urlManager` コンポーネントはこの規則を使用して、私たちが希望する `/index.php/posts/yii` という URL を生成します。このような訳ですから、私たちは `urlManager` は双方向の URL マネージャであると言います。
-`urlManager` コンポーネントは、URL から `index.php` を見えなくしたり、`.html` のような拡張子を URL に追加したりして、URL の見栄えを更に良くすることが出来ます。これらの機能は、アプリケーション構成の中で `urlManager` のさまざまなプロパティを構成することで、簡単に手に入れることが出来ます。詳細については、[ガイド](http://www.yiiframework.com/doc/guide/ja/topics.url) を参照して下さい。
+`urlManager` コンポーネントは、URL から `index.php` を見えなくしたり、`.html` のような拡張子を URL に追加したりして、URL の見栄えを更に良くすることが出来ます。これらの機能は、アプリケーション初期構成の中で `urlManager` のさまざまなプロパティを構成することで、簡単に手に入れることが出来ます。詳細については、[ガイド](http://www.yiiframework.com/doc/guide/ja/topics.url) を参照して下さい。
<div class="revision">$Id$</div>
View
18 docs/blog/ja/portlet.comments.txt
@@ -4,10 +4,10 @@
このセクションでは、最近投稿されたコメントのリストを表示する、最後のポートレットを作成します。
-`RecentComments`クラスの作成
+`RecentComments` クラスの作成
-------------------------------
-`/wwwroot/blog/protected/components/RecentComments.php`ファイルに`RecentComments`クラスを作成します。このファイルは以下の内容です。
+`/wwwroot/blog/protected/components/RecentComments.php` ファイルに `RecentComments` クラスを作成します。このファイルは以下の内容です。
~~~
[php]
@@ -30,7 +30,7 @@ class RecentComments extends CPortlet
}
~~~
-上記のように、`findRecentComments`メソッドを呼び出します。それは`Comment`クラスで以下のように定義されます。
+上記において呼び出している `findRecentComments` メソッドは `Comment` クラスで以下のように定義されます。
~~~
[php]
@@ -48,16 +48,16 @@ class Comment extends CActiveRecord
}
~~~
-`recentComments`ビューの作成
+`recentComments` ビューの作成
-------------------------
-`/wwwroot/blog/protected/components/views/recentComments.php`ファイルに`recentComments`ビューは格納されます
-これは単純に`RecentComments::getRecentComments()`メソッドで返されるコメントひとつひとつを表示します。
+`recentComments` ビューを `/wwwroot/blog/protected/components/views/recentComments.php` ファイルとして保存します
+これは単純に `RecentComments::getRecentComments()` メソッドで返されるコメントひとつひとつを表示します。
-`RecentComments`ポートレットの使用
+`RecentComments` ポートレットの使用
------------------------------
-レイアウトファイル`/wwwroot/blog/protected/views/layouts/column2.php`を修正し、このポートレットを組込みます
+レイアウトファイル `/wwwroot/blog/protected/views/layouts/column2.php` を修正し、このポートレットを組み込みます
~~~
[php]
@@ -78,4 +78,4 @@ class Comment extends CActiveRecord
......
~~~
-<div class="revision">$Id: portlet.comments.txt 1773 2010-02-01 18:39:49Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
84 docs/blog/ja/portlet.menu.txt
@@ -3,22 +3,23 @@
要求分析に基けば、3種のポートレットが必要だと判明しました。
それらは「ユーザメニュー」ポートレット、「タグクラウド」ポートレット、「最近のコメント」ポートレットです。
-これらのポートレットを、Yiiが提供する[CPortlet]ウイジェットを拡張して開発します。
+これらのポートレットを、Yii が提供する [CPortlet] ウイジェットを拡張して開発します。
-この章では、最初の具体的なポートレットを開発します。それはユーザメニューポートレットで、認証されたユーザにのみ
-提供され、メニュー項目のリストが表示されるものです。メニューは以下の4項目です。
+このセクションでは、最初の具体的なポートレットを開発します。
+それはユーザメニューポートレットで、認証されたユーザにのみ提供されるメニュー項目のリストを表示するものです。
+メニューは以下の4項目です。
- * コメント許可: 許可待ちとなっているコメントのリストへのハイパーリンク
- * 新しいポストの作成: 新しいポスト作成ページへのハイパーリンク
- * ポストの管理: ポスト管理ページへのハイパーリンク
- * ログアウト: 現在のユーザに対するログアウトボタン
+ * コメントを承認: 承認待ちとなっているコメントの一覧へのハイパーリンク
+ * 新しい記事を作成: 記事作成ページへのハイパーリンク
+ * 記事を管理: 記事管理ページへのハイパーリンク
+ * ログアウト: 現在のユーザをログアウトさせるリンクボタン
-`UserMenu`クラスの作成
+`UserMenu` クラスの作成
-------------------------
-ユーザメニューポートレットの論理部分を表現する`UserMenu`クラスを作成します。
-このクラスはファイル`/wwwroot/blog/protected/components/UserMenu.php`に格納され、
+ユーザメニューポートレットの論理部分を表現する `UserMenu` クラスを作成します。
+このクラスはファイル `/wwwroot/blog/protected/components/UserMenu.php` に格納され、
以下のような内容を持ちます。
~~~
@@ -40,41 +41,41 @@ class UserMenu extends CPortlet
}
~~~
-`UserMenu`クラスは、`zii`ライブラリのクラスである`CPortlet`クラスを拡張します。
-`CPortlet``init()`メソッドと`renderContent()`メソッドをオーバライドします。
-前者はポートレットタイトルを現在のユーザ名に設定します
-後者は`userMenu`というビューを描画することによりポートレットのボディ内容を生成します。
+`UserMenu` クラスは、`zii` ライブラリのクラスである `CPortlet` クラスを拡張します。
+`CPortlet``init()` メソッドと `renderContent()` メソッドをオーバライドします。
+前者はポートレットのタイトルを現在のユーザ名に設定します
+後者は `userMenu` というビューを描画することによりポートレットのボディ内容を生成します。
-> Tip|情報: 最初に`CPortlet`クラスにアクセスする前に`Yii::import()`を呼んで、明示的に`CPortlet`クラスを含めなければならないことに注意してください。
-これは`CPortlet` が`zii`プロジェクトの一部であり、それはYiiの公式な拡張ライブラリであるためです
-性能を考慮するため、このプロジェクトはコアクラスとしてリストされていません。そのため、最初に使う前にはインポートする必要があります。
+> Tip|情報: 最初に `CPortlet` クラスにアクセスする前に `Yii::import()` を呼んで、明示的に `CPortlet` クラスを含めなければならないことに注意してください。
+これは `CPortlet` が `zii` プロジェクトの一部であるためです (`zii` は Yii の公式な拡張ライブラリです)
+パフォーマンス上の考慮から、このプロジェクトに属するクラスはコアクラスとしてリストされていません。そのため、最初に使う前にはインポートする必要があります。
-`userMenu`ビューの作成
+`userMenu` ビューの作成
------------------------
-次に、`/wwwroot/blog/protected/components/views/userMenu.php`として格納される`userMenu`ビューを作成します。
+次に、`/wwwroot/blog/protected/components/views/userMenu.php` として格納される `userMenu` ビューを作成します。
~~~
[php]
<ul>
- <li><?php echo CHtml::link('Create New Post',array('post/create')); ?></li>
- <li><?php echo CHtml::link('Manage Posts',array('post/admin')); ?></li>
- <li><?php echo CHtml::link('Approve Comments',array('comment/index'))
+ <li><?php echo CHtml::link('新しい記事を作成',array('post/create')); ?></li>
+ <li><?php echo CHtml::link('記事を管理',array('post/admin')); ?></li>
+ <li><?php echo CHtml::link('コメントを承認',array('comment/index'))
. ' (' . Comment::model()->pendingCommentCount . ')'; ?></li>
- <li><?php echo CHtml::link('Logout',array('site/logout')); ?></li>
+ <li><?php echo CHtml::link('ログアウト',array('site/logout')); ?></li>
</ul>
~~~
-> Info|情報: デフォルトでは、ウィジェットのビューファイルは、ウィジェットクラスファイルを含むディレクトリの`views`サブディレクトリの下に配置されるべきです。
+> Info|情報: 既定として、ウィジェットのビューファイルは、ウィジェットクラスファイルを含むディレクトリの `views` サブディレクトリの下に配置されるべきです。
ファイル名はビュー名と等しい必要があります。
-`UserMenu`ポートレットの使用
+`UserMenu` ポートレットの使用
------------------------
-新しく完成した`UserMenu`ポートレットを使うときがきました。
-レイアウトビューファイル`/wwwroot/blog/protected/views/layouts/column2.php`を以下のように変更します。
+新しく完成した `UserMenu` ポートレットを使うときがきました。
+レイアウトビューファイル `/wwwroot/blog/protected/views/layouts/column2.php` を以下のように変更します。
~~~
[php]
@@ -85,30 +86,29 @@ class UserMenu extends CPortlet
......
~~~
-上記においては、`widget()`メソッドを`UserMenu`クラスインスタンスの生成と実行のためにコールしています。
-このポートレットは認証済みユーザにのみ表示されるべきであるため、現行ユーザの`isGuest`プロパティが偽
-(このユーザが認証されていることを意味する)の場合にのみ`widget()`をコールします。
+上記においては、`widget()` メソッドを呼んで `UserMenu` クラスのインスタンスを生成して実行しています。
+このポートレットは認証済みユーザにのみ表示されるべきであるため、現在のユーザの `isGuest` プロパティが false (このユーザが認証されていることを意味する) の場合にのみ `widget()` をコールします。
-`UserMenu`ポートレットの試験
+
+`UserMenu` ポートレットの試験
--------------------------
今迄に開発したものの試験をしましょう。
- 1. ブラウザウインドウを開き、URL`http://www.example.com/blog/index.php`を入力してください。
+ 1. ブラウザウインドウを開き、URL `http://www.example.com/blog/index.php` を入力してください。
ページのサイドバーセクションに何も表示されないことを確認してください。
- 2. `Login`ハイパーリンクをクリックし、ログインフォームに入力してログインしてください。
-もしログイン成功の場合は、`UserMenu`ポートレットがサイドバーに表れ、ポートレットタイトルがユーザ名となっていることを
-確認してください。
- 3. `UserMenu`ポートレットの'Logout'ハイパーリンクをクリックしてください。
-ログアウト動作が成功し、`UserMenu`ポートレットが消えることを確認してください。
+ 2. `Login` ハイパーリンクをクリックし、ログインフォームに入力してログインしてください。
+もしログイン成功の場合は、`UserMenu` ポートレットがサイドバーに表れ、ポートレットタイトルがユーザ名となっていることを確認してください。
+ 3. `UserMenu` ポートレットの 'ログアウト' ハイパーリンクをクリックしてください。
+ログアウト動作が成功し、`UserMenu` ポートレットが消えることを確認してください。
まとめ
-------
-今まで開発したものはポートレットであり、とても再利用可能なものです
-別のプロジェクトにおいて少々の修正あるいは全く修正せずに再利用が容易に可能です
-それだけでなく、このポートレットは論理と表現は分離されるべきであるという哲学に非常にあう設計となっています
-この点に関して以前の章ではことさら指摘しませんでしたが、このようなことは典型的なYiiアプリケーションのほとんどすべてで使用されています
+開発したポートレットは非常に再利用の可能性が高いものです
+別のプロジェクトにおいて少々の修正あるいは全く修正せずに容易に再利用することが出来ます
+それだけでなく、このポートレットの設計は、論理と表現は分離されるべきであるという哲学に忠実に従っています
+この点に関して以前のセクションではことさら指摘しませんでしたが、典型的な Yii アプリケーションではこの手法がほとんどすべての場所で使用されています
-<div class="revision">$Id: portlet.menu.txt 1739 2010-01-22 15:20:03Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
25 docs/blog/ja/portlet.tags.txt
@@ -1,14 +1,13 @@
タグクラウドポートレットの作成
==========================
-[タグクラウド](http://en.wikipedia.org/wiki/Tag_cloud)は、ポストされたタグを、それぞれのタグの人気のヒントと共に表示します
+[タグクラウド](http://en.wikipedia.org/wiki/Tag_cloud) は、各タグの人気の高さを示唆する視覚効果とともに、記事のタグの一覧を表示するものです
`TagCloud`クラスの作成
-------------------------
-
-`TagCloud`クラスを`/wwwroot/blog/protected/components/TagCloud.php`ファイルとして
+`TagCloud` クラスを `/wwwroot/blog/protected/components/TagCloud.php` ファイルとして
作成します。このファイルは以下のとおりです。
~~~
@@ -36,20 +35,20 @@ class TagCloud extends CPortlet
}
~~~
-`UserMenu`ポートレットと異り、`TagCloud`ポートレットはビューを使用しません。
-その代わり、その表現は`renderContent()`メソッドで行われます。
-これは表現が、あまり多くのHTMLタグを含まないためです
+`UserMenu` ポートレットと異り、`TagCloud` ポートレットはビューを使用しません。
+その代わり、その表現は `renderContent()` メソッドで行われます。
+これは表現が、あまり多くの HTML タグを含まないためです
-それぞれのタグは対応するタグパラメータと共に、対応するポストのインデクスページへのハイパーリンクとして表示されます
-タグのフォントの大きさは、他のタグとの相対的な重みにより調整されます。
-もしあるタグがより頻繁にポストに表れるなら、そのフォントの大きさはより大きく表示されます
+それぞれのタグは、記事のインデクスページへのハイパーリンク (対応するタグをパラメータとして持ちます) として表示されます
+各タグのリンクのフォントサイズは、他のタグとの相対的な重みにより調整されます。
+もしあるタグがより頻繁に記事に表れるなら、そのフォントサイズはより大きくなります
-`TagCloud`ポートレットの使用
+`TagCloud` ポートレットの使用
-------------------------
-`TagCloud`ポートレットの使用はとても単純です。
-レイアウトファイル`/wwwroot/blog/protected/views/layouts/column2.php`を以下のように修正します。
+`TagCloud` ポートレットの使用はとても単純です。
+レイアウトファイル `/wwwroot/blog/protected/views/layouts/column2.php` を以下のように修正します。
~~~
[php]
@@ -66,4 +65,4 @@ class TagCloud extends CPortlet
......
~~~
-<div class="revision">$Id: portlet.tags.txt 1772 2010-02-01 18:18:09Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
30 docs/blog/ja/post.admin.txt
@@ -1,13 +1,13 @@
記事の管理
==========
-記事の管理というのは主に、管理用のビューで記事を一覧表示し、全ステータスの記事を閲覧・更新・削除できるようにすることを意味します。これらの操作はそれぞれ`admin`操作や`delete`操作を行うことで達成されます。`yiic`により生成されたコードはあまり修正の必要がありません。以下においては、これら2つの操作がどのように実装されているかを説明します
+記事の管理というのは主に、管理用のビューで記事を一覧表示し、全てのステータスの記事を閲覧・更新・削除できるようにすることを意味します。これらの操作はそれぞれ `admin` 操作や `delete` 操作を行うことで達成されます。`Gii` により生成されたコードはあまり修正の必要がありません。以下においては、これら二つの操作がどのように実装されているかを説明します
表形式による記事の一覧表示
--------------------------
-`admin`操作により、全ステータスの記事が表形式で表示されます。この画面はソートとページングをサポートします。以下は`PostController``actionAdmin()`メソッドです。
+`admin` 操作により、全てのステータスの記事が表形式で表示されます。この画面はソートとページングをサポートします。以下は `PostController``actionAdmin()` メソッドです。
~~~
[php]
@@ -22,18 +22,18 @@ public function actionAdmin()
}
~~~
-上記のコードは`yiic`ツールにより生成されたものであり、どこも修正していません。コード中では最初に`Post`モデルを`search` [シナリオ](/doc/guide/ja/form.model)により作成します。このモデルを使って、ユーザが指定した検索条件を集めます。次にユーザが指定したデータがあればモデルに割り当てます。最後にモデルに対して`admin`ビューを表示します。
+上記のコードは `Gii` ツールにより生成されたものであり、どこも修正していません。最初に `Post` モデルを `search` [シナリオ](/doc/guide/ja/form.model) により作成します。このモデルを使って、ユーザが指定した検索条件を集めます。次にユーザが指定したデータがあればモデルに割り当てます。最後にこのモデルを使って `admin` ビューを表示します。
-以下は`admin`画面に対するコードです
+以下は `admin` 画面のためのコードです
~~~
[php]
<?php
$this->breadcrumbs=array(
- 'Manage Posts',
+ '記事の管理',
);
?>
-<h1>Manage Posts</h1>
+<h1>記事の管理</h1>
<?php $this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->search(),
@@ -61,15 +61,15 @@ $this->breadcrumbs=array(
)); ?>
~~~
-記事の表示のために[CGridView]を使用します。これを使うとカラムでソートしたり、記事が多くて1ページで表示しきれないときにページング処理をしたりできます。主な変更点は、各カラムの表示方法に関することです。例えば、`title`カラムに対しては、記事の詳細表示へのハイパーリンクになるように指定します。`$data->url`という表現は`Post`クラスで定義した`url`プロパティの値を返します。
+記事の表示のために [CGridView] を使用します。これを使うとカラムでソートしたり、記事が多くて1ページで表示しきれないときにページング処理をしたりできます。主な変更点は、各カラムの表示方法です。例えば、`title` カラムは、記事の詳細表示へのハイパーリンクになるように指定しました。`$data->url` という表現は `Post` クラスで定義した `url` プロパティの値を返します。
-> Tip: テキストを表示するときは、テキストに含まれるHTMLエンティティ(特殊文字をエンコードするために[CHtml::encode()]を呼びます。[クロスサイトスクリプティング](http://www.yiiframework.com/doc/guide/ja/topics.security)を防ぐためです。
+> Tip|ヒント: テキストを表示するときは、テキストに含まれる HTML エンティティ (特殊文字) をエンコードするために [CHtml::encode()] を呼びます。[クロスサイトスクリプティング](http://www.yiiframework.com/doc/guide/ja/topics.security) を防ぐためです。
記事の削除
----------
-`admin`データグリッドには各行に削除ボタンがあります。削除ボタンをクリックすると対応する記事が削除されます。内部的には、クリックによって引き起こされる`delete`アクションを、以下のように実装します
+`admin` データグリッドには各行に削除ボタンがあります。削除ボタンをクリックすると対応する記事が削除されます。内部的には、クリックによって引き起こされる `delete` アクションは以下のように実装されています
~~~
[php]
@@ -77,7 +77,7 @@ public function actionDelete()
{
if(Yii::app()->request->isPostRequest)
{
- // we only allow deletion via POST request
+ // POST リクエストによる削除だけを許可
$this->loadModel()->delete();
if(!isset($_GET['ajax']))
@@ -88,9 +88,9 @@ public function actionDelete()
}
~~~
-上記のコードは`yiic`ツールにより生成されたものであり、どこも修正していません。`$_GET['ajax']`のチェックについて少し説明します。[CGridView]ウィジェットにはとても良い機能があって、初期設定では、ソート・ページング・削除の操作がAJAXモードで実行されます。つまり、このような操作をしてもページの再読み込みが発生しないということです。とはいえ、AJAXではないモードでウィジェットを動かすこともできます(ウィジェットの`ajaxUpdate`プロパティをfalseに設定した場合、またはクライアントのJavaScriptが無効になっている場合)。この2つのシナリオのうちどちらの使い方をするかによって`delete`アクションを次のように変える必要があります。削除要求がAJAX経由で来る場合はブラウザをリダイレクトしませんが、そうでない場合はリダイレクトします
+上記のコードは `Gii` ツールにより生成されたものであり、どこも修正していません。`$_GET['ajax']` のチェックについて少し説明します。[CGridView] ウィジェットにはとても良い機能があって、初期設定では、ソート・ページング・削除の操作が AJAX モードで実行されます。つまり、このような操作をしてもページの再読み込みが発生しないということです。とはいえ、AJAX ではないモードでウィジェットが動作する場合もあります (ウィジェットの `ajaxUpdate` プロパティを false に設定した場合、またはクライアントの JavaScript が無効になっている場合)。`delete` アクションでは、この二つのシナリオを区別する必要があります。すなわち、削除要求が AJAX 経由で来る場合はブラウザをリダイレクトせず、そうでない場合はリダイレクトしなければなりません
-記事を削除するということは、記事についたコメントもすべて削除することになります。加えて、削除した記事で使っていたタグに関して`tbl_tag`テーブルを更新する必要があります。これらのタスクは両方とも、`Post`モデルクラスの`afterDelete`メソッドを以下のように書くことで実現できます。
+記事を削除するときには、記事についたコメントもすべて削除しなければなりません。加えて、削除した記事で使っていたタグに関して `tbl_tag` テーブルを更新する必要もあります。これらのタスクは両方とも、`Post` モデルクラスの `afterDelete` メソッドを以下のように書くことで実現できます。
~~~
[php]
@@ -102,8 +102,8 @@ protected function afterDelete()
}
~~~
-上記コードは見たままの内容です。最初に、削除記事のIDと同じ`post_id`を持つコメントをすべて削除します。次に、削除記事の`tags`に関して`tbl_tag`テーブルを更新します。
+上記コードは見たままの内容です。最初に、削除記事の ID と同じ `post_id` を持つコメントをすべて削除します。次に、削除記事の `tags` に関して `tbl_tag` テーブルを更新します。
-> Tip: ここでは削除記事の全コメントを明示的に削除する必要があります。なぜならSQLiteが外部キー制約をサポートしていないからです(訳注:この記事が書かれたのは2010年09月05日)。この制約をサポートしているDBMS(MySQLやPostgreSQLなど)を使う場合は、記事の削除時に関連コメントが自動的に削除されるように外部キー制約をセットアップすることができます。この場合、コード中で明示的に削除処理を呼ぶ必要はありません。
+> Tip|ヒント: ここでは削除記事の全コメントを明示的に削除する必要があります。なぜなら SQLite が外部キー制約をサポートしていないからです (訳注: この記事が書かれたのは2010年09月05日) 。この制約をサポートしている DBMS (MySQL や PostgreSQLなど) を使う場合は、記事の削除時に関連コメントが自動的に削除されるように外部キー制約をセットアップすることができます。この場合、コード中で明示的に削除処理を呼ぶ必要はありません。
-<div class="revision">$Id: post.admin.txt 2425 2010-09-05 01:30:14Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
32 docs/blog/ja/post.create.txt
@@ -1,53 +1,53 @@
記事の作成と修正
================
-`Post`モデルの準備ができたら、次は`PostController`のためにアクションとビューを手直しします。この節では最初にCRUD操作のアクセス制御をカスタマイズします。次にコードを修正して`create``update`の操作を実装します
+`Post` モデルの準備ができたら、`PostController` のためのアクションとビューを手直しします。このセクションでは、最初に CRUD 操作のアクセス制御をカスタマイズします。次に `create``update` の操作を実装しているコードを修正します
アクセス制御のカスタマイズ
--------------------------
-最初にやりたいのは、[access control](http://www.yiiframework.com/doc/guide/ja/topics.auth#access-control-filter)のカスタマイズです。`gii`で生成したコードは私達の要求に合いません
+最初にやりたいのは、[アクセス制御](http://www.yiiframework.com/doc/guide/ja/topics.auth#sec-5) のカスタマイズです。`gii` が生成したコードは私達の要求に合っていません
-`/wwwroot/blog/protected/controllers/PostController.php`ファイルを開いて、`accessRules()`メソッドを以下のように修正します。
+`/wwwroot/blog/protected/controllers/PostController.php` ファイルを開いて、`accessRules()` メソッドを以下のように修正します。
~~~
[php]
public function accessRules()
{
return array(
- array('allow', // allow all users to perform 'list' and 'show' actions
+ array('allow', // 全てのユーザに 'index' と 'view' のアクションを許可
'actions'=>array('index', 'view'),
'users'=>array('*'),
),
- array('allow', // allow authenticated users to perform any action
+ array('allow', // 認証されたユーザに全てのアクションを許可
'users'=>array('@'),
),
- array('deny', // deny all users
+ array('deny', // 全てのユーザのアクセスを拒否
'users'=>array('*'),
),
);
}
~~~
-上記のルールでは、すべてのユーザが`index``view`アクションにアクセス可能です。認証済みユーザは、`admin`アクションを含め、すべてのアクションにアクセス可能です。これ以外のシナリオではアクセスが拒否されます。ここで気をつけて欲しいのは、これらのルールはここに書き並べた順番で評価されるということです。そのときの状況に最初に一致したルールによって、アクセスの可否が決まります。例えば、ユーザがシステムオーナーで記事作成ページを訪れようとした場合、2番目のルールが一致して、ユーザにアクセス権が与えられます。
+上記のルールでは、すべてのユーザが `index``view` アクションにアクセス可能です。認証済みユーザは、`admin` アクションを含め、すべてのアクションにアクセス可能です。これ以外のシナリオではアクセスが拒否されます。ここで気をつけて欲しいのは、これらのルールはここに書き並べた順番で評価されるということです。そのときの状況に最初に一致したルールによって、アクセスの可否が決まります。例えば、ユーザがシステムオーナで記事作成ページを訪れようとした場合、2番目のルールが一致して、ユーザにアクセス権が与えられます。
-`create`操作と`update`操作のカスタマイズ
+`create` 操作と `update` 操作のカスタマイズ
----------------------------------------
-`create`操作と`update`操作はよく似ています。両方とも、ユーザの入力を得るためにHTMLフォームを表示し、入力をバリデート(検証)し、データベースに保存します。大きな違いは、`update`操作ではデータベースの既存のデータをあらかじめフォームにセットするという点です。このため`gii`は部分的なビュー(partial view)として`/wwwroot/blog/protected/views/post/_form.php`を生成し、これを`create``update`の両方のビューに埋め込んでHTMLフォームを表示します
+`create` 操作と `update` 操作はよく似ています。両方とも、ユーザの入力を得るために HTML フォームを表示し、入力を検証し、データベースに保存します。大きな違いは、`update` 操作ではデータベースの既存のデータをあらかじめフォームにセットするという点です。このため `gii` は部分的なビュー(partial view)として `/wwwroot/blog/protected/views/post/_form.php` を生成し、これを `create``update` の両方のビューに埋め込んで HTML フォームを表示します
-最初に`_form.php`ファイルを修正して、HTMLフォームで集める入力値を`title`, `content`, `tags`, `status`だけにします。はじめの3つは通常のテキスト入力欄を使います。`status`にはドロップダウンリストを使います。記事のステータスを表す文字列をドロップダウンリストの選択肢にします
+最初に `_form.php` ファイルを修正して、HTML フォームで集める入力値をユーザに入力させたい `title`, `content`, `tags`, `status` だけにします。はじめの3つの属性には通常のテキスト入力欄を使います。`status` にはドロップダウンリストを使います。ドロップダウンリストの選択肢は、記事のステータスを表す文字列です
~~~
[php]
<?php echo $form->dropDownList($model,'status',Lookup::items('PostStatus')); ?>
~~~
-上の例では、記事のステータス一覧を取得するために、`Lookup::items('PostStatus')`を呼んでいます。
+上の例では、記事が取り得るステータスの一覧を取得するために、`Lookup::items('PostStatus')` を呼んでいます。
-次に`Post`クラスを修正し、記事がデータベースに保存される前にいくつかの属性`create_time``author_id`が自動的にセットされるようにします。以下のように`beforeSave()`メソッドをオーバーライドします。
+次に `Post` クラスを修正し、記事がデータベースに保存される前にいくつかの属性 (`create_time``author_id`) が自動的にセットされるようにします。以下のように `beforeSave()` メソッドをオーバーライドします。
~~~
[php]
@@ -69,7 +69,7 @@ protected function beforeSave()
}
~~~
-記事を保存するときに、タグの出現頻度の変化を反映するために`tbl_tag`テーブルを更新する必要があります。この処理は`afterSave()`メソッドに書けばできます。このメソッドは、データベースへの記事の保存が成功した後に、Yiiから自動的に呼ばれます
+記事を保存するときに、タグの出現頻度の変化を反映するために `tbl_tag` テーブルを更新する必要があります。この処理は `afterSave()` メソッドに書けばできます。この `afterSave()` メソッドは、データベースへの記事の保存が成功した後に、Yii から自動的に呼ばれます
~~~
[php]
@@ -88,9 +88,9 @@ protected function afterFind()
}
~~~
-実装においては、ユーザが既存の記事を更新するときにタグを変更したかどうか判定したいので、変更前のタグが何であったかを知る必要があります。このため、`afterFind()`メソッドを書いて、`_oldTags`変数に古いタグを保持するようにしました。この`afterFind()`メソッドは、データベースから取得したデータがARレコードに投入されるときに、Yiiから自動的に呼ばれます
+実装においては、ユーザが既存の記事を更新するときにタグを変更したかどうか判定したいので、変更前のタグが何であったかを知る必要があります。このため、`afterFind()` メソッドを書いて、`_oldTags` 変数に古いタグを保持するようにしました。この `afterFind()` メソッドは、AR レコードにデータベースから取得したデータが投入されたときに、Yii から自動的に呼ばれます
-ここでは`Tag::updateFrequency()`メソッドについて詳しく説明しません。興味のある方は`/wwwroot/yii/demos/blog/protected/models/Tag.php`を参照してください。
+ここでは `Tag::updateFrequency()` メソッドについて詳しく説明しません。興味のある方は `/wwwroot/yii/demos/blog/protected/models/Tag.php` を参照してください。
-<div class="revision">$Id: post.create.txt 3209 2011-05-12 12:11:03Z mdomba $</div>
+<div class="revision">$Id$</div>
View
34 docs/blog/ja/post.display.txt
@@ -1,15 +1,15 @@
記事の表示
==========
-私達のブログアプリケーションでは、記事の表示方法は、リスト形式と単独での表示が可能です。前者は`index`操作として実装し、後者は`view`操作として実装します。この節では、初期の要求を満たすように両方の操作をカスタマイズします。
+このブログアプリケーションでは、記事はリスト形式での表示と単独での表示が可能です。前者は `index` 操作として実装され、後者は `view` 操作として実装されています。このセクションでは、初期の要求を満たすように両方の操作をカスタマイズします。
-`view`操作のカスタマイズ
+`view` 操作のカスタマイズ
------------------------
-`view`操作は`PostController``actionView()`メソッドで実装します。表示内容は`view`というビューで生成されます。ビューファイルは`/wwwroot/blog/protected/views/post/view.php`です。
+`view` 操作は `PostController``actionView()` メソッドで実装されています。表示内容は `view` というビューで生成されます。ビューファイルは `/wwwroot/blog/protected/views/post/view.php` です。
-以下のコードで、`PostController``view`操作を実装します:
+以下のコードが、`PostController``view` 操作を実装する部分です:
~~~
[php]
@@ -37,25 +37,25 @@ public function loadModel()
$this->_model=Post::model()->findByPk($_GET['id'], $condition);
}
if($this->_model===null)
- throw new CHttpException(404,'The requested page does not exist.');
+ throw new CHttpException(404,'リクエストされたページは存在しません。');
}
return $this->_model;
}
~~~
-主な変更点は`loadModel()`メソッドにあります。このメソッドで、GETパラメータの`id`に従って`Post`テーブルに問い合わせをします。もし記事が見つからない、または記事の状態が未公開、または(ユーザがゲストの場合)アーカイブ化されていたら、404 HTTPエラーを投げます。そうでなければ、記事オブジェクトが`actionView()`に返され、表示のためにビュースクリプトへと渡されていきます。
+主な変更点は `loadModel()` メソッドにあります。このメソッドで、GET パラメータの `id` に従って `Post` テーブルに問い合わせをします。記事が見つからない場合、あるいは、(ユーザがゲストであって) 記事が公開もアーカイブもされていない場合は、404 HTTP エラーを投げます。そうでなければ、記事オブジェクトが `actionView()` に返され、表示のためにビュースクリプトへと渡されていきます。
-> Tip: YiiはHTTP例外([CHttpException]のインスタンスを捕捉し、定義済みのテンプレートか、カスタマイズしたエラービューで表示します。`yiic`で生成したスケルトン・アプリケーションにはカスタマイズしたエラービューが含まれています。ファイルは`/wwwroot/blog/protected/views/site/error.php`です。このファイルを修正すれば、エラー表示をもっとカスタマイズできます
+> Tip|ヒント: Yii は HTTP 例外 ([CHttpException] のインスタンス) を捕捉し、定義済みのテンプレートか、カスタマイズしたエラービューで表示します。`yiic` で生成されたスケルトンアプリケーションには既にカスタマイズしたエラービューが含まれています。ファイルは `/wwwroot/blog/protected/views/site/error.php` です。このファイルを修正すれば、エラー表示を更にカスタマイズできます
-`view`スクリプトの変更は、記事の表示に関するフォーマットとスタイルを調整することが中心になります。ここでは詳細には立ち入りません。興味のある方は`/wwwroot/blog/protected/views/post/view.php`を参照してください。
+`view` スクリプトの変更は、記事の表示に関するフォーマットとスタイルを調整することが中心になります。ここでは詳細には立ち入りません。興味のある方は `/wwwroot/blog/protected/views/post/view.php` を参照してください。
-`index`操作のカスタマイズ
+`index` 操作のカスタマイズ
-------------------------
-`view`操作と同様に、`index`操作でも2ヶ所をカスタマイズします。`PostController``actionIndex()`メソッドと、ビューファイル`/wwwroot/blog/protected/views/post/index.php`です。主な追加内容は、特定のタグに結び付いた記事の一覧表示をサポートすることです
+`view` 操作と同様に、`index` 操作でも2ヶ所をカスタマイズします。`PostController``actionIndex()` メソッドと、ビューファイル `/wwwroot/blog/protected/views/post/index.php` です。主として、特定のタグに結び付いた記事の一覧表示に対するサポートを追加することが必要になります
-下は、`PostController``actionIndex()`メソッドを修正したものです:
+以下は、`PostController``actionIndex()` メソッドを修正したものです:
~~~
[php]
@@ -82,18 +82,18 @@ public function actionIndex()
}
~~~
-上の例では最初に、記事リストを取得するためのクエリー基準を作成します。この基準は、公開済みの記事だけを返し、並び順を更新時刻の降順にするという内容です。また、リスト表示するときは各記事のコメント数を表示したいので、`commentCount`を返す指示もあります。覚えているか分かりませんが、これは`Post::relations()`で宣言したリレーションです。
+上の例では最初に、記事リストを取得するためのクエリー基準を作成します。この基準は、公開済みの記事だけを返し、並び順を更新時刻の降順にするという内容です。また、リスト表示するときは各記事のコメント数を表示したいので、`commentCount` を返す指示もあります。覚えているか分かりませんが、これは `Post::relations()` で宣言したリレーションです。
ユーザが特定のタグの記事を見たいという場合は、検索条件をクエリー基準に追加して、特定のタグだけを探すようにします。
-このクエリー基準を使って、データプロバイダーを作ります。データプロバイダーは主に3つの仕事をこなします。まず、データが多いときにページネーションページ送り処理)ができます。ここではページサイズを5にセットして、ページネーションをカスタマイズしています。次に、ユーザの要求に合わせてソートができます。最後に、ページ送りとソートをしたデータを、表示のためにウィジェットとビューに供給することができます
+このクエリー基準を使って、データプロバイダーを作ります。データプロバイダーは主に3つの仕事をこなします。まず、データが多いときにページネーション (ページ送り処理) をします。ここではページサイズを5にセットして、ページネーションをカスタマイズしています。次に、ユーザの要求に合わせてソートを行ないます。最後に、ページ送りとソートをしたデータを表示用のウィジェットやビューコードに供給します
-`actionIndex()`ができあがったら、`index`ビューを以下のように修正します。主な変更点は、表示する記事をユーザがタグで指定したときに、`h1`ヘッダーを追加することです。
+`actionIndex()` の修正が完了したら、`index` ビューを以下のように修正します。主な変更点は、表示する記事をユーザがタグで指定したときに、`h1` ヘッダーを追加することです。
~~~
[php]
<?php if(!empty($_GET['tag'])): ?>
-<h1>Posts Tagged with <i><?php echo CHtml::encode($_GET['tag']); ?></i></h1>
+<h1><i><?php echo CHtml::encode($_GET['tag']); ?></i> というタグを持つ記事</h1>
<?php endif; ?>
<?php $this->widget('zii.widgets.CListView', array(
@@ -103,6 +103,6 @@ public function actionIndex()
)); ?>
~~~
-上の例では、記事リストの表示に[CListView]を使っています。このウィジェットは、個々の記事の詳細を表示するために部分的ビュー(partial view)を必要とします。ここでpartial viewとして指定している`_view`は、`/wwwroot/blog/protected/views/post/_view.php`のことです。このビュースクリプトの中では、`$data`というローカル変数を使って、記事のインスタンスにアクセスできます。
+上の例で、記事リストの表示に [CListView] を使っていることに着目して下さい。このウィジェットは、個々の記事の詳細を表示するために部分的ビュー (partial view) を必要とします。ここで partial view として指定している `_view` は、`/wwwroot/blog/protected/views/post/_view.php` のことです。このビュースクリプトの中では、`$data` というローカル変数を使って、記事のインスタンスにアクセスできます。
-<div class="revision">$Id: post.display.txt 2121 2010-05-10 01:31:30Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
97 docs/blog/ja/post.model.txt
@@ -1,24 +1,23 @@
-Postモデルのカスタマイズ
+Post モデルのカスタマイズ
======================
-`Gii`ツールにより生成された`Post`モデルクラスは、主に2つの点において修正されます
+`Gii` ツールにより生成された `Post` モデルクラスは、主に二つの点において修正する必要があります
- - `rules()`メソッド: モデルアトリビュートに対する検証規則を規定
- - `relations()`メソッド: リレーショナルオブジェクトを規定
+ - `rules()` メソッド: モデルの属性に対する検証ルールを規定
+ - `relations()` メソッド: リレーショナルオブジェクトを規定
-> Info|情報: [モデル](http://www.yiiframework.com/doc/guide/ja/basics.model)
-はアトリビュートのリストから構成され、それぞれに対応するデータベーステーブルのコラムを持ちます。
-アトリビュートは明示的にクラスメンバ変数として宣言される場合もあり、宣言無しで宣言されることもあります。
+> Info|情報: [モデル](http://www.yiiframework.com/doc/guide/ja/basics.model) は属性のリストから構成されます。それぞれの属性は、通常は、対応するデータベーステーブルのコラムと関連付けられます。
+属性は明示的にクラスメンバ変数として宣言される場合もあり、宣言無しで黙示的に宣言されることもあります。
-`rules()`メソッドのカスタマイズ
+`rules()` メソッドのカスタマイズ
----------------------------
-最初に、アトリビュート値がデータベースに格納される前に正しいことが確実になるような検証ルールを定めます
-例えば、`Post`クラスの`status`アトリビュートは整数の1, 2か3でなければなりません
-`Gii`ツールもそれぞれのモデルに対してまた検証ルールを生成します
-しかしながらそれはテーブルカラム情報に基いたルールであり、妥当とは言えません
+最初に、検証ルールを指定します。これは、属性の値をデータベースに保存する前に、ユーザによって入力された値が正しいものであることを保証するためのものです
+例えば、`Post` クラスの `status` 属性は、整数の 1, 2, 3 のどれかでなければなりません
+`Gii` ツールもそれぞれのモデルに対して検証ルールを生成します
+しかしながら、それはテーブルのカラム情報に基いたルールであり、妥当なものではないかも知れません
-要求分析に基き、`rules()`メソッドを以下のように修正します。
+要求分析に基き、`rules()` メソッドを以下のように修正します。
~~~
[php]
@@ -29,7 +28,7 @@ public function rules()
array('title', 'length', 'max'=>128),
array('status', 'in', 'range'=>array(1,2,3)),
array('tags', 'match', 'pattern'=>'/^[\w\s,]+$/',
- 'message'=>'Tags can only contain word characters.'),
+ 'message'=>'タグは単語構成文字だけを含むことが出来ます。'),
array('tags', 'normalizeTags'),
array('title, status', 'safe', 'on'=>'search'),
@@ -37,16 +36,16 @@ public function rules()
}
~~~
-上記において、`title``content``status`アトリビュートは必須です
-`title`長は128を超えてはなりません
-`status`アトリビュート値は1 (ドラフト)、2 (公開)、3 (書庫)のうちのいずれかです
-`tags`アトリビュートは語句とカンマしか含むことはできません
-さらに、ユーザが入力したタグを、ユニークでカンマで正しく分離されるように`normalizeTags`を使用します
-最後のルールはサーチ機能で使用しますが、後で説明します
+上記において、`title`, `content`, `status` 属性は必須です
+`title` の長さは 128 を超えてはなりません
+`status` 属性の値は、1 (下書き)、2 (公開)、3 (アーカイブ) のうちのいずれかでなければなりません
+`tags` 属性は単語構成文字とカンマしか含むことはできません
+さらに、`normalizeTags` を使用して、ユーザが入力したタグの文字列を正規化し、ユニークなタグがカンマで正しく分離されている文字列になるようにします
+最後のルールはサーチ機能で使用しますが、これについては後で説明します
-`required``length``in``match`のような検証ルールは全てYiiが提供する備え付けのものです
-`normalizeTags`バリデータはメソッドで構成されるバリデータで、`Post`クラスにおいて定義される必要があります
-より詳細な、どのようにバリデータを定義するかの情報は、[ガイド](http://www.yiiframework.com/doc/guide/ja/form.model#declaring-validation-rules)を参照してください。
+`required`, `length`, `in`, `match` のようなバリデータは全て Yii が提供する備え付けのものです
+`normalizeTags` バリデータはメソッドベースのバリデータであり、`Post` クラスにおいて定義する必要があります
+検証ルールを定義する方法に関するより詳細な情報は、[ガイド](http://www.yiiframework.com/doc/guide/ja/form.model#sec-3) を参照してください。
~~~
[php]
@@ -56,7 +55,7 @@ public function normalizeTags($attribute,$params)
}
~~~
-ここで、`array2string``string2array`は新しいメソッドで、`Tag`モデルクラスで定義します
+ここで、`array2string``string2array`、`Tag` モデルクラスで定義しなければならない新しいメソッドです
~~~
[php]
@@ -71,19 +70,20 @@ public static function array2string($tags)
}
~~~
-`rules()`メソッドで宣言されたルールはひとつひとつ、モデルインスタンスの
-[validate()|CModel::validate]メソッドまたは[save()|CActiveRecord::save]メソッドをコールする際に実行されます。
+`rules()` メソッドで宣言されたルールは、モデルインスタンスの [validate()|CModel::validate] メソッドまたは [save()|CActiveRecord::save] メソッドをコールする際に、ひとつひとつ実行されます。
-> Note|: 覚えて欲しい重要なことがあります。`rules()`にはエンドユーザが入力する属性だけを書いてください。`Post`モデルの`id``create_time`といったプログラムやデータベースによって設定される属性は、`rules()`に入れるべきではありません。詳しくは、[属性への代入をセキュアにする](http://www.yiiframework.com/doc/guide/ja/form.model#securing-attribute-assignments)を参照のこと
+> Note|注意: 覚えて欲しい重要なことがあります。`rules()` に出現する属性は、エンドユーザによって入力される属性でなければなりません。`Post` モデルの `id``create_time` など、プログラムやデータベースによって設定される属性は、`rules()` に入れるべきではありません。詳しくは、[属性への代入を安全にする](http://www.yiiframework.com/doc/guide/ja/form.model#sec-4) を参照して下さい
-以上の変更をしたら、postの作成ページを再び開いて、新しいバリデーションルールが機能しているか検証することができます
+以上の変更をしたら、記事の作成ページを再び開いて、新しい検証ルールが機能していることを確認することができます
-`relations()`メソッドのカスタマイズ
+`relations()` メソッドのカスタマイズ
-----------------------------------
-最後に`relations()`メソッドをカスタマイズして、postに関連するオブジェクトを指定します。`relations()`で関連オブジェクトを宣言することによって[リレーショナルアクティブレコード (RAR)](http://www.yiiframework.com/doc/guide/ja/database.arr)のパワフルな機能を引き出し、執筆者やコメント一覧などの、postに関連するオブジェクトの情報にアクセスできるようになります。複雑なSQL JOIN構文を書く必要はありません。
+最後に `relations()` メソッドをカスタマイズして、記事に関連するオブジェクトを指定します。
+`relations()` で関連オブジェクトを宣言することによって、[リレーショナルアクティブレコード (RAR)](http://www.yiiframework.com/doc/guide/ja/database.arr) のパワフルな機能を引き出すことが出来ます。
+すなわち、RAR を使って、複雑な SQL JOIN 構文を書くことなく、執筆者やコメント一覧などの記事に関連するオブジェクトの情報にアクセスできるようになります。
-`relations()`メソッドを次のように書き換えます
+`relations()`メソッドを次のようにカスタマイズします
~~~
[php]
@@ -100,7 +100,7 @@ public function relations()
}
~~~
-上記メソッドで使用する2つの定数を、`Comment`モデルに加えます。
+同時に、上記メソッドで使用されている二つの定数を、`Comment` モデルに加えます。
~~~
[php]
@@ -112,13 +112,13 @@ class Comment extends CActiveRecord
}
~~~
-`relations()`で宣言したリレーションは次のような意味です。
+`relations()` で宣言したリレーションは次のような意味です。
- * 1つのpostが、1つの執筆者(author)に所属する。執筆者のクラスは`User`で、postの`author_id`属性で結び付けられる。
- * 1つのpostが、多数のコメントを持つ。コメントのクラスは`Comment`で、コメントの`post_id`属性で結び付けられる。コメントは作成日時順にソートされ、承認済み(APPROVED)のコメントだけで構成される。
- * `commentCount`は、集計結果を返す少し特殊なリレーションで、postが持つコメント数を表す
+ * 1つの記事は、1つの執筆者に所属する。執筆者のクラスは `User` で、記事の `author_id` 属性で結び付けられる。
+ * 1つの記事は、多数のコメントを持つ。コメントのクラスは `Comment` で、コメントの `post_id` 属性で結び付けられる。コメントは作成日時順にソートされ、承認済み(APPROVED)のコメントだけで構成される。
+ * `commentCount` は集計結果を返す少し特殊なリレーションで、記事が持つコメントの数を表す
-上記のリレーションを宣言することで、以下のように簡単にpostの執筆者やコメントにアクセスできます
+上記のリレーションを宣言することで、以下のように簡単に記事の執筆者やコメントにアクセスできます
~~~
[php]
@@ -130,14 +130,14 @@ foreach($comments as $comment)
echo $comment->content;
~~~
-リレーションの宣言と使い方の詳細については、[ガイド](http://www.yiiframework.com/doc/guide/ja/database.arr)をご覧ください。
+リレーションの宣言と使い方の詳細については、[ガイド](http://www.yiiframework.com/doc/guide/ja/database.arr) をご覧ください。
`url`プロパティの追加
---------------------
-postには、内容を閲覧するためのユニークなURLが結び付いています。このURLを取得するために、コードのいたるところで[CWebApplication::createUrl] を書くのではなく、`Post`モデルに`url`属性を追加することで、URLを生成する1つのコードを使い回せます。後でURLを美しくする方法を説明するときに、このプロパティの追加が非常に便利なことが分かります。
+記事には、内容を閲覧するためのユニークな URL が結び付いています。この URL を取得するために、コードのいたるところで [CWebApplication::createUrl] を書くのではなく、`Post` モデルに `url` プロパティを追加することで、URL を生成する同一のコードを再利用できます。後で URL を美しくする方法を説明するときに、このプロパティの追加が非常に便利なことが分かります。
-`url`プロパティを追加するために、以下のように`Post`クラスを修正してgetterメソッドを追加します
+`url` プロパティを追加するために、以下のように `Post` クラスを修正して getter メソッドを追加します
~~~
[php]
@@ -153,16 +153,17 @@ class Post extends CActiveRecord
}
~~~
-URLのGETパラメータとして、postのIDのほかにタイトルも追加しています。これはSEO(検索エンジン最適化)が主な目的です。後ほど[Beautifying URLs](/doc/blog/final.url)で説明します。
+URL の GET パラメータとして、post の ID に加えて title を追加していることに注目して下さい。
+これは、後ほど [URL をきれいにする](/doc/blog/final.url) で説明するように、主として検索エンジン最適化 (SEO) を目的としています。
-`Post`の最も祖先のクラスは[CComponent]なので、`getUrl()`というgetterメソッドを追加することで、`$post->url`という書き方ができるようになります。`$post->url`にアクセスすると、getterメソッドが実行され、その結果が式の値として返されます。このようなコンポーネントの機能の詳細については[ガイド](/doc/guide/ja/basics.component)を参照のこと
+`Post` の最上位の親クラスは [CComponent] なので、`getUrl()` という getter メソッドを追加することで `$post->url` という書き方ができるようになります。`$post->url` にアクセスすると getter メソッドが実行されて、その結果が式の値として返されます。このようなコンポーネントの機能の詳細については [ガイド](/doc/guide/ja/basics.component) を参照して下さい
ステータスをテキストで表現する
------------------------------
-postのステータスはinteger型でデータベースに保存されるので、エンドユーザに分かりやすく表示するために、テキスト形式での表現を提供する必要があります。大きなシステムでは、このような要求はよくあることです。
+記事のステータスは整数でデータベースに保存されるので、エンドユーザに分かりやすく表示するために、テキスト形式での表現を提供する必要があります。大きなシステムでは、このような要求はよくあることです。
-一般的な解決策として、ここでは`tbl_lookup`テーブルを使います。このテーブルにinteger値とテキスト表現の対応表を持たせ、このテキスト表現を他のデータオブジェクトから利用します。`Lookup`モデルクラスを以下のように修正し、テーブル内のテキストデータに容易にアクセスできるようにします。
+汎用的な解決策として、ここでは `tbl_lookup` テーブルを使います。このテーブルに整数値とテキスト表現の対応表を持たせ、このテキスト表現を他のデータオブジェクトから利用します。`Lookup` モデルクラスを以下のように修正し、テーブル内のテキストデータに容易にアクセスできるようにします。
~~~
@@ -201,11 +202,11 @@ class Lookup extends CActiveRecord
}
~~~
-新しいコードは主に2つの静的メソッド、`Lookup::items()``Lookup::item()`を提供します。前者は、指定したデータタイプに属する文字列のリストを返します。後者は、データのタイプと値を指定することで、特定の文字列を返します
+新しいコードは主に二つの静的メソッド、`Lookup::items()``Lookup::item()` を提供します。前者は、指定したデータタイプに属する文字列のリストを返します。後者は、指定したデータのタイプと値に対応する特定の文字列を返します
-ブログのデータベースに、Lookup用のタイプとして`PostStatus``CommentStatus`を事前に追加しておきます。前者は可能な投稿ステータスを示し、後者はコメントステータスを示します
+ブログのデータベースには、Lookup のタイプとして `PostStatus``CommentStatus` が事前に登録されています。前者は記事のステータスが取り得る値を示し、後者はコメントのステータスが取り得る値を示します
-コードを読みやすくするために、一連のステータスを表すinteger値の定数を宣言します。コード中で各ステータス値を参照するときはこの定数を使うようにします
+さらに、コードを読みやすくするために、一連のステータスを表す整数値の定数を宣言します。コード中で各ステータス値を参照するときはこの定数を使うべきです
~~~
[php]
@@ -218,6 +219,6 @@ class Post extends CActiveRecord
}
~~~
-これによって、`Lookup::items('PostStatus')`を呼ぶと、投稿のステータスとして取りうる値のリスト(integer値をインデックスとした、各値に対応するテキスト表現の一覧)を取得できます。また、`Lookup::item('PostStatus', Post::STATUS_PUBLISHED)`を呼ぶと、公開済みというステータスのテキスト表現を取得できます。
+従って、`Lookup::items('PostStatus')` を呼ぶと、記事のステータスが取り得る値のリスト (対応する整数値をインデックスとするテキスト表現のリスト) を取得できます。また、`Lookup::item('PostStatus', Post::STATUS_PUBLISHED)` を呼ぶと、公開済みというステータスのテキスト表現を取得できます。
<div class="revision">$Id$</div>
View
84 docs/blog/ja/prototype.auth.txt
@@ -1,13 +1,15 @@
ユーザ認証
===================
-このブログアプリケーションでは、システムオーナとゲストユーザの区別が必要です。 したがって、[ユーザ認証](http://www.yiiframework.com/doc/guide/ja/topics.auth)機能を実装する必要があります。
+このブログアプリケーションでは、システムオーナとゲストユーザの区別が必要です。 したがって、[ユーザ認証](http://www.yiiframework.com/doc/guide/ja/topics.auth) 機能を実装する必要があります。
-スケルトンアプリケーションにはすでにユーザ認証機能が備わっています。 ユーザ名とパスワードのどちらもが `demo` 、もしくは `admin` で確認することができます。このセクションでは、認証を `tbl_user` テーブルに基づいて行うよう、対応するコードを修正します。
+気付いていらっしゃるかも知れませんが、スケルトンアプリケーションにはすでにユーザ認証機能が備わっています。
+これは、ユーザ名とパスワードのどちらもが `demo` もしくは `admin` であればユーザとして認証する、というものです。
+このセクションでは、ユーザ認証を `User` データベーステーブルに基づいて行うように、対応するコードを修正します。
ユーザ認証は [IUserIdentity] インタフェースを実装するクラスで行われます。スケルトンアプリケーションでは、この目的のために `UserIdentity` クラスを使っています。このクラスファイルは、`/wwwroot/blog/protected/components/UserIdentity.php` に保存されています。
-> Tip|ヒント: 規約により、クラスファイル名は対応するクラス名に接尾辞に拡張子 `.php` をつけたものになります。この規約に従って、[パスエイリアス](http://www.yiiframework.com/doc/guide/ja/basics.namespace)を使ったクラス参照が可能です。 例えば、`UserIdentity` クラスを、`application.components.UserIdentity` というエイリアスで参照することができます。Yii の多くの API において、パスエイリアスを利用可能です。(例:[Yii::createComponent()|YiiBase::createComponent]そして、パスエイリアスを使うことは、コードに絶対パスを埋め込む必要をなくします。絶対パスを記述することはしばしばアプリケーション配備の際のトラブルの元になります
+> Tip|ヒント: 規約により、クラスファイル名は対応するクラス名に接尾辞として拡張子 `.php` を付けたものでなければなりません。この規約に従えば、[パスエイリアス](http://www.yiiframework.com/doc/guide/ja/basics.namespace) を使ってクラスを参照することが可能になります。 例えば、`UserIdentity` クラスを、`application.components.UserIdentity` というエイリアスで参照することができます。Yii では多くの API がパスエイリアスを認識します(例えば [Yii::createComponent()|YiiBase::createComponent])。そして、パスエイリアスを使えば、コードに絶対パスを埋め込む必要がなくなります。コードに埋め込まれた絶対パスは、しばしばアプリケーション配備の際にトラブルを引き起こします
`UserIdentity` クラスを以下のように修正します。
@@ -18,22 +20,22 @@ class UserIdentity extends CUserIdentity
{
private $_id;
- public function authenticate()
- {
- $username=strtolower($this->username);
- $user=User::model()->find('LOWER(username)=?',array($username));
- if($user===null)
- $this->errorCode=self::ERROR_USERNAME_INVALID;
- else if(!$user->validatePassword($this->password))
- $this->errorCode=self::ERROR_PASSWORD_INVALID;
- else
- {
- $this->_id=$user->id;
- $this->username=$user->username;
- $this->errorCode=self::ERROR_NONE;
- }
- return $this->errorCode==self::ERROR_NONE;
- }
+ public function authenticate()
+ {
+ $username=strtolower($this->username);
+ $user=User::model()->find('LOWER(username)=?',array($username));
+ if($user===null)
+ $this->errorCode=self::ERROR_USERNAME_INVALID;
+ else if(!$user->validatePassword($this->password))
+ $this->errorCode=self::ERROR_PASSWORD_INVALID;
+ else
+ {
+ $this->_id=$user->id;
+ $this->username=$user->username;
+ $this->errorCode=self::ERROR_NONE;
+ }
+ return $this->errorCode==self::ERROR_NONE;
+ }
public function getId()
{
@@ -42,35 +44,35 @@ class UserIdentity extends CUserIdentity
}
~~~
-`authenticate()` メソッドにおいて、 `User` クラスを用いて `tbl_user` テーブルの行を参照しています。`tbl_user` テーブルの `username` 列は特定のユーザ名(大文字小文字の区別なし)と同一です。`User` クラスは前のセクションで `gii` ツールによって作られたものであることを思い出してください。`User` クラスは [CActiveRecord] を継承しているため、 [ActiveRecord 機能](http://www.yiiframework.com/doc/guide/ja/database.ar)、オブジェクト指向(OOP)にのっとったやり方で `tbl_user` テーブルにアクセスすることができます
+この `authenticate()` メソッドにおいては、`User` クラスを用いて`tbl_user` テーブルの中から、`username` カラムが与えられた `username` と同じである行を探し出しています(大文字と小文字は区別しません)。`User` クラスは前のセクションで `gii` ツールによって作られたものであることを思い出してください。`User` クラスは [CActiveRecord] を継承しているため、 [アクティブレコードの機能](http://www.yiiframework.com/doc/guide/ja/database.ar) を利用して、オブジェクト指向(OOP)の流儀で `tbl_user` テーブルにアクセスすることが出来ます
-ユーザが正当なパスワードを入力したかどうかをチェックするため、`User`クラスの`validatePassword`メソッドが起動されます
-`/wwwroot/blog/protected/models/User.php`を以下の様に修正します
-プレーンなパスワードをデータベースに保存するのではなく、ランダムに発生したソルトキーとともにパスワードのハッシュを保存することに注意してください
-ユーザが入力したパスワードを検証する際は、そのかわりハッシュされた結果を比較することになります
+ユーザが正当なパスワードを入力したかどうかをチェックするため、`User` クラスの `validatePassword` メソッドを呼び出しています
+`/wwwroot/blog/protected/models/User.php` を以下の様に修正する必要があります
+プレーンなパスワードをデータベースに保存するのではなく、パスワードのハッシュの結果をランダムに発生したソルトキーとともに保存することに注意してください
+ユーザが入力したパスワードを検証する際は、パスワードではなくハッシュされた結果を比較することになります
~~~
[php]
class User extends CActiveRecord
{
- ......
- public function validatePassword($password)
- {
- return $this->hashPassword($password,$this->salt)===$this->password;
- }
-
- public function hashPassword($password,$salt)
- {
- return md5($salt.$password);
- }
+ ......
+ public function validatePassword($password)
+ {
+ return $this->hashPassword($password,$this->salt)===$this->password;
+ }
+
+ public function hashPassword($password,$salt)
+ {
+ return md5($salt.$password);
+ }
}
~~~
`UserIdentity` クラスでは、`getId()` メソッドをオーバーライドして、`tbl_user` テーブルから見つかったユーザの `id` を返すようにしています。元の実装では、代わりにユーザ名を返すようになっていました。`username` と `id` プロパティはともにユーザセッションに保存され、コードのどこからでも `Yii::app()->user` でアクセスすることが可能です。
-> Tip|ヒント: `UserIdentity` クラスにおいて、対応するクラスファイルを読み込むことなく [CUserIdentity] を参照しています。 これは [CUserIdentity] が Yii framework のコアクラスであるためです。Yii は任意のコアクラスが最初に参照されたときに、自動的にそのクラスファイルを読み込みます。
+> Tip|ヒント: `UserIdentity` クラスにおいては、対応するクラスファイルを明示的に読み込むことなく [CUserIdentity] を参照しています。 これは [CUserIdentity] が Yii framework のコアクラスであるためです。Yii は任意のコアクラスが最初に参照されたときに、自動的にそのクラスファイルを読み込みます。
>
->`User` クラスでも同じことが行われています。 なぜなら、 `User` クラスファイルが`/wwwroot/blog/protected/models` ディレクトリ以下にあり、アプリケーション初期構成の下記コードで PHP の `include_path` に追加されているからです。
+>`User` クラスでも同じことが行われています。 なぜなら、`User` クラスファイルが `/wwwroot/blog/protected/models` ディレクトリ以下にあり、そのディレクトリがアプリケーション初期構成の下記コードで PHP の `include_path` に追加されているからです。
>
> ~~~
> [php]
@@ -84,9 +86,9 @@ class User extends CActiveRecord
> );
> ~~~
>
-> 上記の初期構成は `/wwwroot/blog/protected/models` か `/wwwroot/blog/protected/components` の下にある、いかなるクラスファイルも、最初に参照された時点で自動的に読み込まれることを示します
+> 上記の初期構成は `/wwwroot/blog/protected/models` か `/wwwroot/blog/protected/components` の下にクラスファイルがある全てのクラスは、最初にクラスが参照された時点で自動的に読み込まれることを示します
-`UserIdentity` クラスは主に `LoginForm` クラスで、ログインページにで入力されたユーザ名とパスワードを元にユーザを認証するために使われます。以下コードではどのように `UserIdentity` が使われるのかを示します。
+`UserIdentity` クラスは主に `LoginForm` クラスで、ログインページで入力されたユーザ名とパスワードを元にユーザを認証するために使われます。以下のコード断片で、`UserIdentity` がどのように使われるのかを示します。
~~~
[php]
@@ -101,8 +103,8 @@ switch($identity->errorCode)
}
~~~
-> Info|情報: identity クラスと `user` アプリケーションコンポーネントはしばしば混同されます。前者は認証を行う方法のことであり、後者は現在のユーザに関する情報をあらわします。アプリケーションがもてる`user`コンポーネントはひとつだけですが、identityクラスは複数持つことができます。identityクラスはどのような認証方法がサポートされるかによります。いったん認証されると、identityインスタンスから`user`コンポーネントへ情報が渡され、アプリケーション全体から`user`を用いてアクセス可能になります。
+> Info|情報: identity クラスと `user` アプリケーションコンポーネントはしばしば混同されます。前者は認証を行う方法のことであり、後者は現在のユーザに関する情報をあらわします。アプリケーションが持てる `user` コンポーネントは一つだけですが、identity クラスは、どのような認証方法をサポートするかによって、一つまたは複数のクラスを持つことができます。いったん認証が成功すれば、identity インスタンスから `user` コンポーネントへ認証の情報が渡され、アプリケーション全体から `user` を用いてアクセス可能になります。
-修正後の`UserIdentity`クラスを確認するため、ブラウザでURL`http://www.example.com/blog/index.php`にアクセスし、`tbl_user`テーブルのユーザ名とパスワードでログインしてみてください。[ブログデモ](http://www.yiiframework.com/demos/blog/)で提供されるデータベースを利用した場合、ユーザ名`demo`、パスワード`demo`でアクセスできるはずです。このブログシステムにはユーザ管理機能はありません。そのため、ユーザはウェブインタフェースで、自身のアカウントを変更したり、新しいアカウントを作成出来ません。ユーザ管理機能はブログアプリケーションの将来の機能拡張として検討されるでしょう
+修正後の `UserIdentity` クラスをテストするために、ブラウザで URL `http://www.example.com/blog/index.php` にアクセスして、`tbl_user` テーブルに保存したユーザ名とパスワードでログインを試みてください。[ブログデモ](http://www.yiiframework.com/demos/blog/) で提供されるデータベースを利用している場合は、ユーザ名 `demo`、パスワード `demo` でアクセスできるはずです。このブログシステムにはユーザ管理機能が無いことに注意して下さい。結果として、ユーザはウェブインタフェースを通じて自身のアカウントを変更したり、新しいアカウントを作成したりは出来ません。ユーザ管理機能はブログアプリケーションの将来の機能拡張であると見なして良いでしょう
-<div class="revision">$Id: prototype.auth.txt 2333 2009-02-18 19:29:48Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
73 docs/blog/ja/prototype.database.txt
@@ -1,61 +1,64 @@
データベースのセットアップ
===================
-スケルトンアプリケーションを作り、データベースの設計が終わりました。 このセクションでは実際にブログデータベースを作成し、スケルトンアプリケーションとの接続を確立します
+スケルトンアプリケーションを作り、データベースの設計が終りました。 このセクションではブログデータベースを作成し、スケルトンアプリケーションの中でデータベースとの接続を確立します
データベースの作成
-----------------
- データベースはSQLiteを使います。 Yiiのデータベースサポートは [PDO](http://www.php.net/manual/en/book.pdo.php) の上に構築されているため、 アプリケーションコードを変更することなく、MySQLやPostgreSQLといった異なるDBMSを利用することができます
+データベースは SQLite を使うことにします。 Yii のデータベースサポートは [PDO](http://www.php.net/manual/en/book.pdo.php) の上に構築されているため、 アプリケーションコードを変更することなく、MySQL や PostgreSQL といった異なる DBMS を利用することができます
-ディレクトリ`/wwwroot/blog/protected/data`にデータベースファイル`blog.db`を作ります
-ディレクトリとファイルはともにWebサーバプロセスからSQLiteを通して書き込み可能である必要があります
-ここでは単に `/wwwroot/yii/demos/blog/protected/data/blog.db` にあるブログデモのデータベースファイルをコピーすることにします
-もしくは `/wwwroot/yii/demos/blog/protected/data/schema.sqlite.sql` にある、SQLファイルを実行することでもデータベースを生成できます
+ディレクトリ `/wwwroot/blog/protected/data` にデータベースファイル `blog.db` を作成します
+SQLite による要求として、ディレクトリとデータベースファイルの両方が Web サーバプロセスから書き込み可能である必要がある、ということに注意して下さい
+このデータベースの作成は、インストールされた Yii のブログデモから、データベースファイルをコピーしてくるだけで構いません。データベースファイルは `/wwwroot/yii/demos/blog/protected/data/blog.db` にあります
+または、`/wwwroot/yii/demos/blog/protected/data/schema.sqlite.sql` というファイルにある SQL 文を実行してデータベースを生成することも出来ます
-> Tip|ヒント: SQL文の実行には、 `sqlite3` コマンドラインツールを利用できます。 詳しくは [SQLite 公式ウェブサイト](http://www.sqlite.org/download.html)を参照してください。
+> Tip|ヒント: SQL 文の実行には、[SQLite 公式ウェブサイト](http://www.sqlite.org/download.html) にある `sqlite3` コマンドラインツールを利用できます。
-データベースとの接続を確立する
+データベース接続を確立する
--------------------------------
-作ったスケルトンアプリケーションでブログデータベースを使うには、`/wwwroot/blog/protected/config/main.php` に保存されている PHP スクリプトで[アプリケーション初期構成](http://www.yiiframework.com/doc/guide/ja/basics.application#application-configuration) を変更する必要があります。
-このスクリプトはキーと値のペアで構成された連想配列を返します。 これらの値は[アプリケーションインスタンス](http://www.yiiframework.com/doc/guide/ja/basics.application)を初期化するために使われます
+作ったスケルトンアプリケーションでブログデータベースを使うには、`/wwwroot/blog/protected/config/main.php` という PHP スクリプトに保存されている [アプリケーション初期構成](http://www.yiiframework.com/doc/guide/ja/basics.application#sec-2) を変更する必要があります。
+このスクリプトは "名前-値" のペアで構成された連想配列を返します。これらの値は [アプリケーションインスタンス](http://www.yiiframework.com/doc/guide/ja/basics.application) の書き込み可能なプロパティを初期化するために使われます
-`db`コンポーネントを以下のように構成します。
+`db` コンポーネントを以下のように構成します。
~~~
[php]
return array(
- ......
- 'components'=>array(
- ......
- 'db'=>array(
- 'connectionString'=>'sqlite:/wwwroot/blog/protected/data/blog.db',
- 'tablePrefix'=>'tbl_',
- ),
- ),
- ......
+ ......
+ 'components'=>array(
+ ......
+ 'db'=>array(
+ 'connectionString'=>'sqlite:/wwwroot/blog/protected/data/blog.db',
+ 'tablePrefix'=>'tbl_',
+ ),
+ ),
+ ......
);
~~~
-上記の設定は、`db` [アプリケーションコンポーネント](http://www.yiiframework.com/doc/guide/ja/basics.application#application-component)の`connectionString` プロパティが `sqlite:/wwwroot/blog/protected/data/blog.db` に初期化されることを示します
+上記の設定は、このアプリケーションが `db` [アプリケーションコンポーネント](http://www.yiiframework.com/doc/guide/ja/basics.application#sec-4) を持っており、その `connectionString` プロパティが `sqlite:/wwwroot/blog/protected/data/blog.db` として初期化されるべきこと、および、`tablePrefix` プロパティが `tbl_` であるべきことを示しています
-この設定の場合、コードのどこからでも、`Yii::app()->db` を通じて DB コネクションオブジェクトにアクセスすることができます
+この設定によって、アプリケーションのコードのどこからでも `Yii::app()->db` を通じて DB 接続オブジェクトにアクセスすることができます
`Yii::app()` は、エントリスクリプトで作成されたアプリケーションインスタンスを返すことに注意して下さい。
-DB コネクションのメソッドやプロパティに興味があれば、[クラスリファレンス|CDbConnection]を参照して下さい。
-しかし、多くの場合このDBコネクションを直接利用することはありません。
-そのかわりにいわゆる [ActiveRecord](http://www.yiiframework.com/doc/guide/ja/database.ar) を利用してデータベースにアクセスします。
-
-構成ファイルで設定した`tablePrefix`プロパティについて、もう少し説明したいと思います。
-これはデータベーステーブル名のプレフィクスとして`tbl_`を使用することを`db`コネクションオブジェクトに伝えます。
-具体的には、もしSQL文のなかにトークンがあり、それが二重波括弧(例えば`{{post}}`)で囲まれていた場合、`db`コネクションは
-実行のためにDBMSに送信する前にそれをテーブルプレフィクスを付けた名前(例えば`tbl_post`)に変換します。
-この機能は、もし将来テーブルプレフィクスを変更することになっても、ソースコードを触る必要がないため非常に有用です。
-例えば、コンテンツ管理システム(CMS)を開発しており、それが新しい環境にインストールされる場合に、ユーザはテーブルプレフィクスを自由に選択することが可能となります。
-
-> Tip|ヒント: もしSQLiteではなくMySQLをデータ格納に使う場合には、`blog`という名前のMySQLデータベースを、`/wwwroot/yii/demos/blog/protected/data/schema.mysql.sql`を使用して作成します。その後、アプリケーション構成ファイルを以下のように修正します。
+DB 接続が持つことができるメソッドやプロパティに興味があれば、[クラスリファレンス|CDbConnection] を参照して下さい。
+しかし、多くの場合、この DB 接続を直接に利用することはありません。
+その代りに、いわゆる [アクティブレコード](http://www.yiiframework.com/doc/guide/ja/database.ar) を使ってデータベースにアクセスします。
+
+構成ファイルで設定した `tablePrefix` プロパティについて、もう少し説明したいと思います。
+これはデータベーステーブル名のプレフィクスとして `tbl_` を使用していることを `db` 接続オブジェクトに伝えます。
+具体的には、もし SQL 文の中に二重波括弧で囲まれたトークンがある場合(例えば `{{post}}`)、`db` 接続は
+それをテーブルプレフィクスを付けた名前(例えば `tbl_post`)に変換してから、DBMS に送信して実行させます。
+この機能は、将来テーブルプレフィクスを変更する必要が生じた場合でもソースコードを触る必要がない、という点で非常に有用です。
+例えば、汎用のコンテンツ管理システム(CMS)を開発する場合、この機能を利用すると、CMS を新しい環境にインストールするときに
+ユーザがテーブルプレフィクスを自由に選択できるようにすることが出来ます。
+
+> Tip|ヒント: もし SQLite ではなく MySQL をデータの格納に使いたい場合には、
+> `/wwwroot/yii/demos/blog/protected/data/schema.mysql.sql` の SQL 文を使用して、`blog` という名前の MySQL データベースを作成することが出来ます。
+> そして、アプリケーション初期構成ファイルを以下のように修正します。
>
> ~~~
> [php]
@@ -77,4 +80,4 @@ DB コネクションのメソッドやプロパティに興味があれば、[
> ~~~
-<div class="revision">$Id: prototype.database.txt 2332 2009-02-16 05:20:17Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
119 docs/blog/ja/prototype.scaffold.txt
@@ -1,102 +1,103 @@
-スキャフォールディング
+スキャフォールディング(足場組み)
===========
-作成、読み出し、更新、そして削除 (CRUD) はアプリケーションにおけるデータオブジェクトに対する4つの基本操作です。
-ウェブアプリケーション開発において、CRUDオペレーションを実装するタスクは共通であるため、Yiiは*Gii*という名前でコード生成ツールを提供し、それはこのプロセス(*スキャフォールディング*としても知られる)を自動化できます。
+作成(Create)、読み出し(Read)、更新(Update)、削除(Delete) といういわゆる CRUD は、アプリケーションでのデータオブジェクトに対する4つの基本操作です。
+ウェブアプリケーション開発において CRUD 操作を実装するタスクが必要になるのは、きわめて普通のことです。
+そのため、この CRUD 操作を実装するプロセス (**スキャフォールディング(足場組み)** とも呼ばれます) を自動化するために、Yii は **Gii** という名前のもとに、いくつかのコード生成ツールを提供しています。
-> Note|注: Giiは1.1.2版から利用可能です。それまではこの目的には[yiicシェルツール](http://www.yiiframework.com/doc/guide/ja/quickstart.first-app-yiic)を使用する必要があります
+> Note|注意: Gii は、バージョン 1.1.2 から利用可能です。それまでは、この目的には [yiicシェルツール](http://www.yiiframework.com/doc/guide/ja/quickstart.first-app-yiic) を使用する必要がありました
-以降では、ブログアプリケーションの記事やコメントのCRUDオペレーションをこのツールにより実装する方法を紹介します
+以降では、ブログアプリケーションの記事とコメントの CRUD 操作をこのツールによって実装する方法を紹介します
-Giiのインストール
+Gii のインストール
--------------
-最初にGiiをインストールする必要があります。ファイル`/wwwroot/blog/protected/config/main.php`を開き、以下のコードを追加してください。
+最初に Gii をインストールする必要があります。ファイル `/wwwroot/blog/protected/config/main.php` を開き、以下のコードを追加してください。
~~~
[php]
return array(
- ......
- 'import'=>array(
- 'application.models.*',
- 'application.components.*',
- ),
-
- 'modules'=>array(
- 'gii'=>array(
- 'class'=>'system.gii.GiiModule',
- 'password'=>'pick up a password here',
- ),
- ),
+ ......
+ 'import'=>array(
+ 'application.models.*',
+ 'application.components.*',
+ ),
+
+ 'modules'=>array(
+ 'gii'=>array(
+ 'class'=>'system.gii.GiiModule',
+ 'password'=>'pick up a password here',
+ ),
+ ),
);
~~~
-上記のコードは`gii`という名のモジュールをインストールし、それは以下のURLをブラウザに入力することでアクセスすることができます
+上記のコードが `gii` という名のモジュールをインストールします。これによって、以下の URL をブラウザに入力して Gii モジュールにアクセスすることが出来るようになります
~~~
http://www.example.com/blog/index.php?r=gii
~~~
-パスワード入力が指示されます。`/wwwroot/blog/protected/config/main.php`であらかじめ指定したパスワードを入力することにより、全ての利用可能なコード生成ツールがリストされたページが表示されます
+パスワードを入力するように指示されますので、`/wwwroot/blog/protected/config/main.php` であらかじめ設定しておいたパスワードを入力して下さい。すると、利用可能な全てのコード生成ツールがリストされたページが表示されます
-> Note|注: 上記コードは製品機械においては取り除くべきです。コード生成ツールは開発機械でのみ使われるべきです
+> Note|注意: Yii を実運用マシンで走らせる場合は、上記コードは削除すべきです。コード生成ツールは開発マシンでのみ使用すべきです
モデルの作成
---------------
-最初にそれぞれのデータベーステーブルの[モデル](http://www.yiiframework.com/doc/guide/ja/basics.model)クラスを作成する必要があります。このチュートリアルの後半に表れるように、モデルクラスによって直観的なオブジェクト指向のやり方でデータベースにアクセスすることができます
+最初に、それぞれのデータベーステーブルに対して [モデル](http://www.yiiframework.com/doc/guide/ja/basics.model) クラスを作成する必要があります。このチュートリアルを読み進むと分るように、モデルクラスによって直観的なオブジェクト指向のやり方でデータベースにアクセスすることが出来るようになります
-モデル生成ツールを使用するためには、`モデルジェネレータ`リンクをクリックしてください
+`Model Generator` リンクをクリックして、モデル生成ツールの使用を開始してください
-`モデルジェネレータ`ページでは、`Table Name`フィールドに`tbl_user` (ユーザテーブル名)、`Table Prefix`フィールドに`tbl_`と入力し、`プレビュー`ボタンを押します。
-プレビューテーブルが表れます。テーブルのリンクをクリックすることで、生成されるコードをプレビューすることができます。
-もし、全てがOKであれば、`生成`ボタンを押すことによりコードを生成し、ファイルに保存することができます
+`Model Generator` ページで、`Table Name` フィールドに `tbl_user` (ユーザテーブル名)、`Table Prefix` フィールドに `tbl_` と入力し、`Preview` ボタンを押します。
+すると、プレビューテーブルが表示されます。テーブル内のリンクをクリックすることで、生成されるコードをプレビューすることができます。
+もし、全てが OK であれば、`Generate` ボタンを押すことによりコードを生成してファイルに保存することができます
-> Info|情報: コードジェネレータは生成されたコードをファイルに保存する必要があるので、ウェブプロセスから対応するファイルを生成し、更新するためのパーミッションが必要になります
-簡単のため、`/wwwroot/blog`ディレクトリ全体をウェブプロセスから書込み可能とすることがあります。これは`Gii`を使用するときの開発マシンのみ必要であることに注意してください
+> Info|情報: コードジェネレータは生成されたコードをファイルに保存する必要があるため、ウェブプロセスが対応するファイルを生成・更新するパーミッションが必要になります
+手っ取り早い方法として、`/wwwroot/blog` ディレクトリ全体をウェブプロセスから書込み可能にしても構いません。ただし、これは開発マシンで `Gii` を使用するときのみ必要であることに注意してください
-残りのデータベーステーブル、つまり`tbl_post``tbl_comment``tbl_tag``tbl_lookup`について同じステップを繰り返します
+残りのデータベーステーブル (`tbl_post`, `tbl_comment`, `tbl_tag`, `tbl_lookup`) について、同じ手順を繰り返します
-> Tip|ヒント: アスタリスクキャラクタ'\*'を`Table Name`フィールドに入力することが可能です。これにより一発で、*全ての*データベーステーブルのモデルクラスが生成されます。
+> Tip|ヒント: `Table Name`フィールドにアスタリスク '\*' を入力することも可能です。これにより一発で、**全ての** データベーステーブルのモデルクラスが生成されます。
-この段階において、新しく生成されたファイルは以下のとおりです
+この段階において、以下のファイルが新しく生成されています
- * `models/User.php`ファイルは[CActiveRecord]を継承する`User`クラスを含みます。このクラスは`tbl_user`データベーステーブルにアクセスするのに使われます。
- * `models/Post.php`ファイルは[CActiveRecord]を継承する`Post`クラスを含みます。このクラスは`tbl_post`データベーステーブルにアクセスするのに使われます。
- * `models/Tag.php`ファイルは[CActiveRecord]を継承する`Tag`クラスを含みます。このクラスは`tbl_tag`データベーステーブルにアクセスするのに使われます。
- * `models/Comment.php`ファイルは[CActiveRecord]を継承する`Comment`クラスを含みます。このクラスは`tbl_comment`データベーステーブルにアクセスするのに使われます。
- * `models/Lookup.php`ファイルは[CActiveRecord]を継承する`Lookup`クラスを含みます。このクラスは`tbl_lookup`データベーステーブルにアクセスするのに使われます。
+ * `models/User.php`[CActiveRecord] を継承する `User` クラスを含みます。このクラスは `tbl_user` データベーステーブルにアクセスするのに使われます。
+ * `models/Post.php`[CActiveRecord] を継承する `Post` クラスを含みます。このクラスは `tbl_post` データベーステーブルにアクセスするのに使われます。
+ * `models/Tag.php`[CActiveRecord] を継承する `Tag` クラスを含みます。このクラスは `tbl_tag` データベーステーブルにアクセスするのに使われます。
+ * `models/Comment.php`[CActiveRecord] を継承する `Comment` クラスを含みます。このクラスは `tbl_comment` データベーステーブルにアクセスするのに使われます。
+ * `models/Lookup.php`[CActiveRecord] を継承する `Lookup` クラスを含みます。このクラスは `tbl_lookup` データベーステーブルにアクセスするのに使われます。
-CRUDオペレーションの実装
+CRUD 操作の実装
----------------------------
-モデルクラスが生成された後は、これらのモデルについてCRUDオペレーションを実装するコードを生成する`Crudジェネレータ`が使用可能です。
-`Post``Comment`モデルについてこれを行います
+モデルクラスが生成された後は、これらのモデルについて CRUD 操作を実装するコードを生成する `Crud Generator` が使用可能です。
+`Post``Comment` のモデルについてこれを行います
-`Crudジェネレータ`のページにおいて、`Post`(たった今作成した記事のモデルクラス名)を`Model Class`フィールドに入力し`Preview`ボタンを押します。たくさんのファイルが生成されるのが見られます。それらを生成するために`生成`ボタンを押します
+`Crud Generator` のページにおいて、`Model Class` フィールドに `Post`(たった今作成した記事のモデルクラス名)を入力し、`Preview` ボタンを押します。すると、たくさんのファイルが生成されることになるのが分ります。`Generate` ボタンを押して、それらを生成して下さい
-`Comment`モデルについても同じステップを繰り返します
+`Comment` モデルについても同じ手順を繰り返します
-CRUDジェネレータによって生成されたファイルを見てみましょう。全てのファイルは`/wwwroot/blog/protected`以下に生成されます。
-便宜上それらのファイルを[コントローラ](http://www.yiiframework.com/doc/guide/ja/basics.controller)ファイルと[ビュー](http://www.yiiframework.com/doc/guide/ja/basics.view)ファイルに分類します。
+CRUD ジェネレータによって生成されたファイルを見てみましょう。全てのファイルは `/wwwroot/blog/protected` 以下に生成されます。
+便宜上、それらのファイルを [コントローラ](http://www.yiiframework.com/doc/guide/ja/basics.controller) ファイルと [ビュー](http://www.yiiframework.com/doc/guide/ja/basics.view) ファイルに分類します。
- コントローラファイル:
- * `controllers/PostController.php`ファイルは`PostController`クラスを含みます。このコントローラは記事のCRUD操作を受け持ちます
- * `controllers/CommentController.php`ファイルは`CommentController`クラスを含みます。このコントローラはコメントのCRUD 操作を受け持ちます。
+ * `controllers/PostController.php``PostController`クラスを含みます。このコントローラは記事の CRUD 操作を受け持ちます
+ * `controllers/CommentController.php``CommentController` クラスを含みます。このコントローラはコメントの CRUD 操作を受け持ちます。
- ビューファイル:
- * `views/post/create.php`ファイルは新しい記事を作るHTMLフォームのビューファイルです
- * `views/post/update.php`ファイルは記事の更新を行うHTMLフォームのビューファイルです
- * `views/post/view.php`ファイルは記事の詳細情報を表示するビューファイルです
- * `views/post/index.php`ファイルは記事のリストを表示するビューファイルです
- * `views/post/admin.php`ファイルは管理コマンドと一緒に表形式で記事を表示するビューファイルです
- * `views/post/_form.php`ファイルは部分ビューファイルであり`views/post/create.php``views/post/update.php`に埋め込まれます。これは記事情報を集めるHTMLフォームを表示します
- * `views/post/_view.php`ファイルは部分ビューファイルであり`views/post/index.php`で使用されます。これは単一の記事の簡単なビューを表示します。
- * `views/post/_search.php`ファイルは部分ビューファイルであり`views/post/admin.php`で使用されます。検索フォームを表示します。
+ * `views/post/create.php` は新しい記事を作る HTML フォームを表示するビューファイルです
+ * `views/post/update.php` は記事の更新を行う HTML フォームを表示するビューファイルです
+ * `views/post/view.php` は記事の詳細情報を表示するビューファイルです
+ * `views/post/index.php` は記事のリストを表示するビューファイルです
+ * `views/post/admin.php` は管理コマンドと一緒に表形式で記事を表示するビューファイルです
+ * `views/post/_form.php` は部分ビューファイルであり `views/post/create.php``views/post/update.php` に埋め込まれます。これは記事情報を入力する HTML フォームを表示します
+ * `views/post/_view.php` は部分ビューファイルであり `views/post/index.php` で使用されます。これは単一の記事の簡単なビューを表示します。
+ * `views/post/_search.php` は部分ビューファイルであり `views/post/admin.php` で使用されます。検索フォームを表示します。
* 同様のビューファイル一式がコメント用にも生成されます。
試験
@@ -109,15 +110,15 @@ http://www.example.com/blog/index.php?r=post
http://www.example.com/blog/index.php?r=comment
~~~
-自動生成されたコードによる記事とコメントの機能は、それぞれ完全に独立していることに注意してください。また、新しい記事やコメントを作る際に、`authId`や`createTime`といった情報を入力する必要があります。これらの情報は実際のアプリケーションではプログラムによって設定するべきです。しかし心配することはありません。次のマイルストーンでこれらの問題を解決します。今のところは、このプロトタイプがブログアプリケーションに必要なほぼすべての機能をそなえていることに、それなりに満足すべきでしょう。
+自動生成されたコードによる記事とコメントの機能は、お互いに完全に独立していることに注意してください。また、新しい記事やコメントを作成する際に、`author_id` や `create_time` といった情報を入力するように要求されます。これらの情報は実際のアプリケーションではプログラムによって設定されるべきものです。しかし心配することはありません。次のマイルストーンでこれらの問題を解決します。今のところは、このプロトタイプがブログアプリケーションに必要なほぼすべての機能をそなえていることに、それなりに満足すべきでしょう。
上記ファイルがどう使われるかをよりよく理解するために、ブログアプリケーションで記事の一覧が表示される場合のワークフローを示します。
- 0. ユーザがURL `http://www.example.com/blog/index.php?r=post`を要求します
- 1. ウェブサーバにより [エントリスクリプト](http://www.yiiframework.com/doc/guide/ja/basics.entry) が実行され、[アプリケーション](http://www.yiiframework.com/doc/guide/ja/basics.application)インスタンスが作成・初期化された後、リクエストを処理します
+ 0. ユーザが URL `http://www.example.com/blog/index.php?r=post` をリクエストします
+ 1. ウェブサーバにより [エントリスクリプト](http://www.yiiframework.com/doc/guide/ja/basics.entry) が実行され、リクエストを処理するために、[アプリケーション](http://www.yiiframework.com/doc/guide/ja/basics.application) インスタンスが作成され初期化されます
2. アプリケーションは `PostController` のインスタンスを作成し、実行します。
- 3. `PostController` インスタンスは要求された `index` アクションを、`actionIndex()` メソッドを呼ぶことで実行します。もしユーザがアクションを明示的にURL中で示さなければ、`index`がデフォールトのアクションとなります
+ 3. `PostController` インスタンスは要求された `index` アクションを、`actionIndex()` メソッドを呼ぶことで実行します。ユーザがアクションを明示的に URL 中で示さなかった場合、`index` がデフォルトのアクションとなることに注意して下さい
4. `actionIndex()` メソッドはデータベースに問い合わせを行い、最近の記事リストを取り出します。
5. `actionIndex()` メソッドは、記事データを `index` ビューで描画します。
-<div class="revision">$Id: prototype.scaffold.txt 3332 2011-06-28 20:07:38Z alexander.makarow $</div>
+<div class="revision">$Id$</div>
View
15 docs/blog/ja/prototype.summary.txt
@@ -7,15 +7,16 @@
2. Yii フレームワークをインストールしました
3. スケルトンアプリケーションを作成しました
4. ブログデータベースを設計し、作成しました
- 5. データベースと接続できるようアプリケーション初期設定を変更しました
- 6. 記事とコメントの基本CRUD操作ができるようコードを実装しました
- 7. 認証メソッドを変更し、`tbl_user` テーブルに対してチェックするように変更しました
+ 5. アプリケーション初期設定を変更して、データベースとの接続を追加しました
+ 6. 記事とコメントの両方について、基本的 CRUD 操作を実装するコードを生成しました
+ 7. `tbl_user` テーブルに対してチェックするように認証メソッドを変更しました
-新しいプロジェクトでは、多くの場合、この最初のマイルストーン 1 から 4 の手順をこなすことになるでしょう
+新しいプロジェクトでは、この最初のマイルストーンでは 1 4 のステップに大半の時間を費やすことになるでしょう
-`gii` ツールによって生成されたコードは、データベーステーブルのための完全な CRUD 操作機能を実装しますが、実際に利用する際にはしばしば、変更する必要があります。この理由から、次の2つのマイルストーンでは、初期の要求を満たすように、投稿とコメントについて発生する CRUD コードをカスタマイズします。
+`gii` ツールによって生成されたコードは、データベーステーブルのための完全に機能する CRUD 操作を実装しますが、実際のアプリケーションで利用するためには、かなりの変更を加える必要があります。
+この理由から、次の二つのマイルストーンでは、記事とコメントに対して生成した CRUD コードをカスタマイズして、初期の要求を満たすようにします。
-一般的には、最初に[モデル](http://www.yiiframework.com/doc/guide/ja/basics.model)クラスファイルで、適切な[バリデーション](http://www.yiiframework.com/doc/guide/ja/form.model#declaring-validation-rules)ルールを加え、[リレーションオブジェクト](http://www.yiiframework.com/doc/guide/ja/database.arr#declaring-relationship)を宣言する変更を行います。その後、それぞれの CRUD 操作のために[コントローラアクション](http://www.yiiframework.com/doc/guide/ja/basics.controller)[ビュー](http://www.yiiframework.com/doc/guide/ja/basics.view)コードを変更します
+一般的には、最初に [モデル](http://www.yiiframework.com/doc/guide/ja/basics.model) クラスファイルを修正して、適切な [検証ルール](http://www.yiiframework.com/doc/guide/ja/form.model#sec-3) を加え、[リレーショナルオブジェクト](http://www.yiiframework.com/doc/guide/ja/database.arr#sec-2) を宣言します。その後、それぞれの CRUD 操作のために [コントローラアクション](http://www.yiiframework.com/doc/guide/ja/basics.controller)[ビュー](http://www.yiiframework.com/doc/guide/ja/basics.view) のコードを変更します
-<div class="revision">$Id: prototype.summary.txt 2333 2009-02-16 05:20:17Z qiang.xue $</div>
+<div class="revision">$Id$</div>
View
60 docs/blog/ja/start.design.txt
@@ -1,59 +1,55 @@
全体の設計
==============
-要求分析によると、このブログアプリケーションの永続データを保存するために以下のデータベーステーブルを使うことにします。
+要求分析に基づいて、このブログアプリケーションの永続データを保存するために以下のデータベーステーブルを使うことにします。
* `tbl_user` はユーザ名、パスワードを含むユーザ情報を格納します。
* `tbl_post` は記事情報を格納します。主に以下のカラムから成ります:
- - `title`: 必須、記事のタイトル
- - `content`: 必須、[Markdown フォーマット](http://daringfireball.net/projects/markdown/syntax)で記述された記事の本文
- - `status`: 必須、記事のステータス(公開状態)。以下のいずれかの値をとる
- * 1, 記事は草稿で、公開されていない
- * 2, 記事は公開されている
+ - `title`: 必須、記事のタイトル
+ - `content`: 必須、[Markdown フォーマット](http://daringfireball.net/projects/markdown/syntax) で記述された記事の本文
+ - `status`: 必須、記事のステータス(公開状態)。以下のいずれかの値をとる
+ * 1, 記事は下書きで、公開されていない
+ * 2, 記事は公開されている
* 3, 記事は公開期間を過ぎ、記事リストには現れない(しかし個別のアクセスによる表示は可能)
- - `tags`: オプション、記事をカテゴリ化するためのカンマ区切りの単語のリスト
- * `tbl_comment` 記事へのコメントを格納します。各コメントは記事と関連付けられ、主に以下のカラムから成る:
+ - `tags`: オプション、記事をカテゴリ化するためのカンマ区切りの単語のリスト
+ * `tbl_comment` 記事へのコメント情報を格納します。各コメントは一つの記事と関連付けられ、主に以下のカラムから成ります:
- `author`: 必須、コメント作成者名
- `email`: 必須、コメント作成者のメールアドレス
- - `url`: オプション、コメント作成者のウェブサイトのURL
- - `content`: 必須、[Markdown フォーマット](http://daringfireball.net/projects/markdown/syntax)で記述されたコメントの内容。
- - `status`: 必須、コメントが承認された(値2)もしくは未承認(値1)のいずれかの値をとるコメントのステータス(公開状態)。
- * `tbl_tag` はタグ頻度情報を格納しタグクラウド機能により使用される。このテーブルは主に以下のカラムから成る:
+ - `url`: オプション、コメント作成者のウェブサイトの URL
+ - `content`: 必須、プレーンテキストで記述されたコメントの内容
+ - `status`: 必須、コメントのステータス(公開状態)。コメントが承認された(値は2)か、未承認(値は1)かを示す
+ * `tbl_tag` は、タグクラウド機能を実装するために必要な、記事のタグ頻度情報を格納します。このテーブルは主に以下のカラムから成ります:
- `name`: 必須、ユニークなタグ名
- - `frequency`: 必須、タグが記事に出現する数
- * `tbl_lookup` はルックアップ情報を格納します。本質的には整数値とテキストのマッピングを表します
+ - `frequency`: 必須、タグが記事に出現する回数
+ * `tbl_lookup` は汎用のルックアップ情報を格納します。これは本質的には整数値とテキストのマッピングです
前者はコード中のデータ表現であり、後者は対応するエンドユーザのための表現です。
-例えば、整数値1を記事のドラフト状態を表すものとして使用しますが、エンドユーザに表示するテキストは`Draft`となります。このテーブルは主に以下のカラムから成ります:
- - `name`: データのエンドユーザに表示するためのテキスト的な表現
- - `code`: データの整数値表現
- - `type`: データの型
- - `position`: 同種の項目の中での相対的な位置
+例えば、整数値1を記事が下書きであることを表すものとして使用しますが、エンドユーザに表示するテキストは `下書き` となります。このテーブルは主に以下のカラムから成ります:
+ - `name`: データ項目のテキスト表現(エンドユーザに向けて表示)
+ - `code`: データ項目の整数値表現
+ - `type`: データ項目の型
+ - `position`: 同じ型のデータ項目の中での相対的な表示順序
以下の ER 図が上記のテーブルのテーブル構造とリレーションをあらわします。
-![ブログデータベースのER図](schema.png)
+![ブログデータベースの ER 図](schema.png)
-ER図をSQL文にしたものが、ブログデモに含まれています。
+上記 ER 図に対応する完全な SQL 文が [ブログデモ](http://www.yiiframework.com/demos/blog/) に付属しています。
+Yii のインストールディレクトリの中では `/wwwroot/yii/demos/blog/protected/data/schema.sqlite.sql` というファイルにあります。
-上記 ER 図に対応する完全な SQL 文は [ブログデモ](http://www.yiiframework.com/demos/blog/) で見つけられるでしょう。
-Yiiのインストールディレクトリの中では`/wwwroot/yii/demos/blog/protected/data/schema.sqlite.sql`にあります。
-
-
-
-> Info|情報: テーブル名とカラム名は全て小文字で命名します。これは異るDBMSはしばしば異るケースセンシビティを持つため、このようなトラブルを辟けるためです。
+> Info|情報: テーブル名とカラム名は全て小文字で命名します。これは、異る DBMS はしばしば異るケースセンシティビティを持つからであり、それによるトラブルを避けたいためです。
>
-> 全てのテーブルに`tbl_`というプレフィクスを付けています。これには2つの目的があります
-第1に、プレフィクスは名前空間を導入し、同じデータベースで他のテーブルと共存ができます
+> 同時に、全てのテーブルに `tbl_` というプレフィクスを付けています。これには二つの目的があります
+第一に、同じデータベースで他のテーブルと共存する必要があるときには、プレフィクスでテーブルに名前空間を導入することが解決策となります
これは共用ホスティング環境で、複数のアプリケーションが単一のデータベースを使用する場合にしばしば見られます。
-第2に、プレフィクスを用いればDBMSの予約語と同じテーブル名を使う可能性が低くなります
+第二に、プレフィクスを用いれば DBMS の予約語と同じテーブル名を使う可能性が低くなります
-ブログアプリケーション開発を、以下のマイルストーンに分割します。
+ブログアプリケーションの開発を、以下のマイルストーンに分割します。
* マイルストーン 1: ブログシステムのプロトタイプを作成します。必要な機能のほとんどを含みます。
* マイルストーン 2: 記事の投稿機能を完成させます。記事の作成、リスト表示、記事の表示、更新、削除を含みます。
- * マイルストーン 3: コメント作成機能を完成させます。コメント作成、リスト表示、承認、更新、削除を含みます。
+ * マイルストーン 3: コメント管理機能を完成させます。コメントの作成、リスト表示、承認、更新、削除を含みます。
* マイルストーン 4: ポートレットを実装します。ユーザメニュー、ログイン、タグクラウド、最近のコメントを含みます。
* マイルストーン 5: 最終調整と配備を行います。
View
21 docs/blog/ja/start.overview.txt
@@ -1,16 +1,17 @@
-Yiiを使ってブログシステムを作る
+Yii を使ってブログシステムを作る
================================
-このチュートリアルでは、Yiiを用いてYiiリリースファイルに同梱されている[ブログデモ](http://www.yiiframework.com/demos/blog/)のようなブログアプリケーションをどのように開発するのかを説明します
-開発のステップを順を追って詳細に解説してあります
-ここで述べている内容は、他のウェブアプリケーションの開発においても有用でしょう
-[Yiiガイド](http://www.yiiframework.com/doc/guide/ja/)や、[クラスリファレンス](http://www.yiiframework.com/doc/api/)の補足として、 このチュートリアルでは、Yiiの実践的な使用法を紹介するのが目的です
+このチュートリアルは、Yii を使ってブログアプリケーションを開発する仕方を説明するものです
+例として使用する [ブログデモ](http://www.yiiframework.com/demos/blog/) は Yii リリースファイルに同梱されています
+開発において必要になる全てのステップを詳細に説明しますが、その内容は他のウェブアプリケーションの開発にも適用できるでしょう
+このチュートリアルは、[Yii ガイド](http://www.yiiframework.com/doc/guide/ja/)[クラスリファレンス](http://www.yiiframework.com/doc/api/) を補完するものであり、網羅的かつ完全な解説ではなく、Yii の実践的な使い方を示すことを目的とします
-このチュートリアルの読者は、前もってYiiについて知っている必要はありません
-しかし、オブジェクト指向プログラミング(OOP)と、データベースについての基礎知識があれば、このチュートリアルを理解するよい助けになるでしょう
+このチュートリアルの読者は、前もって Yii について知っている必要はありません
+しかし、オブジェクト指向プログラミング(OOP)とデータベースプログラミングについての基礎知識があれば、このチュートリアルをより一層容易に理解できるでしょう
-> Note|注意: このチュートリアルは、完全にステップ・バイ・ステップなガイドにはなっていません。エラーを修正したり、APIを調べたり、ガイドを読んだりしながら進めることになるでしょう。
+> Note|注意: このチュートリアルは、完全にステップバイステップなガイドにはなっていません。チュートリアルを進めるためには、
+出てくるエラーを修正したり、APIを調べたり、ガイドを読んだりする必要が出てくるでしょう。
-このチュートリアルは、[the Terms of Yii Documentation](http://www.yiiframework.com/doc/terms/)のもとでリリースされます。
+このチュートリアルは、[Yii ドキュメンテーション規約](http://www.yiiframework.com/doc/terms/) のもとでリリースされます。
-<div class="revision">$Id: start.overview.txt 3463 2011-11-25 19:22:38Z alexander.makarow $</div>
+<div class="revision">$Id$</div>
View
26 docs/blog/ja/start.requirements.txt
@@ -1,27 +1,27 @@
要求分析
=====================
-これから作成するブログシステムは、シングルユーザシステムです。 システムのオーナは以下のアクションを行えるものとします:
+これから作成するブログシステムは、シングルユーザシステムです。システムのオーナは以下のアクションを行えるものとします:
* ログインおよびログアウト
* 記事の作成、更新、削除
- * 記事の公開、未公開、アーカイブ化
- * コメントの公開と削除
+ * 記事の公開、非公開、アーカイブ化