Commit 6b460c98 by Qiang Xue

Merge pull request #5616 from yii2-chinesization/master

Update old files and add some new translations
parents acba9e5b f6446042
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
```php ```php
namespace app\components; namespace app\components;
use yii\base\Model;
use yii\base\Behavior; use yii\base\Behavior;
class MyBehavior extends Behavior class MyBehavior extends Behavior
...@@ -188,14 +187,14 @@ echo $component->prop1; ...@@ -188,14 +187,14 @@ echo $component->prop1;
$component->prop1 = $value; $component->prop1 = $value;
``` ```
类似地也可以调用行为的**公共*方法: 类似地也可以调用行为的**公共**方法:
```php ```php
// bar() 是定义在行为类的公共方法 // foo() 是定义在行为类的公共方法
$component->bar(); $component->foo();
``` ```
如你所见,尽管 `$component` 未定义 `prop1``bar()` ,它们用起来也像组件自己定义的一样。 如你所见,尽管 `$component` 未定义 `prop1``foo()` ,它们用起来也像组件自己定义的一样。
如果两个行为都定义了一样的属性或方法,并且它们都附加到同一个组件,那么**首先**附加上的行为在属性或方法被访问时有优先权。 如果两个行为都定义了一样的属性或方法,并且它们都附加到同一个组件,那么**首先**附加上的行为在属性或方法被访问时有优先权。
......
...@@ -17,7 +17,7 @@ $config = [ ...@@ -17,7 +17,7 @@ $config = [
$db = Yii::createObject($config); $db = Yii::createObject($config);
``` ```
[[Yii::createObject()]] 方法接受一个配置并根据配置中指定的类名创建对象。对象实例化后,剩余的参数被用来初始化对象的属性,事件处理和行为。 [[Yii::createObject()]] 方法接受一个配置数组并根据数组中指定的类名创建对象。对象实例化后,剩余的参数被用来初始化对象的属性,事件处理和行为。
对于已存在的对象,可以使用 [[Yii::configure()]] 方法根据配置去初始化其属性,就像这样: 对于已存在的对象,可以使用 [[Yii::configure()]] 方法根据配置去初始化其属性,就像这样:
...@@ -46,7 +46,8 @@ Yii::configure($object, $config); ...@@ -46,7 +46,8 @@ Yii::configure($object, $config);
* `class` 元素指定了将要创建的对象的完全限定类名。 * `class` 元素指定了将要创建的对象的完全限定类名。
* `propertyName` 元素指定了对象属性的初始值。键名是属性名,值是该属性对应的初始值。只有公共成员变量以及通过 getter/setter 定义的[属性](concept-properties.md)可以被配置。 * `propertyName` 元素指定了对象属性的初始值。键名是属性名,值是该属性对应的初始值。只有公共成员变量以及通过 getter/setter 定义的[属性](concept-properties.md)可以被配置。
* `on eventName` 元素指定了附加到对象[事件](concept-events.md)上的句柄是什么。请注意,数组的键名由 `on ` 前缀加事件名组成。请参考[事件](concept-events.md)章节了解事件句柄格式。 * `on eventName` 元素指定了附加到对象[事件](concept-events.md)上的句柄是什么。请注意,数组的键名由 `on ` 前缀加事件名组成。请参考[事件](concept-events.md)章节了解事件句柄格式。
* `as behaviorName` 元素指定了附加到对象的[行为](concept-behaviors.md)。请注意,数组的键名由 `as ` 前缀加行为名组成。`$behaviorConfig` 表示创建行为的配置信息,格式与我们现在总体叙述的配置格式一样。 * `as behaviorName` 元素指定了附加到对象的[行为](concept-behaviors.md)。请注意,数组的键名由 `as ` 前缀加行为名组成。`$behaviorConfig`
值表示创建行为的配置信息,格式与我们之前描述的配置格式一样。
下面是一个配置了初始化属性值,事件句柄和行为的示例: 下面是一个配置了初始化属性值,事件句柄和行为的示例:
...@@ -117,7 +118,7 @@ $config = [ ...@@ -117,7 +118,7 @@ $config = [
### 小部件的配置 <a name="widget-configurations"></a> ### 小部件的配置 <a name="widget-configurations"></a>
使用[小部件](structure-widgets.md)时,常常需要配置以便自定义其属性。 [[yii\base\Widget::widget()]] 和 [[yii\base\Widget::beginWidget()]] 方法都可以用来创建小部件。它们可以接受配置数组: 使用[小部件](structure-widgets.md)时,常常需要配置以便自定义其属性。 [[yii\base\Widget::widget()]] 和 [[yii\base\Widget::begin()]] 方法都可以用来创建小部件。它们可以接受配置数组:
```php ```php
use yii\widgets\Menu; use yii\widgets\Menu;
......
...@@ -174,7 +174,7 @@ $foo->off(Foo::EVENT_HELLO); ...@@ -174,7 +174,7 @@ $foo->off(Foo::EVENT_HELLO);
以上部分,我们叙述了在**实例级别**如何附加处理器到事件。有时想要一个类的所有实例而不是一个指定的实例都响应一个被触发的事件,并不是一个个附加事件处理器到每个实例,而是通过调用静态方法 [[yii\base\Event::on()]] 在**类级别**附加处理器。 以上部分,我们叙述了在**实例级别**如何附加处理器到事件。有时想要一个类的所有实例而不是一个指定的实例都响应一个被触发的事件,并不是一个个附加事件处理器到每个实例,而是通过调用静态方法 [[yii\base\Event::on()]] 在**类级别**附加处理器。
例如,[活动记录](db-active-record.md)对象要在每次往数据库新增一条新记录时触发一个 [[yii\base\ActiveRecord::EVENT_AFTER_INSERT]] 事件。要追踪每个[活动记录](db-active-record.md)对象的新增记录完成情况,应如下写代码: 例如,[活动记录](db-active-record.md)对象要在每次往数据库新增一条新记录时触发一个 [[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 事件。要追踪每个[活动记录](db-active-record.md)对象的新增记录完成情况,应如下写代码:
```php ```php
use Yii; use Yii;
...@@ -186,7 +186,7 @@ Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ...@@ -186,7 +186,7 @@ Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function
}); });
``` ```
每当 [[yii\base\ActiveRecord|ActiveRecord]] 或其子类的实例触发 [[yii\base\ActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 事件时,这个事件处理器都会执行。在这个处理器中,可以通过 `$event->sender` 获取触发事件的对象。 每当 [[yii\db\BaseActiveRecord|ActiveRecord]] 或其子类的实例触发 [[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 事件时,这个事件处理器都会执行。在这个处理器中,可以通过 `$event->sender` 获取触发事件的对象。
当对象触发事件时,它首先调用实例级别的处理器,然后才会调用类级别处理器。 当对象触发事件时,它首先调用实例级别的处理器,然后才会调用类级别处理器。
......
属性(Property) 属性(Property)
========== ==========
在 PHP 中,类的成员变量也被称为**属性(properties)**。它们是类定义的一部分,用来表现一个实例的状态(也就是区分类的不同实例)。在具体实践中,常常会想用一个稍微特殊些的方法实现属性的读写。例如,要对 `label` 属性执行 trim 操作,可以用以下代码实现: 在 PHP 中,类的成员变量也被称为**属性(properties)**。它们是类定义的一部分,用来表现一个实例的状态(也就是区分类的不同实例)。在具体实践中,常常会想用一个稍微特殊些的方法实现属性的读写。例如,如果有需求每次都要对 `label` 属性执行 trim 操作,就可以用以下代码实现:
```php ```php
$object->label = trim($label); $object->label = trim($label);
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
安装 安装
------------ ------------
Yii 2.0 完全拥抱 [Composer](https://getcomposer.org/),它是事实上的 PHP 依赖管理工具。核心框架以及扩展的安装都通过 Composer 来处理。想要了解更多如何安装 Yii 2.0 请参阅本指南的 [安装 Yii](start-installation.md) 章节。如果你想创建新扩展,或者把你已有的 Yii 1.1 的扩展改写成兼容 2.0 的版本,你可以参考 [创建扩展](extend-creating-extensions.md) 章节。 Yii 2.0 完全拥抱 [Composer](https://getcomposer.org/),它是事实上的 PHP 依赖管理工具。核心框架以及扩展的安装都通过 Composer 来处理。想要了解更多如何安装 Yii 2.0 请参阅本指南的 [安装 Yii](start-installation.md) 章节。如果你想创建新扩展,或者把你已有的 Yii 1.1 的扩展改写成兼容 2.0 的版本,你可以参考 [创建扩展](structure-extensions.md#creating-extensions) 章节。
PHP 需求 PHP 需求
...@@ -158,7 +158,7 @@ public function scenarios() ...@@ -158,7 +158,7 @@ public function scenarios()
控制器(Controller) 控制器(Controller)
----------- -----------
Yii 2.0 使用 [[yii\web\Controller]] 作为控制器的基类,类似于 1.1 的 `CWebController`。使用 [[yii\base\Action]] 作为操作类的基类。 Yii 2.0 使用 [[yii\web\Controller]] 作为控制器的基类,它类似于 1.1 的 `CController`。使用 [[yii\base\Action]] 作为操作类的基类。
这些变化最明显的影响是,当你在写控制器操作的代码时,应该返回(return)要渲染的内容而不是输出(echo)它: 这些变化最明显的影响是,当你在写控制器操作的代码时,应该返回(return)要渲染的内容而不是输出(echo)它:
......
...@@ -7,7 +7,7 @@ Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 W ...@@ -7,7 +7,7 @@ Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 W
Yii 最适合做什么? Yii 最适合做什么?
--------------------- ---------------------
Yii 是一个通用的 Web 编程框架,即可以用于开发各种基于 PHP 的 Web 应用。因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用,如门户网站、社区、内容管理系统(CMS)、电子商务项目和 RESTful Web 服务等。 Yii 是一个通用的 Web 编程框架,即可以用于开发各种用 PHP 构建的 Web 应用。因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用,如门户网站、社区、内容管理系统(CMS)、电子商务项目和 RESTful Web 服务等。
Yii 和其他框架相比呢? Yii 和其他框架相比呢?
------------------------------------------- -------------------------------------------
...@@ -15,9 +15,11 @@ Yii 和其他框架相比呢? ...@@ -15,9 +15,11 @@ Yii 和其他框架相比呢?
如果你有其它框架使用经验,那么你会很开心看到 Yii 所做的努力: 如果你有其它框架使用经验,那么你会很开心看到 Yii 所做的努力:
- 和其他 PHP 框架类似,Yii 实现了 MVC(Model-View-Controller)设计模式并基于该模式组织代码。 - 和其他 PHP 框架类似,Yii 实现了 MVC(Model-View-Controller)设计模式并基于该模式组织代码。
- Yii 的代码简洁优雅,这是它的编程哲学。它永远不会为了严格遵照某种设计模式而对代码进行过度的设计。 - Yii 的代码简洁优雅,这是它的编程哲学。它永远不会为了刻板地遵照某种设计模式而对代码进行过度的设计。
- Yii 是一个全栈框架,提供了大量久经考验,开箱即用的特性:对关系型和 NoSQL 数据库都提供了查询生成器和 ActiveRecord;RESTful API 的开发支持;多层缓存支持,等等。 - Yii 是一个全栈框架,提供了大量久经考验,开箱即用的特性:对关系型和 NoSQL 数据库都提供了查询生成器和
- Yii 非常易于扩展。你可以自定义或替换几乎任何一处核心代码。你还会受益于它坚实可靠的扩展架构,使用、再开发或再发布扩展。 ActiveRecord;RESTful API 的开发支持;多层缓存支持,等等。
- Yii 非常易于扩展。你可以自定义或替换几乎任何一处核心代码。你还会受益于 Yii
坚实可靠的扩展架构,使用、再开发或再发布扩展。
- 高性能始终是 Yii 的首要目标之一。 - 高性能始终是 Yii 的首要目标之一。
Yii 不是一场独角戏,它由一个[强大的开发者团队](http://www.yiiframework.com/about/)提供支持,也有一个庞大的专家社区,持续不断地对 Yii 的开发作出贡献。Yii 开发者团队始终对 Web 开发趋势和其他框架及项目中的最佳实践和特性保持密切关注,那些有意义的最佳实践及特性会被不定期的整合进核心框架中,并提供简单优雅的接口。 Yii 不是一场独角戏,它由一个[强大的开发者团队](http://www.yiiframework.com/about/)提供支持,也有一个庞大的专家社区,持续不断地对 Yii 的开发作出贡献。Yii 开发者团队始终对 Web 开发趋势和其他框架及项目中的最佳实践和特性保持密切关注,那些有意义的最佳实践及特性会被不定期的整合进核心框架中,并提供简单优雅的接口。
......
运行机制概述
========
每一次 Yii 应用开始处理 HTTP 请求时,它都会进行一个近似的流程。
1. 用户提交指向 [入口脚本](structure-entry-scripts.md) `web/index.php` 的请求。
2. 入口脚本会加载 [配置数组](concept-configurations.md) 并创建一个
[应用](structure-applications.md) 实例用于处理该请求。
3. 应用会通过 [request(请求)](runtime-requests.md) 应用组件解析被请求的 [路由](runtime-routing.md)
4. 应用创建一个 [controller(控制器)](structure-controllers.md) 实例具体处理请求。
5. 控制器会创建一个 [action(动作)](structure-controllers.md) 实例并为该动作执行相关的 Filters(访问过滤器)。
6. 如果任何一个过滤器验证失败,该动作会被取消。
7. 如果全部的过滤器都通过,该动作就会被执行。
8. 动作会加载一个数据模型,一般是从数据库中加载。
9. 动作会渲染一个 View(视图),并为其提供所需的数据模型。
10. 渲染得到的结果会返回给 [response(响应)](runtime-responses.md) 应用组件。
11. 响应组件会把渲染结果发回给用户的浏览器。
下面的示意图展示了应用是如何处理一个请求的。
![Request Lifecycle](images/application-lifecycle.png)
在这个版块中,我们会更加详细地描述某些步骤的具体运作。
...@@ -104,7 +104,7 @@ class SiteController extends Controller ...@@ -104,7 +104,7 @@ class SiteController extends Controller
> 补充:表达式 `Yii::$app` 代表[应用](structure-applications.md)实例,它是一个全局可访问的单例。同时它也是一个[服务定位器](concept-service-locator.md),能提供 `request`,`response`,`db` 等等特定功能的组件。在上面的代码里就是使用 `request` 组件来访问应用实例收到的 `$_POST` 数据。 > 补充:表达式 `Yii::$app` 代表[应用](structure-applications.md)实例,它是一个全局可访问的单例。同时它也是一个[服务定位器](concept-service-locator.md),能提供 `request`,`response`,`db` 等等特定功能的组件。在上面的代码里就是使用 `request` 组件来访问应用实例收到的 `$_POST` 数据。
用户提交表单后,操作将会渲染一个名为 `entry-confirm` 的视图去确认用户输入的数据。如果没填表单就提交,或数据包含错误,`entry` 视图将会渲染输出,连同表单一起输出的还有验证错误的详细信息。 用户成功提交表单后,操作将会渲染一个名为 `entry-confirm` 的视图去确认用户输入的数据。如果没填表单就提交,或数据包含错误,`entry` 视图将会渲染输出,连同表单一起输出的还有验证错误的详细信息。
> 注意:在这个简单例子里我们只是呈现了有效数据的确认页面。实践中你应该考虑使用 [[yii\web\Controller::refresh()|refresh()]] 或 [[yii\web\Controller::redirect()|redirect()]] 去避免[表单重复提交问题](http://en.wikipedia.org/wiki/Post/Redirect/Get)。 > 注意:在这个简单例子里我们只是呈现了有效数据的确认页面。实践中你应该考虑使用 [[yii\web\Controller::refresh()|refresh()]] 或 [[yii\web\Controller::redirect()|redirect()]] 去避免[表单重复提交问题](http://en.wikipedia.org/wiki/Post/Redirect/Get)。
......
安装 Yii 安装 Yii
============== ==============
你可以通过两种方式安装 Yii:使用 [Composer](http://getcomposer.org/) 或下载一个归档文件。推荐使用前者,这样只需执行一条简单的命令就可以安装新的[扩展](extend-creating-extensions.md)或更新 Yii 了。 你可以通过两种方式安装 Yii:使用 [Composer](http://getcomposer.org/) 或下载一个归档文件。推荐使用前者,这样只需执行一条简单的命令就可以安装新的[扩展](structure-extensions.md)或更新 Yii 了。
> 注意:和 Yii 1 不同,以标准方式安装 Yii 2 时会同时下载并安装框架本身和一个应用程序的基本骨架。 > 注意:和 Yii 1 不同,以标准方式安装 Yii 2 时会同时下载并安装框架本身和一个应用程序的基本骨架。
...@@ -18,15 +18,24 @@ ...@@ -18,15 +18,24 @@
如果遇到任何问题或者想更深入地学习 Composer,请参考 [Composer 文档(英文)](https://getcomposer.org/doc/)[Composer 中文](https://github.com/5-say/composer-doc-cn) 如果遇到任何问题或者想更深入地学习 Composer,请参考 [Composer 文档(英文)](https://getcomposer.org/doc/)[Composer 中文](https://github.com/5-say/composer-doc-cn)
如果你已经安装有 Composer 请确保使用的是最新版本,你可以用 `composer self-update` 命令更新 Composer 为最新版本。
Composer 安装后,切换到一个可通过 Web 访问的目录,执行如下命令即可安装 Yii : Composer 安装后,切换到一个可通过 Web 访问的目录,执行如下命令即可安装 Yii :
composer global require "fxp/composer-asset-plugin:1.0.0-beta3" composer global require "fxp/composer-asset-plugin:1.0.0-beta3"
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 管理 bower 和 npm 包所必须的,此命令全局应用,只需执行一次即可。 第一条命令安装 [Composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/),它是通过 Composer 管理 bower 和 npm 包所必须的,此命令全局生效,一劳永逸。
第二条命令会将 Yii 安装在名为 `basic` 的目录中。 第二条命令会将 Yii 安装在名为 `basic` 的目录中,你也可以随便选择其他名称。
> 注意:在安装过程中 Composer 可能会询问你 GitHub 账户的登录信息,因为可能在使用中超过了 GitHub API
(对匿名用户的)使用限制。因为 Composer 需要为所有扩展包从 GitHub
中获取大量信息,所以超限非常正常。(译者注:也意味着作为程序猿没有 GitHub 账号,就真不能愉快地玩耍了)登陆 GitHub
之后可以得到更高的 API 限额,这样 Composer 才能正常运行。更多细节请参考 [Composer
文档](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens)(该段 Composer
中文文档[期待您的参与](https://github.com/5-say/composer-doc-cn/blob/master/cn-introduction/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens))。
> 技巧:如果你想安装 Yii 的最新开发版本,可以使用如下命令,它添加了一个 [stability 选项](https://getcomposer.org/doc/04-schema.md#minimum-stability)([中文版](https://github.com/5-say/composer-doc-cn/blob/master/cn-introduction/04-schema.md#minimum-stability)): > 技巧:如果你想安装 Yii 的最新开发版本,可以使用以下命令代替,它添加了一个 [stability 选项](https://getcomposer.org/doc/04-schema.md#minimum-stability)([中文版](https://github.com/5-say/composer-doc-cn/blob/master/cn-introduction/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
> >
...@@ -36,9 +45,9 @@ Composer 安装后,切换到一个可通过 Web 访问的目录,执行如下 ...@@ -36,9 +45,9 @@ Composer 安装后,切换到一个可通过 Web 访问的目录,执行如下
通过归档文件安装 <a name="installing-from-archive-file"></a> 通过归档文件安装 <a name="installing-from-archive-file"></a>
------------------------------- -------------------------------
通过归档文件安装 Yii 包括个步骤: 通过归档文件安装 Yii 包括个步骤:
1.[yiiframework.com](http://www.yiiframework.com/download/yii2-basic) 下载归档文件。 1.[yiiframework.com](http://www.yiiframework.com/download/) 下载归档文件。
2. 将下载的文件解压缩到 Web 目录中。 2. 将下载的文件解压缩到 Web 目录中。
3. 修改 `config/web.php` 文件,给 `cookieValidationKey` 配置项添加一个密钥(若你通过 Composer 安装,则此步骤会自动完成): 3. 修改 `config/web.php` 文件,给 `cookieValidationKey` 配置项添加一个密钥(若你通过 Composer 安装,则此步骤会自动完成):
...@@ -108,8 +117,8 @@ http://localhost/basic/web/index.php ...@@ -108,8 +117,8 @@ http://localhost/basic/web/index.php
DocumentRoot "path/to/basic/web" DocumentRoot "path/to/basic/web"
<Directory "path/to/basic/web"> <Directory "path/to/basic/web">
# 开启 mod_rewrite 用于美化 URL 功能的支持(译者注:对应 pretty URL 选项)
RewriteEngine on RewriteEngine on
# 如果请求的是真实存在的文件或目录,直接访问 # 如果请求的是真实存在的文件或目录,直接访问
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-d
......
...@@ -12,9 +12,11 @@ ...@@ -12,9 +12,11 @@
- 书籍 - 书籍
* [扩展](http://www.yiiframework.com/extensions/):Yii 拥有数以千计用户提供的扩展,这些扩展能非常方便的插入到应用中,使你的应用开发过程更加方便快捷。 * [扩展](http://www.yiiframework.com/extensions/):Yii 拥有数以千计用户提供的扩展,这些扩展能非常方便的插入到应用中,使你的应用开发过程更加方便快捷。
* 社区 * 社区
- [官方论坛](http://www.yiiframework.com/forum/) - 官方论坛:<http://www.yiiframework.com/forum/>
- [GitHub](https://github.com/yiisoft/yii2) - IRC 聊天室:Freenode 网络上的 #yii 频道 (<irc://irc.freenode.net/yii>)(使用英文哦,无需反馈上游的问题可以加
- [Facebook](https://www.facebook.com/groups/yiitalk/) QQ-Yii2中国交流群)
- [Twitter](https://twitter.com/yiiframework) - GitHub:<https://github.com/yiisoft/yii2>
- [LinkedIn](https://www.linkedin.com/groups/yii-framework-1483367) - Facebook:<https://www.facebook.com/groups/yiitalk/>
- Twitter:<https://twitter.com/yiiframework>
- LinkedIn:<https://www.linkedin.com/groups/yii-framework-1483367>
小部件
=======
小部件是在 [视图](structure-views.md) 中使用的可重用单元,使用面向对象方式创建复杂和可配置用户界面单元。
例如,日期选择器小部件可生成一个精致的允许用户选择日期的日期选择器,
你只需要在视图中插入如下代码:
```php
<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget(['name' => 'date']) ?>
```
Yii提供许多优秀的小部件,比如[[yii\widgets\ActiveForm|active form]], [yii\widgets\Menu|menu]],
[jQuery UI widgets](widget-jui.md), [Twitter Bootstrap widgets](widget-bootstrap.md)
接下来介绍小部件的基本知识,如果你想了解某个小部件请参考对应的类API文档。
## 使用小部件 <a name="using-widgets"></a>
小部件基本上在[views](structure-views.md)中使用,在视图中可调用 [[yii\base\Widget::widget()]] 方法使用小部件。
该方法使用 [配置](concept-configurations.md) 数组初始化小部件并返回小部件渲染后的结果。
例如如下代码插入一个日期选择器小部件,它配置为使用俄罗斯语,输入框内容为`$model``from_date`属性值。
```php
<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget([
'model' => $model,
'attribute' => 'from_date',
'language' => 'ru',
'clientOptions' => [
'dateFormat' => 'yy-mm-dd',
],
]) ?>
```
一些小部件可在[[yii\base\Widget::begin()]] 和 [[yii\base\Widget::end()]] 调用中使用数据内容。Some widgets can take a block of content which should be enclosed between the invocation of
例如如下代码使用[[yii\widgets\ActiveForm]]小部件生成一个登录表单,
小部件会在`begin()` 和0 `end()`执行处分别生成`<form>`的开始标签和结束标签,中间的任何代码也会被渲染。
```php
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
?>
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<div class="form-group">
<?= Html::submitButton('Login') ?>
</div>
<?php ActiveForm::end(); ?>
```
注意和调用 [[yii\base\Widget::widget()]] 返回渲染结果不同,
调用 [[yii\base\Widget::begin()]] 方法返回一个可组建小部件内容的小部件实例。
## 创建小部件 <a name="creating-widgets"></a>
## Creating Widgets <a name="creating-widgets"></a>
继承 [[yii\base\Widget]] 类并覆盖 [[yii\base\Widget::init()]] 和/或
[[yii\base\Widget::run()]] 方法可创建小部件。通常`init()` 方法处理小部件属性,
`run()` 方法包含小部件生成渲染结果的代码。
渲染结果可在`run()`方法中直接"echoed"输出或以字符串返回。
如下代码中`HelloWidget`编码并显示赋给`message` 属性的值,
如果属性没有被赋值,默认会显示"Hello World"。
```php
namespace app\components;
use yii\base\Widget;
use yii\helpers\Html;
class HelloWidget extends Widget
{
public $message;
public function init()
{
parent::init();
if ($this->message === null) {
$this->message = 'Hello World';
}
}
public function run()
{
return Html::encode($this->message);
}
}
```
使用这个小部件只需在视图中简单使用如下代码:
```php
<?php
use app\components\HelloWidget;
?>
<?= HelloWidget::widget(['message' => 'Good morning']) ?>
```
以下是另一种可在`begin()``end()`调用中使用的`HelloWidget`,HTML编码内容然后显示。
```php
namespace app\components;
use yii\base\Widget;
use yii\helpers\Html;
class HelloWidget extends Widget
{
public function init()
{
parent::init();
ob_start();
}
public function run()
{
$content = ob_get_clean();
return Html::encode($content);
}
}
```
如上所示,PHP输出缓冲在`init()`启动,所有在`init()``run()`方法之间的输出内容都会被获取,并在`run()`处理和返回。
> 补充: 当你调用 [[yii\base\Widget::begin()]] 时会创建一个新的小部件实例并在构造结束时调用`init()`方法,
`end()`时会调用`run()`方法并输出返回结果。
如下代码显示如何使用这种 `HelloWidget`:
```php
<?php
use app\components\HelloWidget;
?>
<?php HelloWidget::begin(); ?>
content that may contain <tag>'s
<?php HelloWidget::end(); ?>
```
有时小部件需要渲染很多内容,一种更好的办法是将内容放入一个[视图](structure-views.md)文件,
然后调用[[yii\base\Widget::render()]]方法渲染该视图文件,例如:
```php
public function run()
{
return $this->render('hello');
}
```
小部件的视图文件默认存储在`WidgetPath/views`目录,`WidgetPath`代表小部件类文件所在的目录。
假如上述示例小部件类文件在`@app/components`下,会渲染`@app/components/views/hello.php`视图文件。 You may override
可以覆盖[[yii\base\Widget::getViewPath()]]方法自定义视图文件所在路径。
## 最佳实践 <a name="best-practices"></a>
小部件是面向对象方式来重用视图代码。
创建小部件时仍需要遵循MVC模式,通常逻辑代码在小部件类,展示内容在[视图](structure-views.md)中。
小部件设计时应是独立的,也就是说使用一个小部件时候,可以直接丢弃它而不需要额外的处理。
但是当小部件需要外部资源如CSS, JavaScript, 图片等会比较棘手,
幸运的时候Yii提供 [资源包](structure-asset-bundles.md) 来解决这个问题。
当一个小部件只包含视图代码,它和[视图](structure-views.md)很相似,
实际上,在这种情况下,唯一的区别是小部件是可以重用类,视图只是应用中使用的普通PHP脚本。
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment