Browse Source

Merge branch 'master' into docs-guide-ja-structure-revised

tags/2.0.1
Nobuo Kihara 10 years ago
parent
commit
66960342d9
  1. 33
      docs/guide-ja/README.md
  2. 13
      docs/guide-ja/images/application-lifecycle.graphml
  3. BIN
      docs/guide-ja/images/application-lifecycle.png
  4. 10
      docs/guide-ja/images/request-lifecycle.graphml
  5. BIN
      docs/guide-ja/images/request-lifecycle.png
  6. 169
      docs/guide-ja/intro-upgrade-from-v1.md
  7. 25
      docs/guide-ja/intro-yii.md
  8. 69
      docs/guide-ja/start-databases.md
  9. 61
      docs/guide-ja/start-forms.md
  10. 63
      docs/guide-ja/start-gii.md
  11. 42
      docs/guide-ja/start-hello.md
  12. 50
      docs/guide-ja/start-installation.md
  13. 9
      docs/guide-ja/start-looking-ahead.md
  14. 27
      docs/guide-ja/start-workflow.md
  15. 2
      docs/guide/README.md
  16. 311
      docs/guide/helper-array.md
  17. 2
      docs/guide/helper-overview.md
  18. 20
      docs/guide/input-file-upload.md
  19. 67
      docs/guide/output-data-widgets.md
  20. 11
      docs/guide/output-formatter.md
  21. 28
      docs/guide/output-theming.md
  22. 2
      docs/guide/security-authentication.md
  23. 14
      docs/internals/design-decisions.md
  24. 2
      framework/CHANGELOG.md
  25. 9
      framework/console/controllers/BaseMigrateController.php
  26. 10
      framework/console/controllers/MigrateController.php
  27. 2
      framework/i18n/Formatter.php
  28. 11
      framework/messages/fa-IR/yii.php

33
docs/guide-ja/README.md

@ -1,8 +1,7 @@
Yii 2.0 公式ガイド 決定版 Yii 2.0 ガイド
================== =====================
このチュートリアルは [Yii ドキュメント規約](http://www.yiiframework.com/doc/terms/) の下に このチュートリアルは [Yii ドキュメント規約](http://www.yiiframework.com/doc/terms/) の下にリリースされています。
リリースされています。
All Rights Reserved. All Rights Reserved.
@ -65,11 +64,11 @@ All Rights Reserved.
* [プロパティ](concept-properties.md) * [プロパティ](concept-properties.md)
* [イベント](concept-events.md) * [イベント](concept-events.md)
* [ビヘイビア](concept-behaviors.md) * [ビヘイビア](concept-behaviors.md)
* [コンフィギュレーション](concept-configurations.md) * [構成情報](concept-configurations.md)
* [エイリアス](concept-aliases.md) * [エイリアス](concept-aliases.md)
* [クラスのオートロード](concept-autoloading.md) * [クラスのオートロード](concept-autoloading.md)
* [サービスロケータ](concept-service-locator.md) * [サービスロケータ](concept-service-locator.md)
* [依存注入コンテナ](concept-di-container.md) * [依存注入コンテナ](concept-di-container.md)
データベースの取り扱い データベースの取り扱い
@ -102,8 +101,8 @@ All Rights Reserved.
* **TBD** [並べ替え](output-sorting.md) * **TBD** [並べ替え](output-sorting.md)
* [データプロバイダ](output-data-providers.md) * [データプロバイダ](output-data-providers.md)
* [データウィジェット](output-data-widgets.md) * [データウィジェット](output-data-widgets.md)
* [クライアントスクリプトを使](output-client-scripts.md) * [クライアントスクリプトを](output-client-scripts.md)
* [テーマを使う](output-theming.md) * [テーマ](output-theming.md)
セキュリティ セキュリティ
@ -169,7 +168,7 @@ RESTful ウェブサービス
* [国際化](tutorial-i18n.md) * [国際化](tutorial-i18n.md)
* [メール](tutorial-mailing.md) * [メール](tutorial-mailing.md)
* [パフォーマンスチューニング](tutorial-performance-tuning.md) * [パフォーマンスチューニング](tutorial-performance-tuning.md)
* **TBD** [共有ホスト環境](tutorial-shared-hosting.md) * [共有ホスト環境](tutorial-shared-hosting.md)
* [テンプレートエンジン](tutorial-template-engines.md) * [テンプレートエンジン](tutorial-template-engines.md)
* [サードパーティのコードを扱う](tutorial-yii-integration.md) * [サードパーティのコードを扱う](tutorial-yii-integration.md)
@ -177,14 +176,14 @@ RESTful ウェブサービス
ウィジェット ウィジェット
------------ ------------
* GridView: link to demo page * GridView: **TBD** link to demo page
* ListView: link to demo page * ListView: **TBD** link to demo page
* DetailView: link to demo page * DetailView: **TBD** link to demo page
* ActiveForm: link to demo page * ActiveForm: **TBD** link to demo page
* Pjax: link to demo page * Pjax: **TBD** link to demo page
* Menu: link to demo page * Menu: **TBD** link to demo page
* LinkPager: link to demo page * LinkPager: **TBD** link to demo page
* LinkSorter: link to demo page * LinkSorter: **TBD** link to demo page
* [Bootstrap ウィジェット](widget-bootstrap.md) * [Bootstrap ウィジェット](widget-bootstrap.md)
* [Jquery UI ウィジェット](widget-jui.md) * [Jquery UI ウィジェット](widget-jui.md)

13
docs/guide-ja/images/application-lifecycle.graphml

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yEd 3.13--> <!--Created by yEd 3.13-->
<key for="graphml" id="d0" yfiles.type="resources"/> <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
<key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d1" yfiles.type="portgraphics"/>
<key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d2" yfiles.type="portgeometry"/>
<key for="port" id="d3" yfiles.type="portuserdata"/> <key for="port" id="d3" yfiles.type="portuserdata"/>
<key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="url" attr.type="string" for="node" id="d4"/>
<key attr.name="description" attr.type="string" for="node" id="d5"/> <key attr.name="description" attr.type="string" for="node" id="d5"/>
<key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="node" id="d6" yfiles.type="nodegraphics"/>
<key attr.name="Description" attr.type="string" for="graph" id="d7"/> <key for="graphml" id="d7" yfiles.type="resources"/>
<key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/>
<key attr.name="description" attr.type="string" for="edge" id="d9"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/>
<key for="edge" id="d10" yfiles.type="edgegraphics"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G"> <graph edgedefault="directed" id="G">
<data key="d7"/> <data key="d0"/>
<node id="n0" yfiles.foldertype="group"> <node id="n0" yfiles.foldertype="group">
<data key="d4"/> <data key="d4"/>
<data key="d6"> <data key="d6">
@ -49,7 +49,7 @@
<y:Geometry height="30.0" width="324.9258883570935" x="-1249.511914911339" y="-169.79793039957679"/> <y:Geometry height="30.0" width="324.9258883570935" x="-1249.511914911339" y="-169.79793039957679"/>
<y:Fill color="#FFFFFF" transparent="false"/> <y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/> <y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="292.0" x="16.46294417854665" y="5.6494140625">アプリケーションのコンフィギュレーションをロード<y:LabelModel> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="208.0" x="58.46294417854665" y="5.6494140625">アプリケーションの構成情報をロード<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/> <y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel> </y:LabelModel>
<y:ModelParameter> <y:ModelParameter>
@ -375,8 +375,7 @@
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#666666" type="line" width="2.0"/> <y:LineStyle color="#666666" type="line" width="2.0"/>
<y:Arrows source="none" target="standard"/> <y:Arrows source="none" target="standard"/>
<y:EdgeLabel alignment="center" backgroundColor="#99CCFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="33.40234375" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="136.0" x="-145.73495249688403" y="70.83422851562506">コンフィギュレーション <y:EdgeLabel alignment="center" backgroundColor="#99CCFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="76.0" x="-115.73495249688426" y="78.18481445312506">構成情報配列<y:LabelModel>
配列<y:LabelModel>
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
</y:LabelModel> </y:LabelModel>
<y:ModelParameter> <y:ModelParameter>
@ -507,7 +506,7 @@
</data> </data>
</edge> </edge>
</graph> </graph>
<data key="d0"> <data key="d7">
<y:Resources/> <y:Resources/>
</data> </data>
</graphml> </graphml>

BIN
docs/guide-ja/images/application-lifecycle.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

10
docs/guide-ja/images/request-lifecycle.graphml

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yEd 3.13--> <!--Created by yEd 3.13-->
<key for="graphml" id="d0" yfiles.type="resources"/> <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
<key for="port" id="d1" yfiles.type="portgraphics"/> <key for="port" id="d1" yfiles.type="portgraphics"/>
<key for="port" id="d2" yfiles.type="portgeometry"/> <key for="port" id="d2" yfiles.type="portgeometry"/>
<key for="port" id="d3" yfiles.type="portuserdata"/> <key for="port" id="d3" yfiles.type="portuserdata"/>
<key attr.name="url" attr.type="string" for="node" id="d4"/> <key attr.name="url" attr.type="string" for="node" id="d4"/>
<key attr.name="description" attr.type="string" for="node" id="d5"/> <key attr.name="description" attr.type="string" for="node" id="d5"/>
<key for="node" id="d6" yfiles.type="nodegraphics"/> <key for="node" id="d6" yfiles.type="nodegraphics"/>
<key attr.name="Description" attr.type="string" for="graph" id="d7"/> <key for="graphml" id="d7" yfiles.type="resources"/>
<key attr.name="url" attr.type="string" for="edge" id="d8"/> <key attr.name="url" attr.type="string" for="edge" id="d8"/>
<key attr.name="description" attr.type="string" for="edge" id="d9"/> <key attr.name="description" attr.type="string" for="edge" id="d9"/>
<key for="edge" id="d10" yfiles.type="edgegraphics"/> <key for="edge" id="d10" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G"> <graph edgedefault="directed" id="G">
<data key="d7"/> <data key="d0"/>
<node id="n0"> <node id="n0">
<data key="d6"> <data key="d6">
<y:SVGNode> <y:SVGNode>
@ -370,7 +370,7 @@
<y:Geometry height="30.0" width="169.93387606143483" x="307.6574954986572" y="262.00096702575684"/> <y:Geometry height="30.0" width="169.93387606143483" x="307.6574954986572" y="262.00096702575684"/>
<y:Fill color="#FFFFFF" transparent="false"/> <y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/> <y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="160.0" x="4.966938030717415" y="5.6494140625">アプリのコンフィグをロード<y:LabelModel> <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="148.0" x="10.966938030717415" y="5.6494140625">アプリの構成情報をロード<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/> <y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel> </y:LabelModel>
<y:ModelParameter> <y:ModelParameter>
@ -650,7 +650,7 @@
</data> </data>
</edge> </edge>
</graph> </graph>
<data key="d0"> <data key="d7">
<y:Resources> <y:Resources>
<y:Resource id="1">&lt;?xml version="1.0" encoding="utf-8"?&gt; <y:Resource id="1">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" &lt;svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

BIN
docs/guide-ja/images/request-lifecycle.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

169
docs/guide-ja/intro-upgrade-from-v1.md

@ -5,11 +5,11 @@ Yii フレームワークは 2.0 のために完全に書き直されたため
結果として、バージョン 1.1 からのアップグレードは、マイナーバージョン間でのアップグレードのような些細な問題ではなくなりました。 結果として、バージョン 1.1 からのアップグレードは、マイナーバージョン間でのアップグレードのような些細な問題ではなくなりました。
この節では、二つのバージョン間の主要な違いを説明します。 この節では、二つのバージョン間の主要な違いを説明します。
もし以前に Yii 1.1 を使ったことがなければ、あなたはこの節を飛ばして直接に "[始めよう](start-installation.md)" に進んでも大丈夫です もし以前に Yii 1.1 を使ったことがなければ、あなたはこの節を飛ばして直接に "[始めよう](start-installation.md)" に進んでも、問題はありません
Yii 2.0 は、この要約でカバーされているよりも多くの新機能を導入していることに注意してください。 Yii 2.0 は、この要約でカバーされているよりも多くの新機能を導入していることに注意してください。
公式ガイド全体を通読して全ての新機能について学習することを強く推奨します。 決定版ガイド全体を通読して全ての新機能について学習することを強く推奨します。
おそらく、以前は自分自身で開発しなければならなかったいくつかの機能が、今ではコアコードの一部になっていることに気付くでしょう。 おそらく、以前は自分自身で開発する必要があったいくつかの機能が、今ではコアコードの一部になっていることに気付くでしょう。
インストール インストール
@ -18,8 +18,8 @@ Yii 2.0 は、この要約でカバーされているよりも多くの新機能
Yii 2.0 は、事実上の標準的 PHP パッケージ管理ソフトである [Composer](https://getcomposer.org/) を全面的に採用しています。 Yii 2.0 は、事実上の標準的 PHP パッケージ管理ソフトである [Composer](https://getcomposer.org/) を全面的に採用しています。
コアフレームワークも、エクステンションも、インストールは Composer を通じて処理されます。 コアフレームワークも、エクステンションも、インストールは Composer を通じて処理されます。
[Yii をインストールする](start-installation.md) の節を参照して、Yii 2.0 をインストールする方法を学習してください。 [Yii をインストールする](start-installation.md) の節を参照して、Yii 2.0 をインストールする方法を学習してください。
新しいエクステンションを作成したい場合、または既存の 1.1 エクステンションを 2.0 互換のエクステンションに変換したい場合は、 新しいエクステンションを作成したい場合、または既存の 1.1 エクステンションを 2.0 互換のエクステンションに作り直したい場合は、ガイドの
ガイドの [エクステンションを作成する](structure-extensions.md#creating-extensions) の節を参照してください。 [エクステンションを作成する](structure-extensions.md#creating-extensions) の節を参照してください。
PHP の必要条件 PHP の必要条件
@ -27,7 +27,7 @@ PHP の必要条件
Yii 2.0 は PHP 5.4 以上を必要とします。PHP 5.4 は、Yii 1.1 によって必要とされていた PHP 5.2 に比べて、非常に大きく改良されています。 Yii 2.0 は PHP 5.4 以上を必要とします。PHP 5.4 は、Yii 1.1 によって必要とされていた PHP 5.2 に比べて、非常に大きく改良されています。
この結果として、注意を払うべき言語レベルでの違いが数多くあります。 この結果として、注意を払うべき言語レベルでの違いが数多くあります。
以下は PHP に関する主要な変更点の要約です: 以下は PHP に関する主要な変更点の要約です
- [名前空間](http://php.net/manual/ja/language.namespaces.php)。 - [名前空間](http://php.net/manual/ja/language.namespaces.php)。
- [無名関数](http://php.net/manual/ja/functions.anonymous.php)。 - [無名関数](http://php.net/manual/ja/functions.anonymous.php)。
@ -55,26 +55,26 @@ Yii 2.0 での最も明らかな変更は名前空間の使用です。
コンポーネントとオブジェクト コンポーネントとオブジェクト
---------------------------- ----------------------------
Yii 2.0 は、1.1 の `CComponent` クラスを二つのクラスに分割しました: [[yii\base\Object]] と [[yii\base\Component]] です Yii 2.0 は、1.1 の `CComponent` クラスを二つのクラス、すなわち、[[yii\base\Object]] と [[yii\base\Component]] に分割しました
[[yii\base\Object|Object]] クラスは、ゲッターとセッターを通じて [オブジェクトプロパティ](concept-properties.md) を定義することを可能にする軽量な基底クラスです。 [[yii\base\Object|Object]] クラスは、ゲッターとセッターを通じて [オブジェクトプロパティ](concept-properties.md) を定義することを可能にする軽量な基底クラスです。
[[yii\base\Component|Component]] クラスは [[yii\base\Object|Object]] からの拡張であり、[イベント](concept-events.md) と [ビヘイビア](concept-behaviors.md) をサポートします。 [[yii\base\Component|Component]] クラスは [[yii\base\Object|Object]] からの拡張であり、[イベント](concept-events.md) と [ビヘイビア](concept-behaviors.md) をサポートします。
あなたのクラスがイベントやビヘイビアの機能を必要としない場合は、[[yii\base\Object|Object]] を基底クラスとして使うことを考慮すべきです。 あなたのクラスがイベントやビヘイビアの機能を必要としない場合は、[[yii\base\Object|Object]] を基底クラスとして使うことを考慮すべきです。
通常、基本的なデータ構造を表すクラスに対して、このことが当てはまります。 通常、基本的なデータ構造を表すクラスに対して、このことが当てはまります。
オブジェクトのコンフィギュレーション オブジェクトの構成
------------------------------------ ------------------
[[yii\base\Object|Object]] クラスはオブジェクトのコンフィギュレーションのための統一された方法を導入しています。 [[yii\base\Object|Object]] クラスはオブジェクトを構成するための統一された方法を導入しています。
[[yii\base\Object|Object]] の全ての派生クラスは、適切にコンフィギュレーションを適用されるように、コンストラクタを(それが必要な場合には)以下の方法で宣言すべきです: [[yii\base\Object|Object]] の全ての派生クラスは、コンストラクタが必要な場合には、インスタンスが正しく構成されるように、コンストラクタを以下のようにして宣言しなければなりません。
```php ```php
class MyClass extends \yii\base\Object class MyClass extends \yii\base\Object
{ {
public function __construct($param1, $param2, $config = []) public function __construct($param1, $param2, $config = [])
{ {
// ... コンフィギュレーションが適用される前の初期化処理 // ... 構成情報が適用される前の初期化処理
parent::__construct($config); parent::__construct($config);
} }
@ -83,16 +83,16 @@ class MyClass extends \yii\base\Object
{ {
parent::init(); parent::init();
// ... コンフィギュレーションが適用された後の初期化処理 // ... 構成情報が適用された後の初期化処理
} }
} }
``` ```
上記において、コンストラクタは最後のパラメータとしてコンフィギュレーション配列を取らなければなりません。 上記のように、コンストラクタは最後のパラメータとして構成情報の配列を取らなければなりません。
コンフィギュレーション配列は「名前-値」のペアを含むものであり、コンストラクタの最後でプロパティを初期化するためのものです。 構成情報の配列に含まれる「名前-値」のペアが、コンストラクタの最後でプロパティを構成します。
[[yii\base\Object::init()|init()]] メソッドをオーバーライドして、コンフィギュレーションが適用された後に行うべき初期化処理を行うことが出来ます。 [[yii\base\Object::init()|init()]] メソッドをオーバーライドして、構成情報が適用された後に行うべき初期化処理を行うことが出来ます。
この規約に従うことによって、コンフィギュレーション配列を使って新しいオブジェクトを生成して設定することが出来るようになります: この規約に従うことによって、構成情報の配列を使って新しいオブジェクトを生成して構成することが出来るようになります。
```php ```php
$object = Yii::createObject([ $object = Yii::createObject([
@ -102,30 +102,30 @@ $object = Yii::createObject([
], [$param1, $param2]); ], [$param1, $param2]);
``` ```
コンフィギュレーションに関する更なる詳細は、[オブジェクトのコンフィギュレーション](concept-configurations.md) の節で見ることが出来ます。 構成情報に関する詳細は、[オブジェクトの構成情報](concept-configurations.md) の節で見ることが出来ます。
イベント イベント
-------- --------
Yii 1 では、イベントは `on` メソッドを定義することにより作成されました。 Yii 1 では、イベントは `on` メソッド (例えば、`onBeforeSave`) を定義することによって作成されました。
Yii 2 では、どのようなイベント名でも使うことが出来るようになりました。 Yii 2 では、どのようなイベント名でも使うことが出来るようになりました。
[[yii\base\Component::trigger()|trigger()]] メソッドをコールしてイベントを発生させます: [[yii\base\Component::trigger()|trigger()]] メソッドを呼んでイベントを発生させます。
```php ```php
$event = new \yii\base\Event; $event = new \yii\base\Event;
$component->trigger($eventName, $event); $component->trigger($eventName, $event);
``` ```
イベントにハンドラを付けるためには、[[yii\base\Component::on()|on()]] メソッドを使います: イベントにハンドラをアタッチするためには、[[yii\base\Component::on()|on()]] メソッドを使います。
```php ```php
$component->on($eventName, $handler); $component->on($eventName, $handler);
// ハンドラを切り離すためには、以下のようにします: // ハンドラをデタッチするためには、以下のようにします。
// $component->off($eventName, $handler); // $component->off($eventName, $handler);
``` ```
イベント関連の機能には数多くの改良がなされました。更なる詳細は [イベント](concept-events.md) の節を参照してください。 イベントの機能には数多くの改良がなされました。詳細は [イベント](concept-events.md) の節を参照してください。
パスエイリアス パスエイリアス
@ -138,11 +138,11 @@ Yii 2.0 は、パスエイリアスの使用を、ファイル/ディレクト
例えば [[yii\caching\FileCache::cachePath]] はパスエイリアスと通常のディレクトリパスの両方を受け取ることが出来ます。 例えば [[yii\caching\FileCache::cachePath]] はパスエイリアスと通常のディレクトリパスの両方を受け取ることが出来ます。
パスエイリアスは、また、クラスの名前空間とも密接に関係しています。 パスエイリアスは、また、クラスの名前空間とも密接に関係しています。
ルートの名前空間のそれぞれに対してパスエイリアスを定義することが推奨されています。 ルートの名前空間に対しては、それぞれ、パスエイリアスを定義することが推奨されます。
そうすることによって、よけいなコンフィギュレーションをしなくても、Yii のクラスオートローダを使うことが出来るようになります。 そうすれば、余計な構成をしなくても、Yii のクラスオートローダを使うことが出来るようになります。
例えば、`@yii` Yii のインストールディレクトリを指しているので、`yii\web\Request` というようなクラスをオートロードすることが出来す。 例えば、`@yii` Yii のインストールディレクトリを指しているので、`yii\web\Request` というようなクラスをオートロードすることが出来る訳です。
サードパーティのライブラリ、例えば Zend フレームワークなどを使う場合に、そのフレームワークのインストールディレクトリを指す `@Zend` というパスエイリアスを定義することが出来ます。 サードパーティのライブラリ、例えば Zend フレームワークなどを使う場合に、そのフレームワークのインストールディレクトリを指す `@Zend` というパスエイリアスを定義することが出来ます。
一旦そうしてしまえば、その Zend フレームワークのライブラリ中のどんなクラスでも、同じようにオートロードすることが出来るようになります。 一旦そうしてしまえば、その Zend フレームワークのライブラリ内のどんなクラスでも、Yii からオートロードすることが出来るようになります。
パスエイリアスに関する詳細は [エイリアス](concept-aliases.md) の節を参照してください。 パスエイリアスに関する詳細は [エイリアス](concept-aliases.md) の節を参照してください。
@ -150,21 +150,22 @@ Yii 2.0 は、パスエイリアスの使用を、ファイル/ディレクト
ビュー ビュー
------ ------
Yii 2 のビューについての最も顕著な変更は、ビューの中 `$this` という特殊な変数がカレントコントローラやウィジェットを指すものではなくなったということです。 Yii 2 のビューについての最も顕著な変更は、ビューの中 `$this` という特殊な変数がカレントコントローラやウィジェットを指すものではなくなったということです。
今や `$this` は 2.0 で新しく導入された概念である *ビュー* オブジェクトを指します。 今や `$this` は 2.0 で新しく導入された概念である *ビュー* オブジェクトを指します。
*ビュー* オブジェクトは [[yii\web\View]] という型であり、MVC パターンのビューの部分を表すものです。 *ビュー* オブジェクトは [[yii\web\View]] という型であり、MVC パターンのビューの部分を表すものです。
ビューにおいてコントローラやウィジェットにアクセスしたい場合は、`$this->context` を使うことが出来ます。 ビューにおいてコントローラやウィジェットにアクセスしたい場合は、`$this->context` を使うことが出来ます。
パーシャルビューを別のビューの中で表示するためには、`$this->renderPartial()` ではなく、`$this->render()` を使います。 パーシャルビューを別のビューの中でレンダリングするためには、`$this->renderPartial()` ではなく、`$this->render()` を使います。
`render` の呼び出しは、2.0 では明示的に echo しなくてはなりません。と言うのは、`render()` メソッドは、直接に表示するのではなく、レンダリング結果を文字列として返すものだからです。 さらに、`render` の呼び出しは、2.0 では明示的に echo しなくてはなりません。
例えば: と言うのは、`render()` メソッドは、レンダリング結果を返すものであり、それを直接に表示するものではないからです。
例えば、
```php ```php
echo $this->render('_item', ['item' => $item]); echo $this->render('_item', ['item' => $item]);
``` ```
PHP を主たるテンプレート言語として使うのに加えて、Yii 2.0 は人気のある二つのテンプレートエンジン、Smarty と Twig に対する正式なサポートを備えています。 PHP を主たるテンプレート言語として使う以外に、Yii 2.0 は人気のある二つのテンプレートエンジン、Smarty と Twig に対する正式なサポートを備えています。
Prado テンプレートエンジンはもうサポートされません。 Prado テンプレートエンジンはもはやサポートされていません。
これらのテンプレートエンジンを使うためには、[[yii\base\View::$renderers|View::$renderers]] プロパティをセットして、`view` アプリケーションコンポーネントを構成する必要があります。 これらのテンプレートエンジンを使うためには、[[yii\base\View::$renderers|View::$renderers]] プロパティをセットして、`view` アプリケーションコンポーネントを構成する必要があります。
詳細は [テンプレートエンジン](tutorial-template-engines.md) の節を参照してください。 詳細は [テンプレートエンジン](tutorial-template-engines.md) の節を参照してください。
@ -174,11 +175,11 @@ Prado テンプレートエンジンはもうサポートされません。
Yii 2.0 は [[yii\base\Model]] を 1.1 における `CModel` と同様な基底モデルとして使います。 Yii 2.0 は [[yii\base\Model]] を 1.1 における `CModel` と同様な基底モデルとして使います。
`CFormModel` というクラスは完全に廃止されました。 `CFormModel` というクラスは完全に廃止されました。
Yii 2 では、それの代りに、[yii\base\Model]] を拡張してフォームモデルクラスを作成すべきです。 Yii 2 では、それの代りに [yii\base\Model]] を拡張して、フォームモデルクラスを作成すべきです。
Yii 2.0 は サポートされるシナリオを宣言するための [[yii\base\Model::scenarios()|scenarios()]] というメソッドを導入しました。 Yii 2.0 は サポートされるシナリオを宣言するための [[yii\base\Model::scenarios()|scenarios()]] という新しいメソッドを導入しました。
このメソッドを使って、あるシナリオの下で、どの属性が検証される必要があるか、また、どの属性が安全とみなされるか否か、などを宣言することが出来ます。 このメソッドを使って、あるシナリオの下で、どの属性が検証される必要があるか、また、どの属性が安全とみなされるか否か、などを宣言することが出来ます。
例えば: 例えば
```php ```php
public function scenarios() public function scenarios()
@ -190,7 +191,7 @@ public function scenarios()
} }
``` ```
上記では二つのシナリオが宣言されています: `backend``frontend`す。 上記では二つのシナリオ、すなわち、`backend` と `frontend` が宣言されています。
`backend` シナリオでは、`email` と `role` の属性が両方とも安全であり、一括代入が可能です。 `backend` シナリオでは、`email` と `role` の属性が両方とも安全であり、一括代入が可能です。
`frontend` シナリオでは、`email` は一括代入が可能ですが、`role` は不可能です。 `frontend` シナリオでは、`email` は一括代入が可能ですが、`role` は不可能です。
`email``role` は、両方とも、規則を使って検証されなければなりません。 `email``role` は、両方とも、規則を使って検証されなければなりません。
@ -198,7 +199,7 @@ public function scenarios()
[[yii\base\Model::rules()|rules()]] メソッドが Yii 1.1 同様に検証規則を宣言するために使われます。 [[yii\base\Model::rules()|rules()]] メソッドが Yii 1.1 同様に検証規則を宣言するために使われます。
[[yii\base\Model::scenarios()|scenarios()]] が導入されたことにより、`unsafe` バリデータが無くなったことに注意してください。 [[yii\base\Model::scenarios()|scenarios()]] が導入されたことにより、`unsafe` バリデータが無くなったことに注意してください。
ほとんどの場合、[[yii\base\Model::rules()|rules()]] メソッドが在り得るシナリオを十分に既定しているなら、そして `unsafe` な属性を宣言する必要が無いなら、[[yii\base\Model::scenarios()|scenarios()]] をオーバーライドする必要はありません。 ほとんどの場合、すなわち、[[yii\base\Model::rules()|rules()]] メソッドが存在しうるシナリオを完全に規定しているなら、そして `unsafe` な属性を宣言する必要が無いなら、[[yii\base\Model::scenarios()|scenarios()]] をオーバーライドする必要はありません。
モデルについてさらに詳細を学習するために、[モデル](structure-models.md) の節を参照してください。 モデルについてさらに詳細を学習するために、[モデル](structure-models.md) の節を参照してください。
@ -210,7 +211,7 @@ Yii 2.0 は [[yii\web\Controller]] を基底のコントローラクラスとし
これは Yii 1.1 における`CController` と同様なクラスです。 これは Yii 1.1 における`CController` と同様なクラスです。
[[yii\base\Action]] がアクションクラスの基底クラスです。 [[yii\base\Action]] がアクションクラスの基底クラスです。
これらに関する変更があなたのコードに及ぼす影響で最も明らかなものは、コントローラのアクションは表示したいコンテンツを、エコーするのでなく、返さなければならない、ということです。 これらに関する変更があなたのコードに及ぼす最も顕著な影響は、コントローラのアクションは表示したいコンテンツを、エコーするのでなく、返さなければならない、ということです。
```php ```php
public function actionView($id) public function actionView($id)
@ -224,7 +225,7 @@ public function actionView($id)
} }
``` ```
コントローラに関する更なる詳細については [コントローラ](structure-controllers.md) の節を参照してください。 コントローラに関する詳細については [コントローラ](structure-controllers.md) の節を参照してください。
ウィジェット ウィジェット
@ -233,7 +234,7 @@ public function actionView($id)
Yii 2.0 は [[yii\base\Widget]] を基底のウィジェットクラスとして使用します。これは Yii 1.1 の `CWidget` と同様なクラスです。 Yii 2.0 は [[yii\base\Widget]] を基底のウィジェットクラスとして使用します。これは Yii 1.1 の `CWidget` と同様なクラスです。
いろんな IDE においてフレームワークに対するより良いサポートを得るために、Yii 2.0 はウィジェットを使うための新しい構文を導入しました。 いろんな IDE においてフレームワークに対するより良いサポートを得るために、Yii 2.0 はウィジェットを使うための新しい構文を導入しました。
スタティックなメソッド [[yii\base\Widget::begin()|begin()]]、[[yii\base\Widget::end()|end()]]、そして [[yii\base\Widget::widget()|widget()]] が導入されました。以下のようにして使います: スタティックなメソッド [[yii\base\Widget::begin()|begin()]]、[[yii\base\Widget::end()|end()]]、そして [[yii\base\Widget::widget()|widget()]] が導入されました。以下のようにして使います
```php ```php
use yii\widgets\Menu; use yii\widgets\Menu;
@ -251,7 +252,7 @@ $form = ActiveForm::begin([
ActiveForm::end(); ActiveForm::end();
``` ```
更なる詳細については [ウィジェット](structure-widgets.md) の節を参照してください。 詳細については [ウィジェット](structure-widgets.md) の節を参照してください。
テーマ テーマ
@ -265,25 +266,25 @@ ActiveForm::end();
コントローラやウィジェットのコンテキストの外で表示されるビューに対してすら、適用できます。 コントローラやウィジェットのコンテキストの外で表示されるビューに対してすら、適用できます。
また、`CThemeManager` コンポーネントはもうありません。 また、`CThemeManager` コンポーネントはもうありません。
その代りに、`theme` は `view` アプリケーションコンポーネントのコンフィギュレーション可能なプロパティになりました。 その代りに、`theme` は `view` アプリケーションコンポーネントの構成可能なプロパティになりました。
更なる詳細については [テーマ](output-theming.md) の節を参照してください。 詳細については [テーマ](output-theming.md) の節を参照してください。
コンソールアプリケーション コンソールアプリケーション
-------------------------- --------------------------
コンソールアプリケーションは、ウェブアプリケーションと同じように、コントローラとして組織されるようになりました。 コンソールアプリケーションは、ウェブアプリケーションと同じように、コントローラとして組織されるようになりました。
1.1 における `CConsoleCommand` と同様に、コンソールコントローラは [[yii\console\Controller]] から派生させます 1.1 における `CConsoleCommand` と同様に、コンソールコントローラは [[yii\console\Controller]] を拡張したものでなければなりません
コンソールコマンドを走らせるためには、`yii <route>` という構文を使います。 コンソールコマンドを走らせるためには、`yii <route>` という構文を使います。
ここで `<route>` はコントローラのルート(例えば `sitemap/index`)を意味します。 ここで `<route>` はコントローラのルート (例えば `sitemap/index`) を表します。
追加の無名の引数は、対応するコントローラのアクションメソッドに引数として渡されます。 追加の無名の引数は、対応するコントローラのアクションメソッドに引数として渡されます。
一方、名前付きの引数は、[[yii\console\Controller::options()]] での宣言に従って解析されます。 一方、名前付きの引数は、[[yii\console\Controller::options()]] での宣言に従って解析されます。
Yii 2.0 はコメントブロックからコマンドのヘルプ情報を自動的に生成する機能をサポートしています。 Yii 2.0 はコメントブロックからコマンドのヘルプ情報を自動的に生成する機能をサポートしています。
更なる詳細については [コンソールコマンド](tutorial-console.md) の節を参照してください。 詳細については [コンソールコマンド](tutorial-console.md) の節を参照してください。
国際化 国際化
@ -292,18 +293,18 @@ Yii 2.0 はコメントブロックからコマンドのヘルプ情報を自動
Yii 2.0 は [PECL intl PHP モジュール](http://pecl.php.net/package/intl) に賛同して、内蔵の日付フォーマッタと数字フォーマッタの部品を取り除きました。 Yii 2.0 は [PECL intl PHP モジュール](http://pecl.php.net/package/intl) に賛同して、内蔵の日付フォーマッタと数字フォーマッタの部品を取り除きました。
メッセージは `i18n` アプリケーションコンポーネント経由で翻訳されるようになりました。 メッセージは `i18n` アプリケーションコンポーネント経由で翻訳されるようになりました。
このコンポーネントはメッセージソースのセットを管理するもので、メッセージのカテゴリに基づいて異なるメッセージソースを使うことを許容します。 このコンポーネントは一連のメッセージソースを管理するもので、メッセージのカテゴリに基づいて異なるメッセージソースを使うことを許容するものです。
更なる詳細については [国際化](tutorial-i18n.md) の節を参照してください。 詳細については [国際化](tutorial-i18n.md) の節を参照してください。
アクションフィルタ アクションフィルタ
------------------ ------------------
新しいアクションフィルタはビヘイビアによって実装されています。 新しいアクションフィルタはビヘイビアによって実装されています。
新しいカスタムフィルタを定義するためには、[[yii\base\ActionFilter]] を拡張します。 新しいカスタムフィルタを定義するためには、[[yii\base\ActionFilter]] を拡張します。
フィルタを使うためには、そのフィルタクラスをビヘイビアとしてコントローラにアタッチします。 フィルタを使うためには、そのフィルタクラスをビヘイビアとしてコントローラにアタッチします。
例えば、[[yii\filters\AccessControl]] を使うためには、コントローラに次のコードを書くことになります: 例えば、[[yii\filters\AccessControl]] を使うためには、コントローラに次のコードを書くことになります
```php ```php
public function behaviors() public function behaviors()
@ -319,7 +320,7 @@ public function behaviors()
} }
``` ```
更なる詳細については [フィルタ](structure-filters.md) の節を参照してください。 詳細については [フィルタ](structure-filters.md) の節を参照してください。
アセット アセット
@ -329,16 +330,16 @@ Yii 2.0 は、*アセットバンドル* と呼ばれる新しい概念を導入
アセットバンドルは、あるディレクトリの下に集められた一群のアセットファイル (例えば、JavaScript ファイル、CSS ファイル、イメージファイルなど) です。 アセットバンドルは、あるディレクトリの下に集められた一群のアセットファイル (例えば、JavaScript ファイル、CSS ファイル、イメージファイルなど) です。
それぞれのアセットバンドルは [[yii\web\AssetBundle]] を拡張したクラスとして表されます。 それぞれのアセットバンドルは [[yii\web\AssetBundle]] を拡張したクラスとして表されます。
アセットバンドルを [[yii\web\AssetBundle::register()]] を通じて登録することによって、そのバンドルに含まれるアセットにウェブでアクセスできるようになります。 アセットバンドルを [[yii\web\AssetBundle::register()]] を通じて登録することによって、そのバンドルに含まれるアセットにウェブ経由でアクセスできるようになります。
Yii 1 とは異なり、バンドルを登録したページは、そのバンドルで規定された JavaScript と CSS ファイルを自動的に参照するようになります。 Yii 1 とは異なり、バンドルを登録したページは、そのバンドルで指定されている JavaScript と CSS ファイルへの参照を自動的に含むようになります。
更なる詳細については [アセットを管理する](structure-assets.md) の節を参照してください。 詳細については [アセット](structure-assets.md) の節を参照してください。
ヘルパ ヘルパ
-------- ------
Yii 2.0 はよく使われるスタティックなヘルパクラスを数多く導入しました。それには以下のものが含まれます; Yii 2.0 はよく使われるスタティックなヘルパクラスを数多く導入しました。それには以下のものが含まれます
* [[yii\helpers\Html]] * [[yii\helpers\Html]]
* [[yii\helpers\ArrayHelper]] * [[yii\helpers\ArrayHelper]]
@ -346,37 +347,37 @@ Yii 2.0 はよく使われるスタティックなヘルパークラスを数多
* [[yii\helpers\FileHelper]] * [[yii\helpers\FileHelper]]
* [[yii\helpers\Json]] * [[yii\helpers\Json]]
更なる詳細については [ヘルパー概要](helper-overview.md) の節を参照してください。 詳細については、ヘルパの [概要](helper-overview.md) の節を参照してください。
フォーム フォーム
-------- --------
Yii 2.0 は [[yii\widgets\ActiveForm]] を使ってフォームを作成する際に *フィールド* の概念を導入しました。 Yii 2.0 は [[yii\widgets\ActiveForm]] を使ってフォームを作成する際に使用する *フィールド* の概念を導入しました。
フィールドは、ラベル、インプット、エラーメッセージ および/または ヒントテキストを含むコンテナです。 フィールドは、ラベル、インプット、エラーメッセージ および/または ヒントテキストを含むコンテナです。
フィールドは [[yii\widgets\ActiveField|ActiveField]] のオブジェクトとして表現されます。 フィールドは [[yii\widgets\ActiveField|ActiveField]] のオブジェクトとして表現されます。
フィールドを使うことによって、以前よりも綺麗にフォームを作成することが出来るようになりました: フィールドを使うことによって、以前よりもすっきりとフォームを作成することが出来るようになりました。
```php ```php
<?php $form = yii\widgets\ActiveForm::begin(); ?> <?php $form = yii\widgets\ActiveForm::begin(); ?>
<?= $form->field($model, 'username') ?> <?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?> <?= $form->field($model, 'password')->passwordInput() ?>
<div class="form-group"> <div class="form-group">
<?= Html::submitButton('Login') ?> <?= Html::submitButton('ログイン') ?>
</div> </div>
<?php yii\widgets\ActiveForm::end(); ?> <?php yii\widgets\ActiveForm::end(); ?>
``` ```
更なる詳細については [フォームを作成する](input-forms.md) の節を参照してください。 詳細については [フォームを作成する](input-forms.md) の節を参照してください。
クエリビルダ クエリビルダ
------------ ------------
1.1 においては、クエリビルダは `CDbCommand`、`CDbCriteria`、`CDbCommandBuilder` など、いくつかのクラスに散らばっていました。 1.1 においては、クエリの構築が `CDbCommand`、`CDbCriteria`、`CDbCommandBuilder` など、いくつかのクラスに散らばっていました。
Yii 2.0 は DB クエリを [[yii\db\Query|Query]] オブジェクトの形で表現します。 Yii 2.0 は DB クエリを [[yii\db\Query|Query]] オブジェクトの形で表現します。
このオブジェクトが舞台裏で [[yii\db\QueryBuilder|QueryBuilder]] の助けを得て SQL 文に変換されます。 このオブジェクトが舞台裏で [[yii\db\QueryBuilder|QueryBuilder]] の助けを得て SQL 文に変換されます。
例えば: 例えば
```php ```php
$query = new \yii\db\Query(); $query = new \yii\db\Query();
@ -391,7 +392,7 @@ $rows = $command->queryAll();
何より良いのは、このようなクエリ構築メソッドが [アクティブレコード](db-active-record.md) を扱う時にも使える、ということです。 何より良いのは、このようなクエリ構築メソッドが [アクティブレコード](db-active-record.md) を扱う時にも使える、ということです。
更なる詳細については [クエリビルダ](db-query-builder.md) の節を参照してください。 詳細については [クエリビルダ](db-query-builder.md) の節を参照してください。
アクティブレコード アクティブレコード
@ -402,20 +403,20 @@ Yii 2.0 は [アクティブレコード](db-active-record.md) に数多くの
1.1 の `CDbCriteria` クラスは Yii 2 では [[yii\db\ActiveQuery]] に置き換えられました。 1.1 の `CDbCriteria` クラスは Yii 2 では [[yii\db\ActiveQuery]] に置き換えられました。
このクラスは [[yii\db\Query]] を拡張したものであり、従って全てのクエリ構築メソッドを継承します。 このクラスは [[yii\db\Query]] を拡張したものであり、従って全てのクエリ構築メソッドを継承します。
以下のように、[[yii\db\ActiveRecord::find()]] を呼んでクエリの構築を開始します: 以下のように、[[yii\db\ActiveRecord::find()]] を呼んでクエリの構築を開始します
```php ```php
// 全てのアクティブな顧客を読み出し、ID によって並べる: // 全てのアクティブな顧客を読み出し、ID によって並べる
$customers = Customer::find() $customers = Customer::find()
->where(['status' => $active]) ->where(['status' => $active])
->orderBy('id') ->orderBy('id')
->all(); ->all();
``` ```
リレーションを宣言するためには、単純に [[yii\db\ActiveQuery|ActiveQuery]] オブジェクトを返すゲッターメソッドを定義します。 リレーションを宣言するために必要なことは、[[yii\db\ActiveQuery|ActiveQuery]] オブジェクトを返すゲッターメソッドを定義するだけのことです。
ゲッターによって定義されたプロパティの名前がリレーションの名前を表します。 ゲッターによって定義されたプロパティの名前がリレーションの名前を表します。
例えば、以下のコードは `orders` リレーションを宣言するものです 例えば、以下のコードは `orders` リレーションを宣言するものです
(1.1 では `relations()` という一個の中枢でリレーションを宣言しなければなりませんでした): (1.1 では `relations()` という一個の中枢でリレーションを宣言しなければなりませんでした)
```php ```php
class Customer extends \yii\db\ActiveRecord class Customer extends \yii\db\ActiveRecord
@ -428,7 +429,7 @@ class Customer extends \yii\db\ActiveRecord
``` ```
こうすることで、`$customer->orders` という構文によって関連テーブルにある顧客のオーダにアクセスすることが出来るようになります。 こうすることで、`$customer->orders` という構文によって関連テーブルにある顧客のオーダにアクセスすることが出来るようになります。
また、下記のコードを用いて、カスタマイズしたクエリ条件によるオンザフライのリレーショナルクエリを実行することも出来ます: また、下記のコードを用いて、カスタマイズしたクエリ条件によるオンザフライのリレーショナルクエリを実行することも出来ます
```php ```php
$orders = $customer->getOrders()->andWhere('status=1')->all(); $orders = $customer->getOrders()->andWhere('status=1')->all();
@ -436,19 +437,19 @@ $orders = $customer->getOrders()->andWhere('status=1')->all();
リレーションをイーガーロードするとき、Yii 2.0 は 1.1 とは異なる動きをします。 リレーションをイーガーロードするとき、Yii 2.0 は 1.1 とは異なる動きをします。
具体的に言うと、1.1 では JOIN クエリが生成されて、主レコードと関連レコードの両方がセレクトされていました。 具体的に言うと、1.1 では JOIN クエリが生成されて、主レコードと関連レコードの両方がセレクトされていました。
Yii 2.0 では、JOIN を使わずに二つの SQL 文が実行されます: Yii 2.0 では、JOIN を使わずに二つの SQL 文が実行されます
第一の SQL 文が主たるレコードを返し、第二の SQL 文は主レコードのプライマリキーを使うフィルタリングによって関連レコードを返します。 すなわち、第一の SQL 文が主たるレコードを返し、第二の SQL 文は主レコードのプライマリキーを使うフィルタリングによって関連レコードを返します。
多数のレコードを返すクエリを構築するときは、[[yii\db\ActiveRecord|ActiveRecord]] を返す代りに、[[yii\db\ActiveQuery::asArray()|asArray()]] メソッドをチェインして、クエリ結果を配列として返すことが出来ます。 多数のレコードを返すクエリを構築するときは、[[yii\db\ActiveRecord|ActiveRecord]] を返す代りに、[[yii\db\ActiveQuery::asArray()|asArray()]] メソッドをチェインして、クエリ結果を配列として返すことが出来ます。
こうすると、レコードの数が多い場合は、必要な CPU 時間とメモリを著しく削減することが出来ます。 こうすると、レコードの数が多い場合は、必要な CPU 時間とメモリを著しく削減することが出来ます。
例えば: 例えば
```php ```php
$customers = Customer::find()->asArray()->all(); $customers = Customer::find()->asArray()->all();
``` ```
もう一つの変更点は、属性のデフォルト値を public なプロパティによって定義することは出来なくなった、ということです。 もう一つの変更点は、属性のデフォルト値を public なプロパティによって定義することは出来なくなった、ということです。
デフォルト値が必要な場合は、アクティブレコードクラスの `init` メソッドの中で設定すべきです デフォルト値が必要な場合は、アクティブレコードクラスの `init` メソッドの中で設定しなければなりません
```php ```php
public function init() public function init()
@ -505,7 +506,7 @@ User と IdentityInterface
そして `CUserIdentity` クラスはもうありません。代りに、使い方がもっと単純な [[yii\web\IdentityInterface]] を実装すべきです。 そして `CUserIdentity` クラスはもうありません。代りに、使い方がもっと単純な [[yii\web\IdentityInterface]] を実装すべきです。
アドバンストアプリケーションテンプレートがそういう例を提供しています。 アドバンストアプリケーションテンプレートがそういう例を提供しています。
更なる詳細は [認証](security-authentication.md)、[権限](security-authorization.md)、そして [高度なアプリケーションのテクニック](tutorial-advanced-app.md) の節を参照してください。 詳細は [認証](security-authentication.md)、[権限](security-authorization.md)、そして [アドバンストアプリケーションテンプレート](tutorial-advanced-app.md) の節を参照してください。
URL 管理 URL 管理
@ -513,8 +514,8 @@ URL 管理
Yii 2 の URL 管理は 1.1 のそれと似たようなものです。 Yii 2 の URL 管理は 1.1 のそれと似たようなものです。
主な機能強化は、URL 管理がオプションのパラメータをサポートするようになったことです。 主な機能強化は、URL 管理がオプションのパラメータをサポートするようになったことです。
例えば、下記のような規則を宣言した場合、`post/popular` と `post/1/popular` の両方にマッチするようになります。 例えば、下記のような規則を宣言した場合、`post/popular` と `post/1/popular` の両方に合致するようになります。
1.1 では、これと同じ目的を達成するためには、二つの規則を使う必要がありました。 1.1 では、同じ目的を達成するためには、二つの規則を使う必要がありました。
```php ```php
[ [
@ -524,12 +525,12 @@ Yii 2 の URL 管理は 1.1 のそれと似たようなものです。
] ]
``` ```
更なる詳細については [URL 管理](runtime-url-handling.md) の節を参照してください。 詳細については [ルーティングと URL 生成](runtime-routing.md) の節を参照してください。
Yii 1.1 と 2.x を一緒に使う Yii 1.1 と 2.x を一緒に使う
--------------------------- ---------------------------
Yii 2.0 と一緒に使いたい Yii 1.1 のレガシーコードを持っている場合は、 Yii 2.0 と一緒に使いたい Yii 1.1 のレガシーコードを持っている場合は、
[Yii 1.1 と 2.x を一緒に使](tutorial-yii-integration.md) の節を参照してください。 [サードパーティのコードを扱](tutorial-yii-integration.md) の節を参照してください。

25
docs/guide-ja/intro-yii.md

@ -3,7 +3,7 @@ Yii とは何か
Yii は現代的なウェブアプリケーションを迅速に開発するための、高性能な、コンポーネントベースの PHP フレームワークです。 Yii は現代的なウェブアプリケーションを迅速に開発するための、高性能な、コンポーネントベースの PHP フレームワークです。
Yii という名前 (`イー` すなわち `[ji:]` と発音します) は、中国語では「易」であり、「シンプルかつ進化的」であることを意味します。 Yii という名前 (`イー` すなわち `[ji:]` と発音します) は、中国語では「易」であり、「シンプルかつ進化的」であることを意味します。
また **Yes It Is**省略形であると考えることも出来ます。 また **Yes It Is**アクロニム(頭字語)であると考えることも出来ます。
Yii は何に向いているか Yii は何に向いているか
@ -17,20 +17,20 @@ Yii は汎用的なウェブプログラミングフレームワークです。
Yii を他のフレームワークと比べるとどうか? Yii を他のフレームワークと比べるとどうか?
----------------------------------------- -----------------------------------------
あなたが既に他のフレームワークに親しんでいる場合は、Yii を比較するとどうなるのかを知りたいと思うでしょう: あなたが既に他のフレームワークに親しんでいる場合は、Yii を比較するとどうなるのかを知りたいと思うでしょう
- ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) デザインパターンを実装し、このパターンに基づいたコードの組織化を進しています。 - ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) デザインパターンを実装し、このパターンに基づいたコードの組織化を進しています。
- Yii は、コードはシンプルかつエレガントに書かれるべきである、という哲学を採用しています。 - Yii は、コードはシンプルかつエレガントに書かれるべきである、という哲学を採用しています。
Yii は、何らかのデザインパターンを厳密に守ることを主たる目的として大袈裟な設計をすることは、決してしようとしません。 Yii は、何らかのデザインパターンを厳密に守ることを主たる目的として大袈裟な設計をすることは、決してしようとしません。
- Yii は、検証済みで直ちに使える多数の機能を提供するフル装備のフレームワークです: - Yii は、検証済みで直ちに使える多数の機能を提供するフル装備のフレームワークです
リレーショナルデータベースと NoSQL データベースの両方のためのクエリビルダとアクティブレコード; RESTful API 開発サポート; 多層構成のキャッシュサポート; その他諸々。 リレーショナルデータベースと NoSQL データベースの両方のためのクエリビルダとアクティブレコード、RESTful API 開発サポート、多層構成のキャッシュサポート、その他諸々。
- Yii は極めて拡張性の高いフレームワークです。あなたはコアのコードのほとんど全ての要素をカスタマイズしたり置き換えたりすることが出来ます。 - Yii は極めて拡張性の高いフレームワークです。あなたはコアのコードのほとんど全ての要素をカスタマイズしたり置き換えたりすることが出来ます。
また、Yii の堅固なエクステンションアーキテクチャを利用して、再配布可能なエクステンションを使用したり開発したりすることも出来ます。 また、Yii の堅固なエクステンションアーキテクチャを利用して、再配布可能なエクステンションを使用したり開発したりすることも出来ます。
- 高性能であることは常に Yii の主たる目的の一つです。 - 高性能であることは常に Yii の主たる目です。
Yii は「独演会」ではありません。Yii は [強力なコア開発チーム][] および Yii 開発に間断なく貢献してくれるプロフェッショナルの大きなコミュニティーに支えられたプロジェクトです。 Yii はワンマンショーではありません。Yii は [強力なコア開発チーム][] および Yii 開発に間断なく貢献してくれるプロフェッショナルの大きなコミュニティーに支えられたプロジェクトです。
Yii 開発チームは最新のウェブ開発の潮流や、他のフレームワークやプロジェクトに見られる最善の慣行と機能から目を離しません。 Yii 開発チームは最新のウェブ開発の潮流や、他のフレームワークやプロジェクトに見られる最善の慣行と機能から目を離しません。
他のところで見られる関連性の高い最善の慣行と機能は定期的にコアフレームワークに組み込まれ、シンプルかつエレガントなインターフェイスを通じて公開されます。 他のところで見出された関連性の高い最善の慣行と機能は、定期的にコアフレームワークに組み込まれ、シンプルかつエレガントなインターフェイスを通じて公開されます。
[強力なコア開発チーム]: http://www.yiiframework.com/about/ [強力なコア開発チーム]: http://www.yiiframework.com/about/
@ -40,7 +40,7 @@ Yii のバージョン
Yii は現在、利用可能な二つのメジャーバージョン、すなわち 1.1 と 2.0 を持っています。 Yii は現在、利用可能な二つのメジャーバージョン、すなわち 1.1 と 2.0 を持っています。
バージョン 1.1 は古い世代のもので、現在はメンテナンスモードにあります。 バージョン 1.1 は古い世代のもので、現在はメンテナンスモードにあります。
バージョン 2.0 は、最新のテクノロジーとプロトコル、例えば、Composer、PSR、名前空間、トレイトなどを採用して、Yii を完全に書き直したものです。 バージョン 2.0 は、最新のテクノロジーとプロトコル、例えば、Composer、PSR、名前空間、トレイトなどを採用して、Yii を完全に書き直したものです。
バージョン 2.0 がこのフレームワークの現在の世代を表すものであり、今後数年間にわたって主要な開発努力の対象となるものです。 バージョン 2.0 がこのフレームワークの現世代を表すものであり、今後数年間にわたって主要な開発努力の対象となるものです。
このガイドは主としてバージョン 2.0 について述べます。 このガイドは主としてバージョン 2.0 について述べます。
@ -48,9 +48,10 @@ Yii は現在、利用可能な二つのメジャーバージョン、すなわ
------------------ ------------------
Yii 2.0 は PHP 5.4.0 以上を必要とします。 Yii 2.0 は PHP 5.4.0 以上を必要とします。
個別の機能に対するさらに詳細な必要条件は、全ての Yii リリースに含まれている必要条件チェッカを走らせることによって知ることが出来ます。 個別の機能に対する詳細な必要条件は、全ての Yii リリースに含まれている必要条件チェッカを走らせることによって知ることが出来ます。
Yii は純粋なオブジェクト指向のフレームワークですので、Yii を使うためにはオブジェクト指向プログラミング (OOP) の基本的な知識が必要とされます。 Yii を使うためには、オブジェクト指向プログラミング (OOP) の基本的な知識が必要です。
なぜなら、Yii は純粋な OOP ベースのフレームワークだからです。
また、Yii 2.0 は [名前空間](http://php.net/manual/ja/language.namespaces.php) や [トレイト](http://php.net/manual/ja/language.oop5.traits.php) のような PHP の最新の機能を利用しています。 また、Yii 2.0 は [名前空間](http://php.net/manual/ja/language.namespaces.php) や [トレイト](http://php.net/manual/ja/language.oop5.traits.php) のような PHP の最新の機能を利用しています。
これらの概念を理解することは、Yii 2.0 を採用することをより一層容易にするでしょう。 これらの概念を理解することは、Yii 2.0 を採用することをより一層容易にするでしょう。

69
docs/guide-ja/start-databases.md

@ -2,15 +2,14 @@
================== ==================
この節では、`country` という名前のデータベーステーブルから読み出した国データを表示する新しいページの作り方を説明します。 この節では、`country` という名前のデータベーステーブルから読み出した国データを表示する新しいページの作り方を説明します。
この目的を達するために、データベース接続を構成し、[アクティブレコード](db-active-record.md) クラスを作成し、 この目的を達するために、データベース接続を構成し、[アクティブレコード](db-active-record.md) クラスを作成し、[アクション](structure-controllers.md) を定義し、そして [ビュー](structure-views.md) を作成します。
[アクション](structure-controllers.md) を定義し、そして [ビュー](structure-views.md) を作成します。
このチュートリアルを通じて、次のことをする方法を学びます: このチュートリアルを通じて、次のことを学びます。
* DB 接続を構成する * DB 接続を構成する方法
* アクティブレコードのクラスを定義する * アクティブレコードのクラスを定義する方法
* アクティブレコードのクラスを使ってデータを検索する * アクティブレコードのクラスを使ってデータを検索する方法
* 改ページを伴う方でビューにデータを表示する * 改ページを伴う方でビューにデータを表示する方法
この節を完了するためには、データベースを使うことについて基本的な知識と経験が無ければならないことに注意してください。 この節を完了するためには、データベースを使うことについて基本的な知識と経験が無ければならないことに注意してください。
具体的に言えば、DB クライアントツールを用いてデータベースを作成する方法と、SQL 文を実行する方法を知っていなければなりません。 具体的に言えば、DB クライアントツールを用いてデータベースを作成する方法と、SQL 文を実行する方法を知っていなければなりません。
@ -21,12 +20,11 @@
まず初めに、`yii2basic` という名前のデータベースを作成してください。このデータベースからアプリケーションにデータを読み出すことになります。 まず初めに、`yii2basic` という名前のデータベースを作成してください。このデータベースからアプリケーションにデータを読み出すことになります。
作成するデータベースは、SQLite、MySQL、PosttreSQL、MSSQL または Oracle から選んでください。 Yii は多数のデータベース製品に対するサポートを内蔵していますので、作成するデータベースは、SQLite、MySQL、PosttreSQL、MSSQL または Oracle から選ぶことが出来ます。
Yii は多数のデータベース製品に対するサポートを組み込みで持っています。
以下の説明では、話を単純にするために、MySQL を前提とします。 以下の説明では、話を単純にするために、MySQL を前提とします。
次に、データベースに `country` という名前のテーブルを作り、いくつかのサンプルデータを挿入します。 次に、データベースに `country` という名前のテーブルを作り、いくつかのサンプルデータを挿入します。
そうするために、次の SQL 文を実行することが出来ます: そうするために、次の SQL 文を実行することが出来ます
```sql ```sql
CREATE TABLE `country` ( CREATE TABLE `country` (
@ -47,8 +45,7 @@ INSERT INTO `country` VALUES ('RU','Russia',146934000);
INSERT INTO `country` VALUES ('US','United States',278357000); INSERT INTO `country` VALUES ('US','United States',278357000);
``` ```
この時点で、あなたは `yii2basic` という名前のデータベースを持ち、その中に三つのカラムを持つ `country` というテーブルを持っています。 この時点で、あなたは `yii2basic` という名前のデータベースを持ち、その中に三つのカラムを持つ `country` というテーブルがあり、`country` テーブルは 10 行のデータを持っている、ということになります。
そして、`country` テーブルは、10 行のデータを持っています。
DB 接続を構成する<a name="configuring-db-connection"></a> DB 接続を構成する<a name="configuring-db-connection"></a>
@ -58,8 +55,7 @@ DB 接続を構成する<a name="configuring-db-connection"></a>
(例えば、MySQL のための `pdo_mysql`) の両方をインストール済みであることを確認してください。 (例えば、MySQL のための `pdo_mysql`) の両方をインストール済みであることを確認してください。
アプリケーションがリレーショナルデータベースを使う場合、これは基本的な必要条件です。 アプリケーションがリレーショナルデータベースを使う場合、これは基本的な必要条件です。
これらがインストール済みなら、`config/db.php` というファイルを開いて、あなたのデータベースに適合するように これらがインストール済みなら、`config/db.php` というファイルを開いて、あなたのデータベースに適合するようにパラメータを変更してください。デフォルトでは、このファイルは下記の記述を含んでいます。
パラメータを変更してください。既定値では、このファイルは下記の記述を含んでいます:
```php ```php
<?php <?php
@ -73,15 +69,15 @@ return [
]; ];
``` ```
この `config/db.php` というファイルは典型的なファイルベースの [コンフィギュレーション](concept-configurations.md) ツールです。 この `config/db.php` というファイルは典型的なファイルベースの [構成情報](concept-configurations.md) ツールです。
このコンフィギュレーションファイルが [[yii\db\Connection]] インスタンスの作成と初期化に必要なパラメータを規定します。そして、 この構成情報ファイルが [[yii\db\Connection]] インスタンスの作成と初期化に必要なパラメータを規定します。そして、
[[yii\db\Connection]] インスタンスを通じて、背後のデータベースに対して SQL クエリを実行することが出来るようになります。 [[yii\db\Connection]] インスタンスを通じて、背後のデータベースに対する SQL クエリを実行することが出来るようになります。
上記のようにして構成された DB 接続は、アプリケーションコードの中で `Yii::$app->db` という式でアクセスすることが出来ます。 上記のようにして構成された DB 接続は、アプリケーションコードの中で `Yii::$app->db` という式でアクセスすることが出来ます。
> Info|情報: `config/db.php` は、メインのアプリケーションコンフィギュレーションファイルである `config/web.php` にインクルードされます。 > Info|情報: `config/db.php` は、メインのアプリケーション構成情報ファイルである `config/web.php` にインクルードされます。
この `config/web.php` が [アプリケーション](structure-applications.md) インスタンスが初期化される仕方を規定します。 この `config/web.php` が [アプリケーション](structure-applications.md) インスタンスが初期化される仕方を規定します。
更なる情報については、[コンフィギュレーション](concept-configurations.md) の節を参照してください。 詳しい情報については、[構成情報](concept-configurations.md) の節を参照してください。
アクティブレコードを作成する<a name="creating-active-record"></a> アクティブレコードを作成する<a name="creating-active-record"></a>
@ -105,9 +101,9 @@ class Country extends ActiveRecord
`Country` クラスは [[yii\db\ActiveRecord]] を拡張しています。この中には一つもコードを書く必要はありません。 `Country` クラスは [[yii\db\ActiveRecord]] を拡張しています。この中には一つもコードを書く必要はありません。
単に上記のコードだけで、Yii は関連付けられたテーブル名をクラス名から推測します。 単に上記のコードだけで、Yii は関連付けられたテーブル名をクラス名から推測します。
> Info|情報: クラス名とテーブル名を直接に合致させることが出来ない場合は、[[yii\db\ActiveRecord::tableName()]] メソッドをオーバーライドして、関連づけられたテーブル名を明示的に定することが出来ます。 > Info|情報: クラス名とテーブル名を直接に合致させることが出来ない場合は、[[yii\db\ActiveRecord::tableName()]] メソッドをオーバーライドして、関連づけられたテーブル名を明示的に定することが出来ます。
`Country` クラスを使うことによって、以下のコード断片で示すように、`country` テーブルの中のデータを簡単に操作することが出来ます: `Country` クラスを使うことによって、以下のコード断片で示すように、`country` テーブルの中のデータを簡単に操作することが出来ます
```php ```php
use app\models\Country; use app\models\Country;
@ -127,18 +123,16 @@ $country->save();
``` ```
> Info|情報: アクティブレコードは、オブジェクト指向の流儀でデータベースのデータにアクセスし、操作する強力な方法です。 > Info|情報: アクティブレコードは、オブジェクト指向の流儀でデータベースのデータにアクセスし、操作する強力な方法です。
[アクティブレコード](db-active-record.md) の節で、更に詳細な情報を得ることが出来ます。 [アクティブレコード](db-active-record.md) の節で、詳細な情報を得ることが出来ます。
もう一つの方法として、[データアクセスオブジェクト(DAO)](db-dao.md) と呼ばれる、より低レベルなデータアクセス方法を使って もう一つの方法として、[データアクセスオブジェクト](db-dao.md) と呼ばれる、より低レベルなデータアクセス方法を使ってデータベースを操作することも出来ます。
データベースを操作することも出来ます。
アクションを作成する<a name="creating-action"></a> アクションを作成する<a name="creating-action"></a>
-------------------- --------------------
国データをエンドユーザに見えるようにするために、新しいアクションを作成する必要があります。 国データをエンドユーザに見えるようにするために、新しいアクションを作成する必要があります。
これまでの節でしたように `site` コントローラの中に新しいアクションを置くのではなく、国データに関係する全てのアクションに これまでの節でしたように `site` コントローラの中に新しいアクションを置くのではなく、国データに関係する全てのアクションに限定した新しいコントローラを作成する方が理にかなうでしょう。
限定した新しいコントローラを作成する方が理にかなうでしょう。この新しいコントローラを `CountryController` と名付けます。 この新しいコントローラを `CountryController` と名付けます。そして、下記に示すように、`index` アクションをその中に作成します。
そして、下記に示すように、`index` アクションをその中に作成します。
```php ```php
@ -179,9 +173,9 @@ class CountryController extends Controller
`index` アクションは `Country::find()` を呼び出します。 `index` アクションは `Country::find()` を呼び出します。
このアクティブレコードのメソッドは DB クエリを構築して、`country` テーブルから全てのデータを読み出します。 このアクティブレコードのメソッドは DB クエリを構築して、`country` テーブルから全てのデータを読み出します。
一回のリクエストで返される国の数を制限するために、クエリは [[yii\data\Pagination]] オブジェクトの助けを借りてページ付けされます。 一回のリクエストで返される国の数を制限するために、クエリは [[yii\data\Pagination]] オブジェクトの助けを借りてページ付けされます。
`Pagination` オブジェクトは二つの目的に奉仕します: `Pagination` オブジェクトは二つの目的に奉仕します
* クエリによって表現される SQL 文に `offset` 句と `limit` 句をセットして、一度に一ページ分のデータだけ (1ページ最大5行)を返すようにします。 * クエリによって表現される SQL 文に `offset` 句と `limit` 句をセットして、一度に一ページ分のデータだけ (1ページ最大5行) を返すようにします。
* 次の項で説明されるように、一連のページボタンからなるページャをビューに表示するために使われます。 * 次の項で説明されるように、一連のページボタンからなるページャをビューに表示するために使われます。
コードの最後で、`index` アクションは `index` と言う名前のビューをレンダリングしていますが、このとき、国データはもちろん、そのページ付け情報もビューに渡されます。 コードの最後で、`index` アクションは `index` と言う名前のビューをレンダリングしていますが、このとき、国データはもちろん、そのページ付け情報もビューに渡されます。
@ -192,7 +186,7 @@ class CountryController extends Controller
最初に、`views` ディレクトリの下に `country` という名前のサブディレクトリを作ってください。 最初に、`views` ディレクトリの下に `country` という名前のサブディレクトリを作ってください。
このフォルダが `country` コントローラによって表示される全てのビューを保持するのに使われます。 このフォルダが `country` コントローラによって表示される全てのビューを保持するのに使われます。
`views/country` ディレクトリの中に、下記のコードを含む `index.php` という名前のファイルを作成します: `views/country` ディレクトリの中に、下記のコードを含む `index.php` という名前のファイルを作成します
```php ```php
<?php <?php
@ -214,15 +208,14 @@ use yii\widgets\LinkPager;
ビューは国データの表示に関連して二つの部分に分けられます。 ビューは国データの表示に関連して二つの部分に分けられます。
最初の部分では、提供された国データがたどられて、HTML の順序無しリストとしてレンダリングされます。 最初の部分では、提供された国データがたどられて、HTML の順序無しリストとしてレンダリングされます。
第二の部分では、アクションから渡されたページ付け情報を使って、[[yii\widgets\LinkPager]] 第二の部分では、アクションから渡されたページ付け情報を使って、[[yii\widgets\LinkPager]] ウィジェットがレンダリングされます。
ウィジェットがレンダリングされます。
`LinkPager` ウィジェットはページボタンのリストを表示します。ボタンのどれかをクリックすると、対応するページの国データが更新表示されます。 `LinkPager` ウィジェットはページボタンのリストを表示します。ボタンのどれかをクリックすると、対応するページの国データが更新表示されます。
試してみる<a name="trying-it-out"></a> 試してみる<a name="trying-it-out"></a>
---------- ----------
上記のコード全てがどのように動作するかを見るために、ブラウザで下記の URL をアクセスします: 上記のコード全てがどのように動作するかを見るために、ブラウザで下記の URL をアクセスします
``` ```
http://hostname/index.php?r=country/index http://hostname/index.php?r=country/index
@ -232,8 +225,8 @@ http://hostname/index.php?r=country/index
最初、ページは5つの国を表示しています。 最初、ページは5つの国を表示しています。
そして、国リストの下には、4つのボタンを持ったページャがあります。 そして、国リストの下には、4つのボタンを持ったページャがあります。
"2" のボタンをクリックすると、ページはデータベースから次の5つの国、すなわち、2ページ目のレコードを表示します。 "2" のボタンをクリックすると、ページはデータベースにある次の5つの国、すなわち、2ページ目のレコードを表示します。
より注意深く観察すると、ブラウザの URL も次のように変ったことに気付くでしょう: 注意深く観察すると、ブラウザの URL も次のように変ったことに気付くでしょう
``` ```
http://hostname/index.php?r=country/index&page=2 http://hostname/index.php?r=country/index&page=2
@ -241,8 +234,8 @@ http://hostname/index.php?r=country/index&page=2
舞台裏では、[[yii\data\Pagination|Pagination]] が、データセットをページ付けするのに必要な全ての機能を提供しています。 舞台裏では、[[yii\data\Pagination|Pagination]] が、データセットをページ付けするのに必要な全ての機能を提供しています。
* 初、[[yii\data\Pagination|Pagination]] は、1ページ目を表しています。 * 初期状態では、[[yii\data\Pagination|Pagination]] は、1ページ目を表しています。
これは、国の SELECT クエリが `LIMIT 5 OFFSET 0` という句を伴うことを示しています。 これを反映して、国の SELECT クエリは `LIMIT 5 OFFSET 0` という句を伴うことになります。
その結果、最初の5つの国が取得されて表示されます。 その結果、最初の5つの国が取得されて表示されます。
* [[yii\widgets\LinkPager|LinkPager]] ウィジェットは、[[yii\data\Pagination::createUrl()|Pagination]] によって作成された URL を使ってページボタンをレンダリングします。 * [[yii\widgets\LinkPager|LinkPager]] ウィジェットは、[[yii\data\Pagination::createUrl()|Pagination]] によって作成された URL を使ってページボタンをレンダリングします。
URL は、別々のページ番号を表現する `page` というクエリパラメータを含んだものになります。 URL は、別々のページ番号を表現する `page` というクエリパラメータを含んだものになります。
@ -259,4 +252,4 @@ http://hostname/index.php?r=country/index&page=2
次の節では、[Gii](tool-gii.md) と呼ばれる強力なコード生成ツールを使う方法を学びます。 次の節では、[Gii](tool-gii.md) と呼ばれる強力なコード生成ツールを使う方法を学びます。
このツールは、データベーステーブルのデータを取り扱うための「作成・読出し・更新・削除 (CRUD)」操作のような、通常必要とされることが多いいくつかの機能の迅速な実装を手助けしてくれるものです。 このツールは、データベーステーブルのデータを取り扱うための「作成・読出し・更新・削除 (CRUD)」操作のような、通常必要とされることが多いいくつかの機能の迅速な実装を手助けしてくれるものです。
実際のところ、あなたがたった今書いたばかりのコードは、Gii ツールを使って Yii によって自動的に生成することが出来ます。 実際のところ、あなたがたった今書いたばかりのコードは、Gii ツールを使えば、全部、Yii が自動的に生成してくれるものです。

61
docs/guide-ja/start-forms.md

@ -1,24 +1,24 @@
フォームを扱う フォームを扱う
============== ==============
この節では、ユーザからデータを取得するフォームを持つ新しいページを作る方法を説明します。 この節では、ユーザからデータを取得するためのフォームを持つ新しいページを作る方法を説明します。
このページは名前の入力フィールドとメールの入力フィールドを持つフォームを表示します。 このページは名前の入力フィールドとメールの入力フィールドを持つフォームを表示します。
ユーザからこれら二つの情報を受け取った後、ページは確認のために入力された値をエコーバックします。 ユーザからこれら二つの情報を受け取った後、ページは入力された値を確認のためにエコーバックします。
この目的を達するために、一つの [アクション](structure-controllers.md) と 二つの [ビュー](structure-views.md) を作成する以外に、 この目的を達するために、一つの [アクション](structure-controllers.md) と 二つの [ビュー](structure-views.md) を作成する以外に、
一つの [モデル](structure-models.md) をも作成します。 一つの [モデル](structure-models.md) をも作成します。
このチュートリアルを通じて、次のことをする方法を学びます: このチュートリアルを通じて、次の方法を学びます。
* フォームを通じてユーザが入力したデータを表す [モデル](structure-models.md) を作成する * フォームを通じてユーザによって入力されるデータを表す [モデル](structure-models.md) を作成する方法
* 入力されたデータを検証する規則を宣言する * 入力されたデータを検証する規則を宣言する方法
* [ビュー](structure-views.md) の中で HTML フォームを構築する * [ビュー](structure-views.md) の中で HTML フォームを構築する方法
モデルを作成する<a name="creating-model"></a> モデルを作成する<a name="creating-model"></a>
---------------- ----------------
ユーザからの入力を要求するデータは下に示されているように `EntryForm` モデルクラスとして表現され、`models/EntryForm.php` というファイルに保存されます。 ユーザに入力してもらうデータは、下に示されているように `EntryForm` モデルクラスとして表現され、`models/EntryForm.php` というファイルに保存されます。
クラスファイルの命名規約についての詳細は [クラスのオートロード](concept-autoloading.md) の節を参照してください。 クラスファイルの命名規約についての詳細は [クラスのオートロード](concept-autoloading.md) の節を参照してください。
```php ```php
@ -49,15 +49,15 @@ class EntryForm extends Model
> Info|情報: [[yii\base\Model]] はデータベーステーブルと関連*しない*モデルクラスの親として使われます。 > Info|情報: [[yii\base\Model]] はデータベーステーブルと関連*しない*モデルクラスの親として使われます。
データベーステーブルと対応するモデルクラスでは、通常は [[yii\db\ActiveRecord]] が親になります。 データベーステーブルと対応するモデルクラスでは、通常は [[yii\db\ActiveRecord]] が親になります。
`EntryForm` クラスは二つのパブリックメンバー、`name` と `email` を持っており、これらがユーザによって入力されデータを保管するのに使われます。 `EntryForm` クラスは二つのパブリックメンバー、`name` と `email` を持っており、これらがユーザによって入力されデータを保管するのに使われます。
このクラスはまた `rules()` という名前のメソッドを持っています。このメソッドがデータを検証する一連の規則を返します。 このクラスはまた `rules()` という名前のメソッドを持っています。このメソッドがデータを検証する一連の規則を返します。
上記で宣言されている検証規則は次のことを述べています: 上記で宣言されている検証規則は次のことを述べています
* `name``email` は、ともに値を要求される * `name``email` は、ともに値を要求される
* `email` のデータは構文的に正当なメールアドレスでなければならない * `email` のデータは構文的に正当なメールアドレスでなければならない
`EntryForm` オブジェクトにユーザが入力したデータを投入した後、[[yii\base\Model::validate()|validate()]] を呼んでデータ検証ルーチンを始動することが出来ます。 ユーザによって入力されたデータを `EntryForm` オブジェクトに投入した後、[[yii\base\Model::validate()|validate()]] を呼んでデータ検証ルーチンを始動することが出来ます。
データ検証が失敗すると [[yii\base\Model::hasErrors|hasErrors]] プロパティが true に設定され データ検証が失敗すると [[yii\base\Model::hasErrors|hasErrors]] プロパティが true に設定されます。
そして、[[yii\base\Model::getErrors|errors]] を通じて、どのような検証エラーが発生したかを知ることが出来ます。 そして、[[yii\base\Model::getErrors|errors]] を通じて、どのような検証エラーが発生したかを知ることが出来ます。
@ -99,32 +99,33 @@ class SiteController extends Controller
$model = new EntryForm; $model = new EntryForm;
if ($model->load(Yii::$app->request->post()) && $model->validate()) { if ($model->load(Yii::$app->request->post()) && $model->validate()) {
// $model に受け取ったデータを検証する // $model に有効なデータを受け取った場合
// ここで $model について意味のあることを何かする ... // ここで $model について何か意味のあることをする ...
return $this->render('entry-confirm', ['model' => $model]); return $this->render('entry-confirm', ['model' => $model]);
} else { } else {
// ページの初期表示か、または、何か検証エラーがある // ページの初期表示か、または、何か検証エラーがある場合
return $this->render('entry', ['model' => $model]); return $this->render('entry', ['model' => $model]);
} }
} }
} }
``` ```
アクションは最初に `EntryForm` オブジェクトを生成します。そして、次に、モデルに `$_POST` のデータ、 アクションは最初に `EntryForm` オブジェクトを生成します。そして、次に、モデルに `$_POST` のデータ、Yii においては [[yii\web\Request::post()]]
Yii においては [[yii\web\Request::post()]] によって提供されるデータを投入しようと試みます。 によって提供されるデータを投入しようと試みます。
モデルへのデータ投入が成功した場合(つまり、ユーザが HTML フォームを送信した場合)、アクションは モデルへのデータ投入が成功した場合(つまり、ユーザが HTML フォームを送信した場合)、アクションは[[yii\base\Model::validate()|validate()]]
[[yii\base\Model::validate()|validate()]] を呼んで、入力された値が有効なものであることを確認します。 を呼んで、入力された値が有効なものであることを確認します。
> Info|情報: `Yii::$app` という式は [アプリケーション](structure-applications.md) インスタンスを表現します。 > Info|情報: `Yii::$app` という式は [アプリケーション](structure-applications.md) インスタンスを表現します。
これはグローバルにアクセス可能なシングルトンです。これは、また、特定の機能性をサポートする `request` これはグローバルにアクセス可能なシングルトンです。
`response`, `db` などのコンポーネントを提供する [サービスロケータ](concept-service-locator.md) でもあります。 これは、また、特定の機能性をサポートする `request`、`response`、`db` などのコンポーネントを提供する
上記のコードでは、アプリケーションインスタンスの`request` コンポーネントが `$_POST` データにアクセスするために使われています。 [サービスロケータ](concept-service-locator.md) でもあります。
上記のコードでは、アプリケーションインスタンスの `request` コンポーネントが `$_POST` データにアクセスするために使われています。
すべてが適正である場合、アクションは `entry-confirm` という名前のビューを表示して、データの送信が成功したことをユーザに確認させます。 すべてが適正である場合、アクションは `entry-confirm` という名前のビューを表示して、データの送信が成功したことをユーザに確認させます。
データが送信されなかったり、データがエラーを含んでいたりする場合は、`entry` ビューが表示され、その中で HTML フォームが データが送信されなかったり、データがエラーを含んでいたりする場合は、`entry` ビューが表示され、その中で HTML フォームが
(もし有れば)検証エラーのメッセージとともに表示されます。 (もし有れば) 検証エラーのメッセージとともに表示されます。
> Note|注意: この簡単な例では、有効なデータ送信に対して単純に確認ページを表示しています。実際の仕事では、 > Note|注意: この簡単な例では、有効なデータ送信に対して単純に確認ページを表示しています。実際の仕事では、
[フォーム送信の諸問題](http://en.wikipedia.org/wiki/Post/Redirect/Get) を避けるために、 [フォーム送信の諸問題](http://en.wikipedia.org/wiki/Post/Redirect/Get) を避けるために、
@ -143,7 +144,7 @@ Yii においては [[yii\web\Request::post()]] によって提供されるデ
<?php <?php
use yii\helpers\Html; use yii\helpers\Html;
?> ?>
<p>あなたは次の情報を入力しました:</p> <p>あなたは次の情報を入力しました</p>
<ul> <ul>
<li><label>名前</label>: <?= Html::encode($model->name) ?></li> <li><label>名前</label>: <?= Html::encode($model->name) ?></li>
@ -181,7 +182,7 @@ use yii\widgets\ActiveForm;
試してみる<a name="trying-it-out"></a> 試してみる<a name="trying-it-out"></a>
---------- ----------
どのように動作するかを見るために、ブラウザで下記の URL をアクセスしてください: どのように動作するかを見るために、ブラウザで下記の URL をアクセスしてください
``` ```
http://hostname/index.php?r=site/entry http://hostname/index.php?r=site/entry
@ -190,7 +191,7 @@ http://hostname/index.php?r=site/entry
二つの入力フィールドを持つフォームを表示するページが表示されるでしょう。 二つの入力フィールドを持つフォームを表示するページが表示されるでしょう。
それぞれの入力フィールドの前には、どんなデータを入力すべきかを示すラベルがあります。 それぞれの入力フィールドの前には、どんなデータを入力すべきかを示すラベルがあります。
何も入力せずに、あるいは、無効なメールアドレスを入力して送信ボタンをクリックすると、 何も入力せずに、あるいは、無効なメールアドレスを入力して送信ボタンをクリックすると、
それぞれ問題のある入力フィールドの続きにエラーメッセージが表示されます。 それぞれ問題のある入力フィールドの後ろにエラーメッセージが表示されます。
![検証エラーのあるフォーム](images/start-form-validation.png) ![検証エラーのあるフォーム](images/start-form-validation.png)
@ -201,13 +202,11 @@ http://hostname/index.php?r=site/entry
### 魔法の説明<a name="magic-explained"></a> ### 魔法の説明<a name="magic-explained"></a>
あなたは、舞台裏で HTML フォームがどのように動いているのか、不思議に思うかも知れません。なぜなら、 あなたは、舞台裏で HTML フォームがどのように動いているのか、不思議に思うかも知れません。
フォームが、ほとんど魔法のように、各入力フィールドのラベルを表示し、データを正しく入力しない場合には なぜなら、フォームが、ほとんど魔法のように、各入力フィールドのラベルを表示し、データを正しく入力しなかった場合には、ページをリロードすることなく、エラーメッセージを表示するからです。
ページをリロードすることなくエラーメッセージを表示するからです。
そう、データの検証は、最初に JavaScript を使ってクライアントサイドで実行され、次に PHP によってサーバーサイドで実行されます。 そう、データの検証は、最初に JavaScript を使ってクライアントサイドで実行され、次に PHP によってサーバーサイドで実行されます。
[[yii\widgets\ActiveForm]] は、賢いことに、`EntryForm` で宣言した検証規則を抽出し、それを実行可能な JavaScript コードに変換して、 [[yii\widgets\ActiveForm]] は、賢いことに、`EntryForm` で宣言した検証規則を抽出し、それを実行可能な JavaScript コードに変換して、JavaScript を使ってデータ検証を実行します。
JavaScript を使ってデータ検証を実行します。
ブラウザで JavaScript を無効にした場合でも、`actionEntry()` メソッドで示されているように、サーバーサイドでの検証は実行されます。 ブラウザで JavaScript を無効にした場合でも、`actionEntry()` メソッドで示されているように、サーバーサイドでの検証は実行されます。
これにより、どのような状況であっても、データの有効性が保証されます。 これにより、どのような状況であっても、データの有効性が保証されます。
@ -217,7 +216,7 @@ JavaScript を使ってデータ検証を実行します。
入力フィールドのラベルは、モデルのプロパティ名を使用して、`field()` メソッドによって生成されます。 入力フィールドのラベルは、モデルのプロパティ名を使用して、`field()` メソッドによって生成されます。
例えば、`name` というプロパティから `Name` というラベルが生成されます。 例えば、`name` というプロパティから `Name` というラベルが生成されます。
ビューの中で、下記のコードのように、ラベルをカスタマイズすることも出来ます: ビューの中で、下記のコードのように、ラベルをカスタマイズすることも出来ます
```php ```php
<?= $form->field($model, 'name')->label('お名前') ?> <?= $form->field($model, 'name')->label('お名前') ?>

63
docs/guide-ja/start-gii.md

@ -1,24 +1,23 @@
Gii でコードを生成する Gii でコードを生成する
====================== ======================
この節では、[Gii](tool-gii.md) を使って、ウェブサイトの一般的な機能のいくつかを実装するコードを この節では、[Gii](tool-gii.md) を使って、ウェブサイトの一般的な機能のいくつかを実装するコードを自動的に生成する方法を説明します。
自動的に生成する方法を説明します。Gii を使ってコードを自動生成することは、Gii のウェブページに Gii を使ってコードを自動生成することは、Gii のウェブページに表示される指示に対して正しい情報を入力するだけのことです。
表示される指示に対して正しい情報を入力するだけのことです。
このチュートリアルを通じて、次のことをする方法を学びます: このチュートリアルを通じて、次のことを学びます。
* アプリケーションで Gii を有効にする * アプリケーションで Gii を有効にする方法
* Gii を使って、アクティブレコードのクラスを生成する * Gii を使って、アクティブレコードのクラスを生成する方法
* Gii を使って、DB テーブルの CRUD 操作を実装するコードを生成する * Gii を使って、DB テーブルの CRUD 操作を実装するコードを生成する方法
* Gii によって生成されるコードをカスタマイズする * Gii によって生成されるコードをカスタマイズする方法
Gii を開始する<a name="starting-gii"></a> Gii を開始する<a name="starting-gii"></a>
-------------- --------------
[Gii](tool-gii.md) は Yii の [モジュール](structure-modules.md) として提供されます。 [Gii](tool-gii.md) は Yii の [モジュール](structure-modules.md) として提供されています。
Gii は、アプリケーションの [[yii\base\Application::modules|modules]] プロパティの中で構成することで有効にすることが出来ます。 Gii は、アプリケーションの [[yii\base\Application::modules|modules]] プロパティの中で構成することで有効にすることが出来ます。
アプリケーションを生成した仕方にもよりますが、`config/web.php` のコンフィギュレーションファイルの中に、多分、下記のコードが既に提供されているでしょう: アプリケーションを生成した仕方にもよりますが、`config/web.php` の構成情報ファイルの中に、多分、下記のコードが既に提供されているでしょう。
```php ```php
$config = [ ... ]; $config = [ ... ];
@ -29,8 +28,8 @@ if (YII_ENV_DEV) {
} }
``` ```
上記のコンフィギュレーションは、[開発環境](concept-configurations.md#environment-constants) において、アプリケーションは 上記の構成情報は、[開発環境](concept-configurations.md#environment-constants) において、アプリケーションは
`gii` という名前のモジュールをインクルードすべきこと、そして `gii` は [[yii\gii\Module]] というクラスのものであることを記述しています。 `gii` という名前のモジュールをインクルードすべきこと、そして `gii` は [[yii\gii\Module]] というクラスであることを記述しています。
アプリケーションの [エントリスクリプト](structure-entry-scripts.md) である `web/index.php` をチェックすると、次の行があることに気付くでしょう。 アプリケーションの [エントリスクリプト](structure-entry-scripts.md) である `web/index.php` をチェックすると、次の行があることに気付くでしょう。
これは本質的には `YII_ENV_DEV` を true に設定するものです。 これは本質的には `YII_ENV_DEV` を true に設定するものです。
@ -39,15 +38,15 @@ if (YII_ENV_DEV) {
defined('YII_ENV') or define('YII_ENV', 'dev'); defined('YII_ENV') or define('YII_ENV', 'dev');
``` ```
この行のおかげで、アプリケーションは開発モードになり、上記のコンフィギュレーションによって、Gii が有効になります。 この行のおかげで、アプリケーションは開発モードになっており、上記の構成情報によって、Gii が既に有効になっています。
これで、下記の URL によって Gii にアクセスすることが出来ます: これで、下記の URL によって Gii にアクセスすることが出来ます
``` ```
http://hostname/index.php?r=gii http://hostname/index.php?r=gii
``` ```
> Note|注意: ローカルホスト以外のマシンから Gii にアクセスしようとすると、既定ではセキュリティ上の > Note|注意: ローカルホスト以外のマシンから Gii にアクセスしようとすると、既定ではセキュリティ上の理由でアクセスが拒否されます。
> 目的からアクセスが拒否されます。下記のように Gii を構成して、許可される IP アドレスを追加することが出来ます。 > 下記のように Gii を構成して、許可される IP アドレスを追加することが出来ます。
> >
```php ```php
'gii' => [ 'gii' => [
@ -63,7 +62,7 @@ http://hostname/index.php?r=gii
------------------------------------ ------------------------------------
Gii を使ってアクティブレコードのクラスを生成するためには、(Gii のインデックスページのリンクをクリックして) "Model Generator" を選びます。 Gii を使ってアクティブレコードのクラスを生成するためには、(Gii のインデックスページのリンクをクリックして) "Model Generator" を選びます。
そして、次のようにフォームに入力します: そして、次のようにフォームに入力します
* Table Name: `country` * Table Name: `country`
* Model Class: `Country` * Model Class: `Country`
@ -74,26 +73,24 @@ Gii を使ってアクティブレコードのクラスを生成するために
そうすると、結果として作成されるクラスファイルのリストに `models/Country.php` が挙ってきます。 そうすると、結果として作成されるクラスファイルのリストに `models/Country.php` が挙ってきます。
クラスファイルの名前をクリックすると、内容をプレビュー出来ます。 クラスファイルの名前をクリックすると、内容をプレビュー出来ます。
Gii を使うときに、既に同じファイルを作成していて、それを上書きしようとしている場合は、 Gii を使うときに、既に同じファイルを作成していて、それを上書きしようとしている場合は、ファイル名の隣の `diff`
ファイル名の隣の `diff` ボタンをクリックして、生成されようとしているコードと既存のバージョンの ボタンをクリックして、生成されようとしているコードと既存のバージョンの違いを見てください。
違いを見てください。
![Model Generator のプレビュー](images/start-gii-model-preview.png) ![Model Generator のプレビュー](images/start-gii-model-preview.png)
既存のファイルを上書きしようとしているときは、"overwrite" の隣のチェックボックスをチェックしてから "Generate" ボタンをクリックします。 既存のファイルを上書きしようとしているときは、"overwrite" の隣のチェックボックスをチェックしてから "Generate" ボタンをクリックします。
新しいファイルを作成しようとしているときは、単に "Generate" を押せば大丈夫です。 新しいファイルを作成しようとしているときは、単に "Generate" を押せば大丈夫です。
次に、コードの生成が成功したことを示す確認ページが表示されます。既存のファイルがあった場合は、 次に、コードの生成が成功したことを示す確認ページが表示されます。
それが新しく生成されたコードで上書きされたことを示すメッセージも同じく表示されます。 既存のファイルがあった場合は、それが新しく生成されたコードで上書きされたことを示すメッセージも同じく表示されます。
CRUD コードを生成する<a name="generating-crud"></a> CRUD コードを生成する<a name="generating-crud"></a>
--------------------- ---------------------
CRUD は Create(作成)、Read(読出し)、Update(更新)、そして Delete(削除) を意味しており、 CRUD は Create(作成)、Read(読出し)、Update(更新)、そして Delete(削除) を意味しており、ほとんどのウェブサイトでデータを扱うときによく用いられる4つのタスクを表しています。
ほとんどのウェブサイトでデータを扱うときによく用いられる4つのタスクを表しています。
Gii を使って CRUD 機能を作成するためには、(Gii のインデックスページのリンクをクリックして) "CRUD Generator" を選びます。 Gii を使って CRUD 機能を作成するためには、(Gii のインデックスページのリンクをクリックして) "CRUD Generator" を選びます。
「国リスト」のサンプルのためには、以下のようにフォームに入力します: 「国リスト」のサンプルのためには、以下のようにフォームに入力します
* Model Class: `app\models\Country` * Model Class: `app\models\Country`
* Search Model Class: `app\models\CountrySearch` * Search Model Class: `app\models\CountrySearch`
@ -106,31 +103,31 @@ Gii を使って CRUD 機能を作成するためには、(Gii のインデッ
![CRUD Generator のプレビュー](images/start-gii-crud-preview.png) ![CRUD Generator のプレビュー](images/start-gii-crud-preview.png)
以前に(ガイドのデータベースの節で)`controllers/CountryController.php` と 以前に(ガイドのデータベースの節で)`controllers/CountryController.php` と `views/country/index.php` のファイルを作成していた場合は、それらを置き換えるために
`views/country/index.php` のファイルを作成していた場合は、それらを置き換えるために "overwrite" の "overwrite" のチェックボックスをチェックしてください。(以前のバージョンは フル機能の CRUD をサポートしていません。)
チェックボックスをチェックしてください。(以前のバージョンは フル機能の CRUD をサポートしていません。)
試してみる<a name="trying-it-out"></a> 試してみる<a name="trying-it-out"></a>
---------- ----------
どのように動作するかを見るために、ブラウザを使って下記の URL にアクセスしてください: どのように動作するかを見るために、ブラウザを使って下記の URL にアクセスしてください
``` ```
http://hostname/index.php?r=country/index http://hostname/index.php?r=country/index
``` ```
データグリッドがデータベーステーブルから取得した国を表示しているページが表示されます。 データグリッドがデータベーステーブルから取得した国を表示しているページが表示されます。
グリッドをソートしたり、カラムのヘッダに検索条件を入力してグリッドをフィルターしたりすることが出来ます。 グリッドをソートしたり、カラムのヘッダに検索条件を入力してグリッドにフィルタを適用したりすることが出来ます。
グリッドに表示されているそれぞれの国について、詳細を見たり、更新したり、または削除したりすることが出来ます。また、グリッドの上にある "Create Country" ボタンをクリックすると、新しい国データを作成するためのフォームが利用に供されます。 グリッドに表示されているそれぞれの国について、詳細を見たり、更新したり、または削除したりすることが出来ます。
また、グリッドの上にある "Create Country" ボタンをクリックすると、新しい国データを作成するためのフォームが利用に供されます。
![国リストのデータグリッド](images/start-gii-country-grid.png) ![国リストのデータグリッド](images/start-gii-country-grid.png)
![国データを更新する](images/start-gii-country-update.png) ![国データを更新する](images/start-gii-country-update.png)
下記が Gii によって生成されるファイルのリストです。 下記が Gii によって生成されるファイルのリストです。
これらの機能がどのように実装されているかを調査したい場合、また、これらの機能をカスタマイズしたいときに参照してください: これらの機能がどのように実装されているかを調査したい場合、また、これらの機能をカスタマイズしたいときに参照してください
* Controller: `controllers/CountryController.php` * Controller: `controllers/CountryController.php`
* Models: `models/Country.php` and `models/CountrySearch.php` * Models: `models/Country.php` and `models/CountrySearch.php`
@ -138,7 +135,7 @@ http://hostname/index.php?r=country/index
> Info|情報: Gii は非常にカスタマイズしやすく拡張しやすいコード生成ツールとして設計されています。 > Info|情報: Gii は非常にカスタマイズしやすく拡張しやすいコード生成ツールとして設計されています。
これを賢く使うと、アプリケーションの開発速度を大いに高めることが出来ます。 これを賢く使うと、アプリケーションの開発速度を大いに高めることが出来ます。
更なる詳細は、[Gii](tool-gii.md) の節を参照してください。 詳細については、[Gii](tool-gii.md) の節を参照してください。
まとめ<a name="summary"></a> まとめ<a name="summary"></a>

42
docs/guide-ja/start-hello.md

@ -1,24 +1,24 @@
「こんにちは」と言う 「こんにちは」と言う
==================== ====================
この節では、アプリケーションに新しい「こんにちは」というページを作成する方法を説明します。 この節では、アプリケーションに「こんにちは」という新しいページを作成する方法を説明します。
この目的を達するために、[アクション](structure-controllers.md#creating-actions) と [ビュー](structure-views.md) を作成することになります: この目的を達するために、[アクション](structure-controllers.md#creating-actions) と [ビュー](structure-views.md) を作成することになります
* アプリケーションがこのページへのリクエストをそのアクションに送付し、 * アプリケーションがこのページへのリクエストをそのアクションに送付し、
* 次にそのアクションが "Hello" という言葉をエンドユーザに示すビューを表示します。 * 次にそのアクションが "Hello" という言葉をエンドユーザに示すビューを表示します。
このチュートリアルを通じて、次の三つのことを学びます: このチュートリアルを通じて、三つのことを学びます。
1. リクエストに応える [アクション](structure-controllers.md) をどのようにして作るか、 1. リクエストに応える [アクション](structure-controllers.md) を作成する方法
2. レスポンスの内容を構成する [ビュー](structure-views.md) をどのようにして作るか、そして、 2. レスポンスの内容を構成する [ビュー](structure-views.md) を作成する方法
3. アプリケーションはどのようにしてリクエストを [アクション](structure-controllers.md#creating-actions) に送付するか。 3. アプリケーションリクエストを [アクション](structure-controllers.md#creating-actions) に送付する仕組み
アクションを作成する<a name="creating-action"></a> アクションを作成する<a name="creating-action"></a>
-------------------- --------------------
「こんにちは」のタスクのために、`message` パラメータをリクエストから読んでそのメッセージをユーザに表示して返す `say` [アクション](structure-controllers.md#creating-actions) を作ります。 「こんにちは」のタスクのために、`message` パラメータをリクエストから読んでそのメッセージをユーザに表示して返す `say` [アクション](structure-controllers.md#creating-actions) を作ります。
リクエストが `message` パラメータを提供しない場合は、このアクションは既定値として "Hello" というメッセージを表示するものとします。 リクエストが `message` パラメータを提供しない場合は、アクションは既定値として "Hello" というメッセージを表示するものとします。
> Info|情報: [アクション](structure-controllers.md#creating-actions) は、エンドユーザが直接に参照して実行できるオブジェクトです。 > Info|情報: [アクション](structure-controllers.md#creating-actions) は、エンドユーザが直接に参照して実行できるオブジェクトです。
アクションは [コントローラ](structure-controllers.md) によってグループ化されます。 アクションは [コントローラ](structure-controllers.md) によってグループ化されます。
@ -27,7 +27,7 @@
アクションは [コントローラ](structure-controllers.md) の中で宣言されなければなりません。 アクションは [コントローラ](structure-controllers.md) の中で宣言されなければなりません。
話を簡単にするために、`say` アクションを既存の `SiteController` の中で宣言しましょう。 話を簡単にするために、`say` アクションを既存の `SiteController` の中で宣言しましょう。
このコントローラは `controllers/SiteController.php` というクラスファイルの中で定義されています。 このコントローラは `controllers/SiteController.php` というクラスファイルの中で定義されています。
次のようにして、新しいアクションを書き始めます: 次のようにして、新しいアクションを書き始めます
```php ```php
<?php <?php
@ -47,9 +47,9 @@ class SiteController extends Controller
} }
``` ```
上記のコードで、`say` アクションは `SiteController` クラスの中で `actionSay` という名前のメソッドとして定義されています。 上記のコードで、`SiteController` クラスの中で、`say` アクションが `actionSay` という名前のメソッドとして定義されています。
Yii はコントローラクラスの中でアクションのメソッドとアクションでないメソッドを区別するために、`action` という接頭辞を使います。 Yii はコントローラクラスの中でアクションのメソッドとアクションでないメソッドを区別するために、`action` という接頭辞を使います。
`action` という接頭辞の後名前がアクション ID にマップされます。 `action` という接頭辞の後に続く名前がアクション ID にマップされます。
アクションを命名するについては、Yii がアクション ID をどのように取り扱うかを知っているべきです。 アクションを命名するについては、Yii がアクション ID をどのように取り扱うかを知っているべきです。
アクション ID は常に小文字で参照されます。 アクション ID は常に小文字で参照されます。
@ -57,16 +57,16 @@ Yii はコントローラクラスの中でアクションのメソッドとア
アクションメソッドの名前は、アクション ID からダッシュを全て削除し、各単語の先頭の文字を大文字にした結果に `action` という接頭辞を付けたものとします。 アクションメソッドの名前は、アクション ID からダッシュを全て削除し、各単語の先頭の文字を大文字にした結果に `action` という接頭辞を付けたものとします。
例えば、アクション ID `create-comment` に対応するアクションメソッド名は `actionCreateComment` となります。 例えば、アクション ID `create-comment` に対応するアクションメソッド名は `actionCreateComment` となります。
私たちの例では、このアクションメソッドは `$message` というパラメータを取ります 私たちの例では、このアクションメソッドは `"Hello"` という既定値をもつ `$message` というパラメータを取ります
そして、このパラメータは `"Hello"` という既定値を取ります (PHP で関数やメソッドの引数に既定値をセットするのと全く同じ方法です)。
(PHP で関数やメソッドの引数について既定値をセットするのと全く同じ方法を使います)。 アプリケーションは、リクエストを受け取ったとき、当該リクエストの処理を `say` アクションが担当すべきであると決定した場合は、
アプリケーションは、リクエストを受け取って、当該リクエストの処理を `say` アクションに任せると決定した場合、リクエストの中に同じ名前の付いたパラメータがあれば、そをこのパラメータに代入します。 リクエストの中に同じ名前の付いたパラメータがあれば、その値をこのパラメータに代入します。
言い換えれば、もしリクエストに `"GoodBye"` という値の `message` パラメータが入っていれば、アクションの `$message` 変数にその値が割り当てられます。 言い換えれば、もしリクエストに `"GoodBye"` という値の `message` パラメータが入っていれば、アクションの `$message` 変数にその値が割り当てられます。
このアクションメソッドの中では、[[yii\web\Controller::render()|render()]] が呼ばれて `say` と言う名前の [ビュー](structure-views.md) ファイルがレンダリングされます。 このアクションメソッドの中では、[[yii\web\Controller::render()|render()]] が呼ばれて `say` と言う名前の [ビュー](structure-views.md) ファイルがレンダリングされます。
`message` パラメータも同時にビューに渡され、そこで使用されます。 `message` パラメータも同時にビューに渡され、そこで使用されます。
レンダリング結果はアクションメソッドによって返されます。 レンダリング結果はアクションメソッドによって返されます。
返された結果はアプリケーションによって受け取られ、ブラウザ上でエンドユーザに(完全な HTML ページの一部として)表示されます。 返された結果はアプリケーションによって受け取られ、ブラウザ上でエンドユーザに (完全な HTML ページの一部として) 表示されます。
ビューを作成する<a name="creating-view"></a> ビューを作成する<a name="creating-view"></a>
@ -98,7 +98,7 @@ use yii\helpers\Html;
試してみる<a name="trying-it-out"></a> 試してみる<a name="trying-it-out"></a>
---------- ----------
アクションとビューを作成したら、新しいページに下記の URL でアクセスしてみましょう: アクションとビューを作成したら、下記の URL で新しいページにアクセスすることが出来ます。
``` ```
http://hostname/index.php?r=site/say&message=Hello+World http://hostname/index.php?r=site/say&message=Hello+World
@ -106,11 +106,11 @@ http://hostname/index.php?r=site/say&message=Hello+World
![Hello World](images/start-hello-world.png) ![Hello World](images/start-hello-world.png)
この URL は "Hello World" を表示するページになります。 この URL は、結果として、"Hello World" を表示するページになります。
このページはアプリケーションの他のページと同じヘッダとフッタを共有します。 このページはアプリケーションの他のページと同じヘッダとフッタを共有します。
URL から `message` パラメータを省略すると、"Hello" だけを表示するページを見ることになるでしょう。 URL から `message` パラメータを省略すると、"Hello" だけを表示するページを見ることになるでしょう。
これは、`message` が `actionSay()` メソッドにパラメータとして渡され、省略された場合には、既定値である `"Hello"` が代りに使われるからです。 これは、`message` が `actionSay()` メソッドにパラメータとして渡されるものでありそれが省略された場合には、既定値である `"Hello"` が代りに使われるからです。
> Info|情報: 新しいページは他のページと同じヘッダとフッタを共有しますが、それは [[yii\web\Controller::render()|render()]] メソッドが `say` ビューの結果をいわゆる [レイアウト](structure-views.md#layouts) に自動的に埋め込むからです。 > Info|情報: 新しいページは他のページと同じヘッダとフッタを共有しますが、それは [[yii\web\Controller::render()|render()]] メソッドが `say` ビューの結果をいわゆる [レイアウト](structure-views.md#layouts) に自動的に埋め込むからです。
レイアウトは、この場合、`views/layouts/main.php` にあります。 レイアウトは、この場合、`views/layouts/main.php` にあります。
@ -118,7 +118,7 @@ URL から `message` パラメータを省略すると、"Hello" だけを表示
上記の URL の `r` パラメータについて、さらに説明が必要でしょう。 上記の URL の `r` パラメータについて、さらに説明が必要でしょう。
これは [ルート](runtime-routing.md)、すなわち、特定のアクションを指し示すアプリケーション全体で一意な ID を表します。 これは [ルート](runtime-routing.md)、すなわち、特定のアクションを指し示すアプリケーション全体で一意な ID を表します。
ルートの書式は `ControllerID/ActionID` です。 ルートの書式は `ControllerID/ActionID` です。
アプリケーションはリクエストを受け取ると、このパラメータをチェックし、`ControllerID` の部分を使って、このリクエストを処理するためにどのコントローラクラスのインスタンスを作成すべきかを決定します。 アプリケーションはリクエストを受け取ると、このパラメータ `r` をチェックし、`ControllerID` の部分を使って、このリクエストを処理するためにどのコントローラクラスのインスタンスを作成すべきかを決定します。
そして、コントローラは `ActionID` の部分を使って、実際の仕事をするためにどのアクションを呼び出すべきかを決定します。 そして、コントローラは `ActionID` の部分を使って、実際の仕事をするためにどのアクションを呼び出すべきかを決定します。
この例で言えば、`site/say` というルートは、`SiteController` コントローラクラスと `say` アクションとして解決されます。 この例で言えば、`site/say` というルートは、`SiteController` コントローラクラスと `say` アクションとして解決されます。
結果として、`SiteController::actionSay()` メソッドがリクエストを処理するために呼び出されます。 結果として、`SiteController::actionSay()` メソッドがリクエストを処理するために呼び出されます。

50
docs/guide-ja/start-installation.md

@ -23,13 +23,13 @@ Windows では、[Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe
以前に Composer をインストールしたことがある場合は、確実に最新のバージョンを使うようにしてください。 以前に Composer をインストールしたことがある場合は、確実に最新のバージョンを使うようにしてください。
Composer は `composer self-update` コマンドを走らせてアップデートすることが出来ます。 Composer は `composer self-update` コマンドを走らせてアップデートすることが出来ます。
Composer がインストールされたら、ウェブからアクセスできるフォルダで下記のコマンドを実行することによって Yii をインストールすることが出来ます: Composer がインストールされたら、ウェブからアクセスできるフォルダで下記のコマンドを実行することによって Yii をインストールすることが出来ます:
composer global require "fxp/composer-asset-plugin:1.0.0-beta4" composer global require "fxp/composer-asset-plugin:1.0.0-beta4"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic composer create-project --prefer-dist yiisoft/yii2-app-basic basic
最初のコマンドは [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。 最初のコマンドは [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。
これにより、Composer を通じて bower と npm のパッケージ依存関係を管理することが出来るようになります。 これにより、Composer を通じて bower と npm の依存パッケージを管理することが出来るようになります。
このコマンドは全体で一度だけ走らせれば十分です。 このコマンドは全体で一度だけ走らせれば十分です。
第二のコマンドは `basic` という名前のディレクトリに Yii をインストールします。 第二のコマンドは `basic` という名前のディレクトリに Yii をインストールします。
必要なら別のディレクトリ名を選ぶことも出来ます。 必要なら別のディレクトリ名を選ぶことも出来ます。
@ -38,9 +38,9 @@ Composer がインストールされたら、ウェブからアクセスでき
> これは、Comoser が Github API の転送レート制限にひっかかったためです。 > これは、Comoser が Github API の転送レート制限にひっかかったためです。
> Composer は全てのパッケージのための大量の情報を Github から読み出さなければならないので、こうなるのは普通のことです。 > Composer は全てのパッケージのための大量の情報を Github から読み出さなければならないので、こうなるのは普通のことです。
> Github にログインすると API の転送レート制限が緩和され、Composer が仕事を続けることが出来るようになります。 > Github にログインすると API の転送レート制限が緩和され、Composer が仕事を続けることが出来るようになります。
> 更なる詳細については、[Composer documentation](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) を参照してください。 > 詳細については、[Composer documentation](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) を参照してください。
> Tip|ヒント: Yii の最新の開発バージョンをインストールしたい場合は、[stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability) を追加した次のコマンドを代りに使うことが出来ます: > Tip|ヒント: Yii の最新の開発バージョンをインストールしたい場合は、[stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability) を追加した次のコマンドを代りに使うことが出来ます
> >
> composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic > composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
> >
@ -50,12 +50,12 @@ Composer がインストールされたら、ウェブからアクセスでき
アーカイブファイルからインストールする<a name="installing-from-archive-file"></a> アーカイブファイルからインストールする<a name="installing-from-archive-file"></a>
-------------------------------------- --------------------------------------
アーカイブファイルから Yii をインストールするには、三つのステップを踏みます: アーカイブファイルから Yii をインストールするには、三つのステップを踏みます
1. [yiiframework.com](http://www.yiiframework.com/download/) からアーカイブファイルをダウンロードする。 1. [yiiframework.com](http://www.yiiframework.com/download/) からアーカイブファイルをダウンロードする。
2. ダウンロードしたファイルをウェブからアクセスできるフォルダーに展開する。 2. ダウンロードしたファイルをウェブからアクセスできるフォルダーに展開する。
3. `config/web.php` ファイルを編集して、`cookieValidationKey` というコンフィギュレーション項目に秘密キーを入力する 3. `config/web.php` ファイルを編集して、`cookieValidationKey` というコンフィギュレーション項目に秘密キーを入力する
(Composer を使って Yii をインストールするときは、これは自動的に実行されます): (Composer を使って Yii をインストールするときは、これは自動的に実行されます)
```php ```php
// !!! 下記に(もし空白なら)秘密キーを入力する - これはクッキー検証のために必要 // !!! 下記に(もし空白なら)秘密キーを入力する - これはクッキー検証のために必要
@ -69,25 +69,25 @@ Composer がインストールされたら、ウェブからアクセスでき
上記のインストール方法の説明は Yii のインストールの仕方を示すものですが、それは同時にそのままで動作する基本的なウェブアプリケーションを作成するものでもあります。 上記のインストール方法の説明は Yii のインストールの仕方を示すものですが、それは同時にそのままで動作する基本的なウェブアプリケーションを作成するものでもあります。
これは小さなプロジェクトを開始するのに良い方法です。あるいは Yii の学習を始めたばかりの場合にもこれで良いでしょう。 これは小さなプロジェクトを開始するのに良い方法です。あるいは Yii の学習を始めたばかりの場合にもこれで良いでしょう。
しかし、他のインストールオプションも利用可能です: しかし、他のインストールオプションも利用可能です
* コアフレームワークだけをインストールし、アプリケーション全体を一から構築したい場合は、 * コアフレームワークだけをインストールし、アプリケーション全体を一から構築したい場合は、[アプリケーションを一から構築する](tutorial-start-from-scratch.md)
[アプリケーションを一から構築する](tutorial-start-from-scratch.md) で説明されている指示に従うことが出来ます。 で説明されている指示に従うことが出来ます。
* もっと洗練された、チーム開発環境により適したアプリケーションから開始したい場合は、 * もっと洗練された、チーム開発環境により適したアプリケーションから開始したい場合は、 [アドバンストアプリケーションテンプレート](tutorial-advanced-app.md)
[アドバンストアプリケーションテンプレート](tutorial-advanced-app.md) をインストールすることを考慮することが出来ます。 をインストールすることを考慮することが出来ます。
インストールを検証する<a name="verifying-installation"></a> インストールを検証する<a name="verifying-installation"></a>
---------------------- ----------------------
インストール完了後、ブラウザで下記の URL によってインストールされた Yii アプリケーションにアクセスすることが出来ます: インストール完了後、ブラウザで下記の URL によってインストールされた Yii アプリケーションにアクセスすることが出来ます
``` ```
http://localhost/basic/web/index.php http://localhost/basic/web/index.php
``` ```
この URL は、あなたが Yii を ウェブサーバのドキュメントルートディレクトリの下の `basic` という名前のディレクトリにインストールしたこと、 この URL は、あなたが Yii を ウェブサーバのドキュメントルートディレクトリの下の `basic` という名前のディレクトリにインストールしたこと、
そしてウェブサーバがローカルマシン (`localhost`) で走つていると想定しています。 そしてウェブサーバがローカルマシン (`localhost`) で走っていることを想定しています。
インストールされた環境に合うように URL を変更してください。 インストールされた環境に合うように URL を変更してください。
![Yii のインストールが成功](images/start-app-installed.png) ![Yii のインストールが成功](images/start-app-installed.png)
@ -97,7 +97,7 @@ http://localhost/basic/web/index.php
最低限の必要条件を満たしているかどうかは、次の方法のどちらかによってチェックすることが出来ます: 最低限の必要条件を満たしているかどうかは、次の方法のどちらかによってチェックすることが出来ます:
* ブラウザを使って `http://localhost/basic/requirements.php` という URL にアクセスする。 * ブラウザを使って `http://localhost/basic/requirements.php` という URL にアクセスする。
* 次のコマンドを実行する: * 次のコマンドを実行する
``` ```
cd basic cd basic
@ -106,7 +106,8 @@ http://localhost/basic/web/index.php
Yii の最低必要条件を満たすように PHP のインストールを構成しなければなりません。 Yii の最低必要条件を満たすように PHP のインストールを構成しなければなりません。
最も重要なことは、PHP 5.4 以上でなければならないということです。 最も重要なことは、PHP 5.4 以上でなければならないということです。
また、アプリケーションがデータベースを必要とする場合は、[PDO PHP 拡張](http://www.php.net/manual/ja/pdo.installation.php) および対応するデータベースドライバ (MySQL データベースのための `pdo_mysql` など) をインストールしなければなりません。 また、アプリケーションがデータベースを必要とする場合は、[PDO PHP 拡張](http://www.php.net/manual/ja/pdo.installation.php) および対応するデータベースドライバ
(MySQL データベースのための `pdo_mysql` など) をインストールしなければなりません。
ウェブサーバを構成する<a name="configuring-web-servers"></a> ウェブサーバを構成する<a name="configuring-web-servers"></a>
@ -114,11 +115,13 @@ Yii の最低必要条件を満たすように PHP のインストールを構
> Info|情報: もし Yii の試運転をしているだけで、実運用のサーバに配置する意図がないのであれば、当面、この項は飛ばしても構いません。 > Info|情報: もし Yii の試運転をしているだけで、実運用のサーバに配置する意図がないのであれば、当面、この項は飛ばしても構いません。
上記の説明に従ってインストールされたアプリケーションは、[Apache HTTP サーバ](http://httpd.apache.org/) と [Nginx HTTP サーバ](http://nginx.org/) のどちらでも、また、Windows、Mac OS X、Linux のどれでも、PHP 5.4 以上を走らせている環境であれば、そのままの状態で動作するはずです。 上記の説明に従ってインストールされたアプリケーションは、[Apache HTTP サーバ](http://httpd.apache.org/) と [Nginx HTTP サーバ](http://nginx.org/) のどちらでも、
また、Windows、Mac OS X、Linux のどれでも、PHP 5.4 以上を走らせている環境であれば、そのままの状態で動作するはずです。
Yii 2.0 は、また、facebook の [HHVM](http://hhvm.com/) とも互換性があります。 Yii 2.0 は、また、facebook の [HHVM](http://hhvm.com/) とも互換性があります。
ただし HHVM がネイティブの PHP とは異なる振舞いをする特殊なケースもいくつかありますので、HHVM を使うときはいくらか余分に注意を払う必要があります。 ただし HHVM がネイティブの PHP とは異なる振舞いをする特殊なケースもいくつかありますので、HHVM を使うときはいくらか余分に注意を払う必要があります。
実運用のサーバでは、`http://www.example.com/basic/web/index.php` の代りに `http://www.example.com/index.php` という URL でアプリケーションにアクセス出来るようにウェブサーバを設定したいと思うかもしれません。 実運用のサーバでは、`http://www.example.com/basic/web/index.php` の代りに `http://www.example.com/index.php` という URL
でアプリケーションにアクセス出来るようにウェブサーバを設定したいと思うかもしれません。
そういう設定をするためには、ウェブサーバのドキュメントルートを `basic/web` フォルダに向けることが必要になります。 そういう設定をするためには、ウェブサーバのドキュメントルートを `basic/web` フォルダに向けることが必要になります。
また、[ルーティングと URL 生成](runtime-routing.md) の節で述べられているように、URL から `index.php` を隠したいと思うかも知れません。 また、[ルーティングと URL 生成](runtime-routing.md) の節で述べられているように、URL から `index.php` を隠したいと思うかも知れません。
この節では、これらの目的を達するために Apache または Nginx サーバをどのように設定すれば良いかを学びます。 この節では、これらの目的を達するために Apache または Nginx サーバをどのように設定すれば良いかを学びます。
@ -128,7 +131,7 @@ Yii 2.0 は、また、facebook の [HHVM](http://hhvm.com/) とも互換性が
> Info|情報: ウェブサーバの設定を修正する権限のない共用ホスティング環境でアプリケーションが走る場合でも、 > Info|情報: ウェブサーバの設定を修正する権限のない共用ホスティング環境でアプリケーションが走る場合でも、
セキュリティ強化のためにアプリケーションの構造を調整することが出来ます。 セキュリティ強化のためにアプリケーションの構造を調整することが出来ます。
更なる詳細については、[共有ホスティング環境](tutorial-shared-hosting.md) の節を参照してください。 詳細については、[共有ホスティング環境](tutorial-shared-hosting.md) の節を参照してください。
### 推奨される Apache の構成<a name="recommended-apache-configuration"></a> ### 推奨される Apache の構成<a name="recommended-apache-configuration"></a>
@ -157,8 +160,8 @@ DocumentRoot "path/to/basic/web"
### 推奨される Nginx の構成<a name="recommended-nginx-configuration"></a> ### 推奨される Nginx の構成<a name="recommended-nginx-configuration"></a>
[Nginx](http://wiki.nginx.org/) を使うためには、PHP を [FPM SAPI](http://jp1.php.net/install.fpm) としてインストールしていなければなりません。 [Nginx](http://wiki.nginx.org/) を使うためには、PHP を [FPM SAPI](http://jp1.php.net/install.fpm) としてインストールしていなければなりません。
下記の設定を使うことができます (`path/to/basic/web` の部分を `basic/web` の実際のパスに置き換え、 下記の設定を使うことができます (`path/to/basic/web` の部分を `basic/web` の実際のパスに置き換え、`mysite.local`
`mysite.local` を実際のサーバのホスト名に置き換えてください)。 を実際のサーバのホスト名に置き換えてください)。
``` ```
server { server {
@ -200,8 +203,7 @@ server {
} }
``` ```
この構成を使う場合は、同時に `php.ini` ファイルで `cgi.fix_pathinfo=0` も設定して、 この構成を使う場合は、同時に `php.ini` ファイルで `cgi.fix_pathinfo=0` も設定して、多数の不要な `stat()` の呼び出しを避けるべきです。
多数の不要な `stat()` の呼び出しを避けるべきです。
また、HTTPS サーバを走らせている場合には、安全な接続であることを Yii が正しく検知できるように、 また、HTTPS サーバを走らせている場合には、安全な接続であることを Yii が正しく検知できるように、`fastcgi_param HTTPS on;`
`fastcgi_param HTTPS on;` を追加しなければならないことにも注意を払ってください。 を追加しなければならないことにも注意を払ってください。

9
docs/guide-ja/start-looking-ahead.md

@ -2,16 +2,15 @@
============== ==============
「はじめよう」の章全体を読み通したなら、いまやあなたは、完全な Yii のアプリケーションを作成したことがある、と言うことが出来ます。 「はじめよう」の章全体を読み通したなら、いまやあなたは、完全な Yii のアプリケーションを作成したことがある、と言うことが出来ます。
その過程で、あなたは HTML フォームを通じてユーザからデータを取得することや、データベースからデータを取得すること、また、ページ付けをしてデータを表示することなど、 その過程で、あなたは HTML フォームを通じてユーザからデータを取得することや、データベースからデータを取得すること、また、ページ付けをしてデータを表示することなど、必要とされることが多いいくつかの機能を実装する方法を学びました。
必要とされることが多いいくつかの機能を実装する方法を学びました。
また、[Gii](tool-gii.md) を使ってコードを自動的に生成する方法も学びました。 また、[Gii](tool-gii.md) を使ってコードを自動的に生成する方法も学びました。
Gii をコード生成に使うと、ウェブ開発のプロセスの大部分が、いくつかのフォームに入力していくだけの簡単な仕事になります。 Gii をコード生成に使うと、ウェブ開発のプロセスの大部分が、いくつかのフォームに入力していくだけの簡単な仕事になります。
この節では、Yii フレームワークを使うときの生産性を更に高めるために利用できるリソースについてまとめます。 この節では、Yii フレームワークを使うときの生産性を更に高めるために利用できるリソースについてまとめます。
* ドキュメント * ドキュメント
- [公式ガイド](http://www.yiiframework.com/doc-2.0/guide-README.html): - [決定版ガイド](http://www.yiiframework.com/doc-2.0/guide-README.html):
Definitive(最も確実な) という名前が示すように、このガイドは Yii がどのように動作すべきものかを正確に記述し、 Definitive(決定的な) という名前が示すように、このガイドは Yii がどのように動作すべきものかを正確に記述し、
Yii を使用するについての全般的な手引きを提供するものです。 Yii を使用するについての全般的な手引きを提供するものです。
これは唯一最重要な Yii のチュートリアルであり、Yii のコードを少しでも書く前に読むべきものです。 これは唯一最重要な Yii のチュートリアルであり、Yii のコードを少しでも書く前に読むべきものです。
- [クラスリファレンス](http://www.yiiframework.com/doc-2.0/index.html): - [クラスリファレンス](http://www.yiiframework.com/doc-2.0/index.html):
@ -21,7 +20,7 @@ Gii をコード生成に使うと、ウェブ開発のプロセスの大部分
- [Wiki の記事](http://www.yiiframework.com/wiki/?tag=yii2): - [Wiki の記事](http://www.yiiframework.com/wiki/?tag=yii2):
Wiki の記事は、Yii のユーザが自身の経験に基づいて書いたものです。 Wiki の記事は、Yii のユーザが自身の経験に基づいて書いたものです。
ほとんどの記事は、料理本のレシピのように書かれており、特定の問題を Yii を使って解決する方法を示しています。 ほとんどの記事は、料理本のレシピのように書かれており、特定の問題を Yii を使って解決する方法を示しています。
これらの記事の品質は公式ガイドほどには良くないかもしれませんが、 これらの記事の品質は決定版ガイドほどには良くないかもしれませんが、
より広範なトピックをカバーしていることと、たいていは即座に使えるソリューションを提供してくれることにおいて有用なものです。 より広範なトピックをカバーしていることと、たいていは即座に使えるソリューションを提供してくれることにおいて有用なものです。
- [書籍](http://www.yiiframework.com/doc/) - [書籍](http://www.yiiframework.com/doc/)
* [エクステンション](http://www.yiiframework.com/extensions/): * [エクステンション](http://www.yiiframework.com/extensions/):

27
docs/guide-ja/start-workflow.md

@ -3,20 +3,17 @@
Yii のインストールが終ると、実際に動く Yii のアプリケーションにアクセスすることが出来るようになります。 Yii のインストールが終ると、実際に動く Yii のアプリケーションにアクセスすることが出来るようになります。
その URL は、`http://hostname/basic/web/index.php` あるいは `http://hostname/index.php` など、設定によって異なります。 その URL は、`http://hostname/basic/web/index.php` あるいは `http://hostname/index.php` など、設定によって異なります。
この節では、アプリケーションに組み込み済みの機能を紹介し、コードがどのように組織されているか、 この節では、アプリケーションに組み込み済みの機能を紹介し、コードがどのように組織されているか、そして、一般にアプリケーションがリクエストをどのように処理するかを説明します。
そして、一般にアプリケーションがリクエストをどのように処理するかを説明します。
> Info|情報: 話を簡単にするために、この「始めよう」のチュートリアルを通じて、 > Info|情報: 話を簡単にするために、この「始めよう」のチュートリアルを通じて、`basic/web` をウェブサーバのドキュメントルートとして設定したと仮定します。
`basic/web` をウェブサーバのドキュメントルートとして設定したと仮定します。そして、 そして、アプリケーションにアクセスするための URL は `http://hostname/index.php` またはそれに似たものになるように設定したと仮定します。
アプリケーションにアクセスするための URL は `http://hostname/index.php` またはそれに似たものになるように
設定したと仮定します。
必要に応じて、説明の中の URL を読み替えてください。 必要に応じて、説明の中の URL を読み替えてください。
機能<a name="functionality"></a> 機能<a name="functionality"></a>
---- ----
インストールされた基本的なアプリケーションは4つのページを持っています: インストールされた基本的なアプリケーションは四つのページを持っています。
* ホームページ: `http://hostname/index.php` の URL にアクセスすると表示されます。 * ホームページ: `http://hostname/index.php` の URL にアクセスすると表示されます。
* 「について」のページ。 * 「について」のページ。
@ -29,21 +26,21 @@ Yii のインストールが終ると、実際に動く Yii のアプリケー
ヘッダには、異なるページ間を行き来することを可能にするメインメニューバーがあります。 ヘッダには、異なるページ間を行き来することを可能にするメインメニューバーがあります。
ブラウザのウィンドウの下部にツールバーがあることにも気がつくはずです。 ブラウザのウィンドウの下部にツールバーがあることにも気がつくはずです。
これは Yii によって提供される便利な [デバッグツールバー](tool-debugger.md) であり、ログメッセージ、 これは Yii によって提供される便利な [デバッグツールバー](tool-debugger.md)
レスポンスのステータス、データベースクエリの実行状況、その他、たくさんのデバッグ情報を記録・表示するものです。 であり、ログメッセージ、レスポンスのステータス、データベースクエリの実行状況、その他、たくさんのデバッグ情報を記録・表示するものです。
アプリケーションの構造<a name="application-structure"></a> アプリケーションの構造<a name="application-structure"></a>
---------------------- ----------------------
アプリケーションにとって最も重要なディレクトリとファイルは (アプリケーションのルートディレクトリが `basic` だと仮定すると) 以下の通りです: アプリケーションにとって最も重要なディレクトリとファイルは (アプリケーションのルートディレクトリが `basic` だと仮定すると) 以下の通りです
``` ```
basic/ アプリケーションのベースパス basic/ アプリケーションのベースパス
composer.json Composer によって使用される。パッケージ情報を記述 composer.json Composer によって使用される。パッケージ情報を記述
config/ アプリケーションその他のコンフィギュレーションを格納 config/ アプリケーションその他の構成情報を格納
console.php コンソールアプリケーションのコンフィギュレーション console.php コンソールアプリケーションの構成情報
web.php ウェブアプリケーションのコンフィギュレーション web.php ウェブアプリケーションの構成情報
commands/ コンソールコマンドのクラスを格納 commands/ コンソールコマンドのクラスを格納
controllers/ コントローラのクラスを格納 controllers/ コントローラのクラスを格納
models/ モデルのクラスを格納 models/ モデルのクラスを格納
@ -56,7 +53,7 @@ basic/ アプリケーションのベースパス
yii Yii コンソールコマンド実行スクリプト yii Yii コンソールコマンド実行スクリプト
``` ```
一般に、アプリケーションのファイルは二種類に分けることが出来ます: `basic/web` の下にあるファイルとその他のディレクトリの下にあるファイルです。 一般に、アプリケーションのファイルは二種類に分けることが出来ます。すなわち、`basic/web` の下にあるファイルとその他のディレクトリの下にあるファイルです。
前者は HTTP で (すなわちブラウザで) 直接にアクセスすることが出来ますが、後者は直接のアクセスは出来ませんし、許可すべきでもありません。 前者は HTTP で (すなわちブラウザで) 直接にアクセスすることが出来ますが、後者は直接のアクセスは出来ませんし、許可すべきでもありません。
Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/wiki/Model-view-controller) デザインパターンを実装していますが、それが上記のディレクトリ構成にも反映されています。 Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/wiki/Model-view-controller) デザインパターンを実装していますが、それが上記のディレクトリ構成にも反映されています。
@ -81,7 +78,7 @@ Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/
![リクエストのライフサイクル](images/request-lifecycle.png) ![リクエストのライフサイクル](images/request-lifecycle.png)
1. ユーザが [エントリスクリプト](structure-entry-scripts.md) `web/index.php` に対してリクエストを出します。 1. ユーザが [エントリスクリプト](structure-entry-scripts.md) `web/index.php` に対してリクエストを出します。
2. エントリスクリプトはアプリケーションの [コンフィギュレーション](concept-configurations.md) を読み出して、 2. エントリスクリプトはアプリケーションの [構成情報](concept-configurations.md) を読み出して、
リクエストを処理する [アプリケーション](structure-applications.md) のインスタンスを作成します。 リクエストを処理する [アプリケーション](structure-applications.md) のインスタンスを作成します。
3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーションコンポーネントの助力を得て、 3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーションコンポーネントの助力を得て、
リクエストされた [ルート](runtime-routing.md) を解決します。 リクエストされた [ルート](runtime-routing.md) を解決します。

2
docs/guide/README.md

@ -192,7 +192,7 @@ Helpers
------- -------
* [Overview](helper-overview.md) * [Overview](helper-overview.md)
* **TBD** [ArrayHelper](helper-array.md) * [ArrayHelper](helper-array.md)
* **TBD** [Html](helper-html.md) * **TBD** [Html](helper-html.md)
* **TBD** [Url](helper-url.md) * **TBD** [Url](helper-url.md)
* **TBD** [Security](helper-security.md) * **TBD** [Security](helper-security.md)

311
docs/guide/helper-array.md

@ -0,0 +1,311 @@
ArrayHelper
===========
Additionally to [rich set of PHP array functions](http://php.net/manual/en/book.array.php) Yii array helper provides
extra static methods allowing you to deal with arrays more efficiently.
Getting values
--------------
### Getting a single value
Retrieving values from an array, an object or a complex structure consisting of both using standard PHP is quite
repetitive. You have to check if key exists with `isset` first, then if it does you're getting it, if not,
providing default value:
```php
class User
{
public $name = 'Alex';
}
$array = [
'foo' => [
'bar' => new User(),
]
];
$value = isset($array['foo']['bar']->name) ? $array['foo']['bar']->name : null;
```
Yii provides a very convenient method to do it:
```php
$value = ArrayHelper::getValue($array, 'foo.bar.name');
```
First method argument is where we're getting value from. Second argument specifies how to get the data. It could be one
of the following:
- Name of array key or object property to retieve value from.
- Set of dot separated array key or object property names. The one we've used in the example above.
- A callback returning a value.
The callback should be the following:
```php
$fullName = ArrayHelper::getValue($user, function ($user, $defaultValue) {
return $user->firstName . ' ' . $user->lastName;
});
```
Third optional argument is default value which is `null` if not specified. Could be used as follows:
```php
$username = ArrayHelper::getValue($comment, 'user.username', 'Unknown');
```
In case you want to get the value and then immediately remove it from array you can use `remove` method:
```php
$array = ['type' => 'A', 'options' => [1, 2]];
$type = ArrayHelper::remove($array, 'type');
```
After executing the code `$array` will contain `['options' => [1, 2]]` and `$type` will be `A`. Note that unlike
`getValue` method, `remove` supports simple key names only.
### Checking if key exists
`ArrayHelper::keyExists` works the same way as [array_key_exists](http://php.net/manual/en/function.array-key-exists.php)
except when trird argument is `false`. In this case it checks for a key in case insensitive manner:
```php
$data1 = [
'userName' => 'Alex',
];
$data2 = [
'username' => 'Carsten',
];
if (!ArrayHelper::keyExists('username', $data1, false) || !ArrayHelper::keyExists('username', $data2, false)) {
echo "Please provide username.";
}
```
### Getting a column
Often you need to get a column of values from array of data rows or objects. Common keys is getting a list of IDs.
```php
$data = [
['id' => '123', 'data' => 'abc'],
['id' => '345', 'data' => 'def'],
];
$ids = ArrayHelper::getColumn($array, 'id');
```
The result will be `['123', '345']`.
If additional transformations are required or the way of getting value is complex, second argument could be specified
as an anonymous function:
```php
$result = ArrayHelper::getColumn($array, function ($element) {
return $element['id'];
});
```
Index array by key specified
----------------------------
In order to indexes an array according to a specified key `index` method could be used. The input array should be
multidimensional or an array of objects. The key can be a key name of the sub-array, a property name of object, or
an anonymous function which returns the key value given an array element.
If a key value is null, the corresponding array element will be discarded and not put in the result. For example,
```php
$array = [
['id' => '123', 'data' => 'abc'],
['id' => '345', 'data' => 'def'],
];
$result = ArrayHelper::index($array, 'id');
// the result is:
// [
// '123' => ['id' => '123', 'data' => 'abc'],
// '345' => ['id' => '345', 'data' => 'def'],
// ]
// using anonymous function
$result = ArrayHelper::index($array, function ($element) {
return $element['id'];
});
```
Map array
---------
In order to build a map (key-value pairs) from a multidimensional array or an array of objects you can use `map` method.
The `$from` and `$to` parameters specify the key names or property names to set up the map. Optionally, one can further
group the map according to a grouping field `$group`. For example,
```php
$array = [
['id' => '123', 'name' => 'aaa', 'class' => 'x'],
['id' => '124', 'name' => 'bbb', 'class' => 'x'],
['id' => '345', 'name' => 'ccc', 'class' => 'y'],
);
$result = ArrayHelper::map($array, 'id', 'name');
// the result is:
// [
// '123' => 'aaa',
// '124' => 'bbb',
// '345' => 'ccc',
// ]
$result = ArrayHelper::map($array, 'id', 'name', 'class');
// the result is:
// [
// 'x' => [
// '123' => 'aaa',
// '124' => 'bbb',
// ],
// 'y' => [
// '345' => 'ccc',
// ],
// ]
```
Sort array
----------
`sort` method helps to sort an array of objects or nested arrays by one or several keys. For example,
```php
$data = [
['age' => 30, 'name' => 'Alexander'],
['age' => 30, 'name' => 'Brian'],
['age' => 19, 'name' => 'Barney'],
];
ArrayHelper::multisort($data, ['age', 'name'], [ArrayHelper::SORT_ASC, ArrayHelper::SORT_DESC]);
```
After sorting we'll get the following in `$data`:
```php
[
['age' => 19, 'name' => 'Barney'],
['age' => 30, 'name' => 'Brian'],
['age' => 30, 'name' => 'Alexander'],
];
```
Second argument that specifies keys to sort by could be a string if it's a single key, an array in case of multiple keys
or an anonymous function like the following one:
```php
ArrayHelper::multisort($data, function($item) {
return isset($item['age']) ? ['age', 'name'] : 'name';
});
```
Third argument is direction. In case of sorting by a single key it could be either `ArrayHelper::SORT_ASC` or
`ArrayHelper::SORT_DESC`. If sorting by multiple values you can sort each value differently by providing an array of
sort direction.
Last argument is PHP sort flag that could take the same values as the ones passed to
PHP [sort()](http://php.net/manual/en/function.sort.php).
Finding out the type of array
-----------------------------
It is handy to know whether array is indexed or an associative. Here's an example:
```php
// no keys specified
$indexed = ['Qiang', 'Paul'];
echo ArrayHelper::isIndexed($indexed);
// all keys are strings
$associative = ['framework' => 'Yii', 'version' => '2.0'];
echo ArrayHelper::isAssociative($associative);
```
HTML-encoding and HTML-decoding values
--------------------------------------
In order to encode or decode special characters in an array of strings into HTML entities you can use the following:
```php
$encoded = ArrayHelper::htmlEncode($data);
$decoded = ArrayHelper::htmlDecode($data);
```
Only values will be encoded by default. By passing second argument as `false` you can encode arrays keys as well.
Encoding will use application charset and could be changed via third argument.
Merging arrays
--------------
/**
* Merges two or more arrays into one recursively.
* If each array has an element with the same string key value, the latter
* will overwrite the former (different from array_merge_recursive).
* Recursive merging will be conducted if both arrays have an element of array
* type and are having the same key.
* For integer-keyed elements, the elements from the latter array will
* be appended to the former array.
* @param array $a array to be merged to
* @param array $b array to be merged from. You can specify additional
* arrays via third argument, fourth argument etc.
* @return array the merged array (the original arrays are not changed.)
*/
public static function merge($a, $b)
Getting array from object
-------------------------
Often you need to convert an object or an array of objects into array. The most common case is converting active record
models in order to serve data arrays via REST API or use it otherwise. The following code could be used to do it:
```php
$posts = Post::find()->limit(10)->all();
$data = ArrayHelper::toArray($post, [
'app\models\Post' => [
'id',
'title',
// the key name in array result => property name
'createTime' => 'created_at',
// the key name in array result => anonymous function
'length' => function ($post) {
return strlen($post->content);
},
],
]);
```
The first argument contains the data we want to convert. In our case we're converting a `Post` AR model.
The second argument is conversion mapping per class. We're setting a mapping for `Post` model.
Each mapping array contains a set of mappings. Each mapping could be:
- A field name to include as is.
- A key-value pair of desired array key name and model colum name to take value from.
- A key-value pair of desired array key name and a callback which return value will be used.
The result of conversion above will be:
```php
[
'id' => 123,
'title' => 'test',
'createTime' => '2013-01-01 12:00AM',
'length' => 301,
]
```
It is possible to provide default way of converting object to array for a specific class by implementing
[[yii\base\Arrayable|Arrayable]] interface in that class.

2
docs/guide/helper-overview.md

@ -25,7 +25,7 @@ Core Helper Classes
The following core helper classes are provided in the Yii releases: The following core helper classes are provided in the Yii releases:
- ArrayHelper - [ArrayHelper](helper-array.md)
- Console - Console
- FileHelper - FileHelper
- Html - Html

20
docs/guide/input-file-upload.md

@ -3,7 +3,7 @@ Uploading Files
> Note: This section is under development. > Note: This section is under development.
Uploading files in Yii is done via the form model, its validation rules and some controller code. Let's review what's needed Uploading files in Yii is done via the a form model, its validation rules and some controller code. Let's review what's needed
to handle uploads properly. to handle uploads properly.
Form model Form model
@ -46,7 +46,7 @@ the HTML form. The attribute has the validation rule named `file` that uses [[yi
Form view Form view
--------- ---------
Next create a view that will render the form. Next, create a view that will render the form:
```php ```php
<?php <?php
@ -61,7 +61,7 @@ $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]);
<?php ActiveForm::end(); ?> <?php ActiveForm::end(); ?>
``` ```
The `'enctype' => 'multipart/form-data'` is important since it allows file uploads. `fileInput()` represents a form The `'enctype' => 'multipart/form-data'` is necessary because it allows file uploads. `fileInput()` represents a form
input field. input field.
Controller Controller
@ -96,10 +96,8 @@ class SiteController extends Controller
} }
``` ```
Instead of `model->load(...)` we are using `UploadedFile::getInstance(...)`. [[\yii\web\UploadedFile|UploadedFile]] Instead of `model->load(...)`, we are using `UploadedFile::getInstance(...)`. [[\yii\web\UploadedFile|UploadedFile]]
does not run the model validation. It only provides information about the uploaded file. Therefore, you need to run does not run the model validation, rather it only provides information about the uploaded file. Therefore, you need to run the validation manually via `$model->validate()` to trigger the [[yii\validators\FileValidator|FileValidator]] that expects a file:
validation manually via `$model->validate()`. This triggers the [[yii\validators\FileValidator|FileValidator]] that
expects a file:
```php ```php
$file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE //in the code framework $file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE //in the code framework
@ -144,7 +142,7 @@ public function rules()
} }
``` ```
Keep in mind that only the file extension will be validated, but not the actual file content. In order to validate content as well use the `mimeTypes` property of `FileValidator`: Keep in mind that only the file extension will be validated, but not the actual file content. In order to validate the content as well, use the `mimeTypes` property of `FileValidator`:
```php ```php
public function rules() public function rules()
@ -164,7 +162,9 @@ received a valid image that can be then either saved or processed using the [Ima
### Uploading multiple files ### Uploading multiple files
If you need to download multiple files at once some adjustments are required. View: If you need to download multiple files at once, some adjustments are required.
View:
```php ```php
<?php <?php
@ -241,5 +241,5 @@ class SiteController extends Controller
} }
``` ```
The difference is `UploadedFile::getInstances($model, 'file');` instead of `UploadedFile::getInstance($model, 'file');`. The difference is using `UploadedFile::getInstances($model, 'file');` instead of `UploadedFile::getInstance($model, 'file');`.
The former returns instances for **all** uploaded files while the latter gives you only a single instance. The former returns instances for **all** uploaded files while the latter gives you only a single instance.

67
docs/guide/output-data-widgets.md

@ -39,16 +39,15 @@ echo DetailView::widget([
GridView GridView
-------- --------
Data grid or GridView is one of the most powerful Yii widgets. It is extremely useful if you need to quickly build admin Data grid or GridView is one of the most powerful Yii widgets. It is extremely useful if you need to quickly build the admin
section of the system. It takes data from [data provider](output-data-providers.md) and renders each row using a set of columns section of the system. It takes data from [data provider](output-data-providers.md) and renders each row using a set of columns
presenting data in a form of a table. presenting data in the form of a table.
Each row of the table represents the data of a single data item, and a column usually represents an attribute of Each row of the table represents the data of a single data item, and a column usually represents an attribute of
the item (some columns may correspond to complex expressions of attributes or static text). the item (some columns may correspond to complex expressions of attributes or static text).
Grid view supports both sorting and pagination of the data items. The sorting and pagination can be done in AJAX mode Grid view supports both sorting and pagination of the data items. The sorting and pagination can be done in AJAX mode
or normal page request. A benefit of using GridView is that when the user disables JavaScript, the sorting and pagination or as a normal page request. A benefit of using GridView is that when the user disables JavaScript, the sorting and pagination automatically degrade to normal page requests and still function as expected.
automatically degrade to normal page requests and are still functioning as expected.
The minimal code needed to use GridView is as follows: The minimal code needed to use GridView is as follows:
@ -74,7 +73,7 @@ the data provider. The displayed table is equipped with sorting and pagination f
Yii grid consists of a number of columns. Depending on column type and settings these are able to present data differently. Yii grid consists of a number of columns. Depending on column type and settings these are able to present data differently.
These are defined in the columns part of GridView config like the following: These are defined in the columns part of GridView configuration like the following:
```php ```php
echo GridView::widget([ echo GridView::widget([
@ -82,7 +81,7 @@ echo GridView::widget([
'columns' => [ 'columns' => [
['class' => 'yii\grid\SerialColumn'], ['class' => 'yii\grid\SerialColumn'],
// A simple column defined by the data contained in $dataProvider. // A simple column defined by the data contained in $dataProvider.
// Data from model's column1 will be used. // Data from the model's column1 will be used.
'id', 'id',
'username', 'username',
// More complex one. // More complex one.
@ -96,7 +95,7 @@ echo GridView::widget([
]); ]);
``` ```
Note that if columns part of config isn't specified, Yii tries to show all possible data provider model columns. Note that if the columns part of the configuration isn't specified, Yii tries to show all possible data provider model columns.
### Column classes ### Column classes
@ -112,7 +111,7 @@ echo GridView::widget([
], ],
``` ```
Additionally to column classes provided by Yii that we'll review below you can create your own column classes. In addition to column classes provided by Yii that we'll review below you can create your own column classes.
Each column class extends from [[\yii\grid\Column]] so there are some common options you can set while configuring Each column class extends from [[\yii\grid\Column]] so there are some common options you can set while configuring
grid columns. grid columns.
@ -131,17 +130,17 @@ grid columns.
You may specify various container HTML options by passing arrays to: You may specify various container HTML options by passing arrays to:
- `headerOptions` - `headerOptions`
- `contentOptions`
- `footerOptions` - `footerOptions`
- `filterOptions` - `filterOptions`
- `contentOptions`
#### Data column <a name="data-column"></a> #### Data column <a name="data-column"></a>
Data column is used for displaying and sorting data. It is default column type so specifying class could be omitted when Data column is used for displaying and sorting data. It is the default column type so the specifying class could be omitted when
using it. using it.
The main setting of the data column is its format. It could be specified via `format` attribute. Its values are The main setting of the data column is its format. It could be specified via `format` attribute. Its values
corresponding to methods in `formatter` [application component](structure-application-components.md) that is [[\yii\i18n\Formatter|Formatter]] by default: correspond to methods in the `formatter` [application component](structure-application-components.md) that is [[\yii\i18n\Formatter|Formatter]] by default:
```php ```php
echo GridView::widget([ echo GridView::widget([
@ -158,8 +157,8 @@ echo GridView::widget([
]); ]);
``` ```
In the above `text` corresponds to [[\yii\i18n\Formatter::asText()]]. The value of the column is passed as the first In the above, `text` corresponds to [[\yii\i18n\Formatter::asText()]]. The value of the column is passed as the first
argument. In the second column definition `date` corresponds to [[\yii\i18n\Formatter::asDate()]]. The value of the argument. In the second column definition, `date` corresponds to [[\yii\i18n\Formatter::asDate()]]. The value of the
column is, again, passed as the first argument while 'Y-m-d' is used as the second argument value. column is, again, passed as the first argument while 'Y-m-d' is used as the second argument value.
For a list of available formatters see the [section about Data Formatting](output-formatter.md). For a list of available formatters see the [section about Data Formatting](output-formatter.md).
@ -187,7 +186,7 @@ Available properties you can configure are:
treated as controller action IDs (also called *button names* in the context of action column). They will be replaced treated as controller action IDs (also called *button names* in the context of action column). They will be replaced
by the corresponding button rendering callbacks specified in [[yii\grid\ActionColumn::$buttons|buttons]]. For example, the token `{view}` will be by the corresponding button rendering callbacks specified in [[yii\grid\ActionColumn::$buttons|buttons]]. For example, the token `{view}` will be
replaced by the result of the callback `buttons['view']`. If a callback cannot be found, the token will be replaced replaced by the result of the callback `buttons['view']`. If a callback cannot be found, the token will be replaced
with an empty string. Default is `{view} {update} {delete}`. with an empty string. The default tokens are `{view} {update} {delete}`.
- `buttons` is an array of button rendering callbacks. The array keys are the button names (without curly brackets), - `buttons` is an array of button rendering callbacks. The array keys are the button names (without curly brackets),
and the values are the corresponding button rendering callbacks. The callbacks should use the following signature: and the values are the corresponding button rendering callbacks. The callbacks should use the following signature:
@ -197,7 +196,7 @@ function ($url, $model, $key) {
} }
``` ```
In the code above `$url` is the URL that the column creates for the button, `$model` is the model object being In the code above, `$url` is the URL that the column creates for the button, `$model` is the model object being
rendered for the current row, and `$key` is the key of the model in the data provider array. rendered for the current row, and `$key` is the key of the model in the data provider array.
- `urlCreator` is a callback that creates a button URL using the specified model information. The signature of - `urlCreator` is a callback that creates a button URL using the specified model information. The signature of
@ -257,7 +256,7 @@ A common practice when using [active records](db-active-record.md) is to create
that provides needed functionality (it can be generated for you by Gii). This class defines the validation that provides needed functionality (it can be generated for you by Gii). This class defines the validation
rules for the search and provides a `search()` method that will return the data provider. rules for the search and provides a `search()` method that will return the data provider.
To add search capability for the `Post` model we can create `PostSearch` like in the following example: To add the search capability for the `Post` model, we can create `PostSearch` like in the following example:
```php ```php
<?php <?php
@ -385,12 +384,12 @@ In `search()` you then just add another filter condition with:
$query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name')]); $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name')]);
``` ```
> Info: In the above we use the same string for the relation name and the table alias, however when your alias and relation name > Info: In the above we use the same string for the relation name and the table alias; however, when your alias and relation name
> differ, you have to pay attention on where to use the alias and where to use the relation name. > differ, you have to pay attention to where you use the alias and where you use the relation name.
> A simple rule for this is to use the alias in every place that is used to build the database query and the > A simple rule for this is to use the alias in every place that is used to build the database query and the
> relation name in all other definitions like in `attributes()` and `rules()` etc. > relation name in all other definitions such as `attributes()` and `rules()` etc.
> >
> For example you use the alias `au` for the author relation table, the joinWith statement looks like the following: > For example, if you use the alias `au` for the author relation table, the joinWith statement looks like the following:
> >
> ```php > ```php
> $query->joinWith(['author' => function($query) { $query->from(['au' => 'users']); }]); > $query->joinWith(['author' => function($query) { $query->from(['au' => 'users']); }]);
@ -403,7 +402,7 @@ $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name'
> $query->andFilterWhere(['LIKE', 'au.name', $this->getAttribute('author.name')]); > $query->andFilterWhere(['LIKE', 'au.name', $this->getAttribute('author.name')]);
> ``` > ```
> >
> Same is true for the sorting definition: > The same is true for the sorting definition:
> >
> ```php > ```php
> $dataProvider->sort->attributes['author.name'] = [ > $dataProvider->sort->attributes['author.name'] = [
@ -412,7 +411,7 @@ $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name'
> ]; > ];
> ``` > ```
> >
> Also when specifying the [[yii\data\Sort::defaultOrder|defaultOrder]] for sorting you need to use the relation name > Also, when specifying the [[yii\data\Sort::defaultOrder|defaultOrder]] for sorting, you need to use the relation name
> instead of the alias: > instead of the alias:
> >
> ```php > ```php
@ -424,8 +423,8 @@ $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name'
#### Using sql views for filtering, sorting and displaying data #### Using sql views for filtering, sorting and displaying data
There is also other approach that can be faster and more useful - sql views. So for example if we need to show gridview There is also another approach that can be faster and more useful - sql views. For example, if we need to show the gridview
with users and their profiles we can do it in this way: with users and their profiles, we can do so in this way:
```php ```php
CREATE OR REPLACE VIEW vw_user_info AS CREATE OR REPLACE VIEW vw_user_info AS
@ -434,7 +433,7 @@ CREATE OR REPLACE VIEW vw_user_info AS
WHERE user.id = user_profile.user_id WHERE user.id = user_profile.user_id
``` ```
Then you need to create ActiveRecord that will be representing this view: Then you need to create the ActiveRecord that will be representing this view:
```php ```php
@ -482,26 +481,26 @@ class UserView extends ActiveRecord
} }
``` ```
After that you can use this UserView active record with search models, without additional specifying of sorting and filtering attributes. After that you can use this UserView active record with search models, without additional specification of sorting and filtering attributes.
All attributes will be working out of the box. Note that this approach has several pros and cons: All attributes will be working out of the box. Note that this approach has several pros and cons:
- you don't need to specify different sorting and filtering conditions and other things. Everything works out of the box; - you don't need to specify different sorting and filtering conditions. Everything works out of the box;
- it can be much faster because of the data size, count of sql queries performed (for each relation you will need additional query); - it can be much faster because of the data size, count of sql queries performed (for each relation you will need an additional query);
- since this is just a simple mapping UI on sql view it lacks some domain logic that is in your entities, so if you have some methods like `isActive`, - since this is just a simple mapping UI on the sql view it lacks some domain logic that is in your entities, so if you have some methods like `isActive`,
`isDeleted` or other that will influence on UI, you will need to duplicate them in this class too. `isDeleted` or others that will influence the UI, you will need to duplicate them in this class too.
### Multiple GridViews on one page ### Multiple GridViews on one page
You can use more than one GridView on a single page but some additional configuration is needed so that You can use more than one GridView on a single page but some additional configuration is needed so that
they do not interfere. they do not interfere with each other.
When using multiple instances of GridView you have to configure different parameter names for When using multiple instances of GridView you have to configure different parameter names for
the generated sort and pagination links so that each GridView has its individual sorting and pagination. the generated sort and pagination links so that each GridView has its own individual sorting and pagination.
You do so by setting the [[yii\data\Sort::sortParam|sortParam]] and [[yii\data\Pagination::pageParam|pageParam]] You do so by setting the [[yii\data\Sort::sortParam|sortParam]] and [[yii\data\Pagination::pageParam|pageParam]]
of the dataProvider's [[yii\data\BaseDataProvider::$sort|sort]] and [[yii\data\BaseDataProvider::$pagination|pagination]] of the dataProvider's [[yii\data\BaseDataProvider::$sort|sort]] and [[yii\data\BaseDataProvider::$pagination|pagination]]
instances. instances.
Assume we want to list `Post` and `User` models for which we have already prepared two data providers Assume we want to list the `Post` and `User` models for which we have already prepared two data providers
in `$userProvider` and `$postProvider`: in `$userProvider` and `$postProvider`:
```php ```php

11
docs/guide/output-formatter.md

@ -140,7 +140,8 @@ Formatting Numbers <a name="numbers"></a>
For formatting numeric values the formatter class provides the following methods: For formatting numeric values the formatter class provides the following methods:
- [[yii\i18n\Formatter::asInteger()|integer]] - the value is formatted as an integer e.g. `42`. - [[yii\i18n\Formatter::asInteger()|integer]] - the value is formatted as an integer e.g. `42`.
- [[yii\i18n\Formatter::asDecimal()|decimal]] - the value is formatted as a decimal number considering decimal and thousand separators e.g. `42.123`. - [[yii\i18n\Formatter::asDecimal()|decimal]] - the value is formatted as a decimal number considering decimal and thousand
separators e.g. `2,542.123` or `2.542,123`.
- [[yii\i18n\Formatter::asPercent()|percent]] - the value is formatted as a percent number e.g. `42%`. - [[yii\i18n\Formatter::asPercent()|percent]] - the value is formatted as a percent number e.g. `42%`.
- [[yii\i18n\Formatter::asScientific()|scientific]] - the value is formatted as a number in scientific format e.g. `4.2E4`. - [[yii\i18n\Formatter::asScientific()|scientific]] - the value is formatted as a number in scientific format e.g. `4.2E4`.
- [[yii\i18n\Formatter::asCurrency()|currency]] - the value is formatted as a currency value e.g. `£420.00`. - [[yii\i18n\Formatter::asCurrency()|currency]] - the value is formatted as a currency value e.g. `£420.00`.
@ -165,7 +166,7 @@ For example to adjust the maximum and minimum value of fraction digits you can c
Other formatters <a name="other"></a> Other formatters <a name="other"></a>
---------------- ----------------
Additional to date, time and number formatting, Yii provides a set of other useful formatters for different purposes: In addition to date, time and number formatting, Yii provides a set of other useful formatters for different situations:
- [[yii\i18n\Formatter::asRaw()|raw]] - the value is outputted as is, this is a pseudo-formatter that has no effect except that - [[yii\i18n\Formatter::asRaw()|raw]] - the value is outputted as is, this is a pseudo-formatter that has no effect except that
`null` values will be formatted using [[nullDisplay]]. `null` values will be formatted using [[nullDisplay]].
@ -181,13 +182,13 @@ Additional to date, time and number formatting, Yii provides a set of other usef
- [[yii\i18n\Formatter::asImage()|image]] - the value is formatted as an image tag. - [[yii\i18n\Formatter::asImage()|image]] - the value is formatted as an image tag.
- [[yii\i18n\Formatter::asUrl()|url]] - the value is formatted as a hyperlink. - [[yii\i18n\Formatter::asUrl()|url]] - the value is formatted as a hyperlink.
- [[yii\i18n\Formatter::asBoolean()|boolean]] - the value is formatted as a boolean. By default `true` is rendered - [[yii\i18n\Formatter::asBoolean()|boolean]] - the value is formatted as a boolean. By default `true` is rendered
as `Yes` and `false` as `No`, translated to the application language. You can adjust this by configuring as `Yes` and `false` as `No`, translated to the current application language. You can adjust this by configuring
the [[yii\i18n\Formatter::booleanFormat]] property. the [[yii\i18n\Formatter::booleanFormat]] property.
`null`-values <a name="null-values"></a> `null`-values <a name="null-values"></a>
------------- -------------
For values that are `null` in PHP, the formatter class will print a placeholder instead of empty string which For values that are `null` in PHP, the formatter class will print a placeholder instead of an empty string which
defaults to `(not set)` translated to the current application language. You can configure the defaults to `(not set)` translated to the current application language. You can configure the
[[yii\i18n\Formatter::nullDisplay|nullDisplay]] property to set a custom placeholder. [[yii\i18n\Formatter::nullDisplay|nullDisplay]] property to set a custom placeholder.
If you want no special handling for `null` values, you can set [[yii\i18n\Formatter::nullDisplay|nullDisplay]] to `null`. If you do not you want special handling for `null` values, you can set [[yii\i18n\Formatter::nullDisplay|nullDisplay]] to `null`.

28
docs/guide/output-theming.md

@ -4,17 +4,17 @@ Theming
> Note: This section is under development. > Note: This section is under development.
A theme is a directory of view and layout files. Each file of the theme overrides corresponding file of an application A theme is a directory of view and layout files. Each file of the theme overrides corresponding file of an application
when rendered. A single application may use multiple themes and each may provide totally different experience. At any when rendered. A single application may use multiple themes and each may provide totally different experiences. At any
time only one theme can be active. time only one theme can be active.
> Note: Themes usually do not meant to be redistributed since views are too application specific. If you want to > Note: Themes are usually not meant to be redistributed since views are too application specific. If you want to
redistribute customized look and feel consider CSS and JavaScript files in form of [asset bundles](structure-assets.md) instead. redistribute a customized look and feel, consider CSS and JavaScript files in the form of [asset bundles](structure-assets.md) instead.
Configuring a theme Configuring a theme
------------------- -------------------
Theme configuration is specified via `view` component of the application. In order to set up a theme to work with basic Theme configuration is specified via the `view` component of the application. In order to set up a theme to work with basic
application views the following should be in your application config file: application views, the following should be in your application config file:
```php ```php
'components' => [ 'components' => [
@ -27,8 +27,8 @@ application views the following should be in your application config file:
], ],
``` ```
In the above `pathMap` defines a map of original paths to themed paths while `baseUrl` defines base URL for In the above, `pathMap` defines a map of original paths to themed paths while `baseUrl` defines the base URL for
resources referenced from theme files. resources referenced by theme files.
In our case `pathMap` is `['@app/views' => '@app/themes/basic']`. That means that every view in `@app/views` will be In our case `pathMap` is `['@app/views' => '@app/themes/basic']`. That means that every view in `@app/views` will be
first searched under `@app/themes/basic` and if a view exists in the theme directory it will be used instead of the first searched under `@app/themes/basic` and if a view exists in the theme directory it will be used instead of the
@ -40,7 +40,7 @@ For example, with a configuration above a themed version of a view file `@app/vi
### Theming modules ### Theming modules
In order to theme modules `pathMap` may look like the following: In order to theme modules, `pathMap` may look like the following:
```php ```php
'components' => [ 'components' => [
@ -59,8 +59,8 @@ It will allow you to theme `@app/modules/blog/views/comment/index.php` with `@ap
### Theming widgets ### Theming widgets
In order to theme a widget view located at `@app/widgets/currency/views/index.php` you need the following config for In order to theme a widget view located at `@app/widgets/currency/views/index.php`, you need the following configuration for
view component theme: the view component theme:
```php ```php
'components' => [ 'components' => [
@ -72,7 +72,7 @@ view component theme:
], ],
``` ```
With the config above you can create themed version of `@app/widgets/currency/index.php` view in With the configuration above you can create a themed version of the `@app/widgets/currency/index.php` view in
`@app/themes/basic/widgets/currency/index.php`. `@app/themes/basic/widgets/currency/index.php`.
Using multiple paths Using multiple paths
@ -89,7 +89,7 @@ It is possible to map a single path to multiple theme paths. For example,
] ]
``` ```
In this case, the view will be searched in `@app/themes/christmas/site/index.php` then if it's not found it will check In this case, first the view will be searched for in `@app/themes/christmas/site/index.php` then if it's not found it will check
`@app/themes/basic/site/index.php`. If there's no view there as well application view will be used. `@app/themes/basic/site/index.php`. If there's no view there as well, then the application view will be used.
This ability is especially useful if you want to temporary or conditionally override some views. This ability is especially useful if you want to temporarily or conditionally override some views.

2
docs/guide/security-authentication.md

@ -83,4 +83,4 @@ public function beforeSave($insert)
} }
``` ```
The `validateAuthKey` method just needs to compare the `$authKey` variable, passed as parameter (itself retrieved from a cookie), with the value fetched from database. The `validateAuthKey` method just needs to compare the `$authKey` variable, passed as a parameter (itself retrieved from a cookie), with the value fetched from the database.

14
docs/internals/design-decisions.md

@ -0,0 +1,14 @@
Design Decisions
================
This document lists the design decisions that we have made after extensive discussions. Unless there are very strong
reasons, these decisions should be kept for consistency. Any change to these decisions should get agreement among
the core developers.
1. **[When to support path aliases](https://github.com/yiisoft/yii2/pull/3079#issuecomment-40312268)**
we should support path alias for properties that are configurable because using path aliases in configurations
are very convenient. In other cases, we should restrict the support for path aliases.
2. **When to translate messages**
messages should be translated when these are displayed to non-tech end user and make sense to him. HTTP status messages,
exceptions about the code etc. should not be translated. Console messages are always in English because of encoding
and codepage handling difficulties.

2
framework/CHANGELOG.md

@ -207,6 +207,7 @@ Yii Framework 2 Change Log
- Bug #5049: `ActiveForm::validationDelay` should be applied to user types only (qiangxue) - Bug #5049: `ActiveForm::validationDelay` should be applied to user types only (qiangxue)
- Bug #5055: Fixed `yii\console\controllers\CacheController` does not check if cache component instance of 'yii\caching\Cache' (klimov-paul) - Bug #5055: Fixed `yii\console\controllers\CacheController` does not check if cache component instance of 'yii\caching\Cache' (klimov-paul)
- Bug #5126: Fixed text body and charset not being set for multipart mail (nkovacs) - Bug #5126: Fixed text body and charset not being set for multipart mail (nkovacs)
- Bug #6305: `yii\i18n\Formatter::asParagraphs()` was not unicode-aware (samdark)
- Bug: Fixed inconsistent return of `\yii\console\Application::runAction()` (samdark) - Bug: Fixed inconsistent return of `\yii\console\Application::runAction()` (samdark)
- Bug: URL encoding for the route parameter added to `\yii\web\UrlManager` (klimov-paul) - Bug: URL encoding for the route parameter added to `\yii\web\UrlManager` (klimov-paul)
- Bug: Fixed the bug that requesting protected or private action methods would cause 500 error instead of 404 (qiangxue) - Bug: Fixed the bug that requesting protected or private action methods would cause 500 error instead of 404 (qiangxue)
@ -247,7 +248,6 @@ Yii Framework 2 Change Log
- Enh #3283: Added `$checkAjax` to `yii\web\User::loginRequired()` (qiangxue) - Enh #3283: Added `$checkAjax` to `yii\web\User::loginRequired()` (qiangxue)
- Enh #3284: Added support for checking multiple ETags by `yii\filters\HttpCache` (qiangxue) - Enh #3284: Added support for checking multiple ETags by `yii\filters\HttpCache` (qiangxue)
- Enh #3298: Supported configuring `View::theme` using a class name (netyum, qiangxue) - Enh #3298: Supported configuring `View::theme` using a class name (netyum, qiangxue)
- Enh #3305: Added `refreshSchema()` method to `yii\console\controllers\BaseMigrateController` to allow flushing DB schema cache (6pblcb, samdark)
- Enh #3328: `BaseMailer` generates better text body from html body (armab) - Enh #3328: `BaseMailer` generates better text body from html body (armab)
- Enh #3380: Allow `value` in `defaultValueValidator` to be a closure (Alex-Code) - Enh #3380: Allow `value` in `defaultValueValidator` to be a closure (Alex-Code)
- Enh #3384: Added callback-style transactions (leandrogehlen, Ragazzo, samdark) - Enh #3384: Added callback-style transactions (leandrogehlen, Ragazzo, samdark)

9
framework/console/controllers/BaseMigrateController.php

@ -626,15 +626,6 @@ abstract class BaseMigrateController extends Controller
} }
/** /**
* Flushes DB schema cache.
* This method should be implemented if connection has DB schema support.
* @since 2.0.1
*/
protected function refreshSchema()
{
}
/**
* Returns the migration history. * Returns the migration history.
* @param integer $limit the maximum number of records in the history to be returned. `null` for "no limit". * @param integer $limit the maximum number of records in the history to be returned. `null` for "no limit".
* @return array the migration history * @return array the migration history

10
framework/console/controllers/MigrateController.php

@ -179,14 +179,4 @@ class MigrateController extends BaseMigrateController
'version' => $version, 'version' => $version,
])->execute(); ])->execute();
} }
/**
* @inheritdoc
* @since 2.0.1
*/
protected function refreshSchema()
{
$this->db->schema->refresh();
$this->stdout("DB schema cache was flushed.\n", Console::FG_GREEN);
}
} }

2
framework/i18n/Formatter.php

@ -322,7 +322,7 @@ class Formatter extends Component
if ($value === null) { if ($value === null) {
return $this->nullDisplay; return $this->nullDisplay;
} }
return str_replace('<p></p>', '', '<p>' . preg_replace('/\R{2,}/', "</p>\n<p>", Html::encode($value)) . '</p>'); return str_replace('<p></p>', '', '<p>' . preg_replace('/\R{2,}/u', "</p>\n<p>", Html::encode($value)) . '</p>');
} }
/** /**

11
framework/messages/fa-IR/yii.php

@ -52,6 +52,17 @@ return [
'Update' => 'بروزرسانی', 'Update' => 'بروزرسانی',
'View' => 'نما', 'View' => 'نما',
'Yes' => 'بله', 'Yes' => 'بله',
'in {delta, plural, =1{a year} other{# years}}' => '{delta} سال دیگر',
'in {delta, plural, =1{a month} other{# months}}' => '{delta} ماه دیگر',
'in {delta, plural, =1{a day} other{# days}}' => '{delta} روز دیگر',
'in {delta, plural, =1{an hour} other{# hours}}' => '{delta} ساعت دیگر',
'in {delta, plural, =1{a minute} other{# minutes}}' => '{delta} دقیقه دیگر',
'{delta, plural, =1{a month} other{# months}} ago' => '{delta} ماه قبل',
'{delta, plural, =1{a day} other{# days}} ago' => '{delta} روز قبل',
'{delta, plural, =1{an hour} other{# hours}} ago' => '{delta} ساعت قبل',
'{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta} دقیقه قبل',
'{delta, plural, =1{a second} other{# seconds}} ago' => '{delta} ثانیه قبل',
'just now' => 'هم اکنون',
'You are not allowed to perform this action.' => 'شما دسترسی به انجام این عملیات را ندارید.', 'You are not allowed to perform this action.' => 'شما دسترسی به انجام این عملیات را ندارید.',
'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'شما حداکثر {limit, number} فایل را میتوانید آپلود کنید.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'شما حداکثر {limit, number} فایل را میتوانید آپلود کنید.',
'the input value' => 'مقدار ورودی', 'the input value' => 'مقدار ورودی',

Loading…
Cancel
Save