mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-04 14:46:19 +08:00 
			
		
		
		
	@ -135,8 +135,8 @@ $config = [
 | 
				
			|||||||
更多关于应用 `components` 属性配置的信息可以查阅[应用](structure-applications.md)
 | 
					更多关于应用 `components` 属性配置的信息可以查阅[应用](structure-applications.md)
 | 
				
			||||||
以及[服务定位器](concept-service-locator.md)章节。
 | 
					以及[服务定位器](concept-service-locator.md)章节。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Since version 2.0.11, the application configuration supports [Dependency Injection Container](concept-di-container.md)
 | 
					自版本 2.0.11 开始,系统配置支持使用 `container` 属性来配置[依赖注入容器](concept-di-container.md)
 | 
				
			||||||
configuration using `container` property. For example:
 | 
					例如:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```php
 | 
					```php
 | 
				
			||||||
$config = [
 | 
					$config = [
 | 
				
			||||||
@ -148,15 +148,15 @@ $config = [
 | 
				
			|||||||
            'yii\widgets\LinkPager' => ['maxButtonCount' => 5]
 | 
					            'yii\widgets\LinkPager' => ['maxButtonCount' => 5]
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        'singletons' => [
 | 
					        'singletons' => [
 | 
				
			||||||
            // Dependency Injection Container singletons configuration
 | 
					            // 依赖注入容器单例配置
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To know more about the possible values of `definitions` and `singletons` configuration arrays and real-life examples,
 | 
					请参考 [依赖注入容器](concept-di-container.md) 下面的 [高级应用实例](concept-di-container.md#advanced-practical-usage)
 | 
				
			||||||
please read [Advanced Practical Usage](concept-di-container.md#advanced-practical-usage) subsection of the
 | 
					获取更多 `definitions` 和 `singletons` 配置项和实际使用的例子。
 | 
				
			||||||
[Dependency Injection Container](concept-di-container.md) article.
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 小部件的配置 <span id="widget-configurations"></span>
 | 
					### 小部件的配置 <span id="widget-configurations"></span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,16 @@
 | 
				
			|||||||
多模型的复合表单
 | 
					多模型的复合表单
 | 
				
			||||||
==================================
 | 
					==================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
When dealing with some complex data, it is possible that you may need to use multiple different models to collect
 | 
					当需要处理复杂数据,很可能你需要使用多个不同的模型来收集用户提交的数据。
 | 
				
			||||||
the user input. For example, assuming the user login information is stored in the `user` table while the user profile
 | 
					举例来说,假设用户登录信息保存在 `user` 表,但是用户基本信息保存在 `profile` 表,
 | 
				
			||||||
information is stored in the `profile` table, you may want to collect the input data about a user through a `User` model 
 | 
					你可能需要同时使用 `User` 模型和 `Profile` 模型来获取用户登录信息和基本信息。
 | 
				
			||||||
and a `Profile` model. With the Yii model and form support, you can solve this problem in a way that is not much
 | 
					使用 Yii 提供的模型和表单支持,解决这样的问题和处理单一模型并不会有太大的区别。
 | 
				
			||||||
different from handling a single model.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
In the following, we will show how you can create a form that would allow you to collect data for both `User` and `Profile`
 | 
					 | 
				
			||||||
models.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
First, the controller action for collecting the user and profile data can be written as follows, 
 | 
					下面,我们将为你展示怎样创建一个表单并同时处理 `User` 和 `Profile` 这两个模型。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					首先,控制器中收集用户提交数据的动作(action)可以按照下面写的这样,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```php
 | 
					```php
 | 
				
			||||||
namespace app\controllers;
 | 
					namespace app\controllers;
 | 
				
			||||||
@ -28,13 +28,13 @@ class UserController extends Controller
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        $user = User::findOne($id);
 | 
					        $user = User::findOne($id);
 | 
				
			||||||
        if (!$user) {
 | 
					        if (!$user) {
 | 
				
			||||||
            throw new NotFoundHttpException("The user was not found.");
 | 
					            throw new NotFoundHttpException("没有找到用户登录信息。");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        $profile = Profile::findOne($user->profile_id);
 | 
					        $profile = Profile::findOne($user->profile_id);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (!$profile) {
 | 
					        if (!$profile) {
 | 
				
			||||||
            throw new NotFoundHttpException("The user has no profile.");
 | 
					            throw new NotFoundHttpException("没有找到用户基本信息。");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        $user->scenario = 'update';
 | 
					        $user->scenario = 'update';
 | 
				
			||||||
@ -58,11 +58,11 @@ class UserController extends Controller
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In the `update` action, we first load the `$user` and `$profile` models to be updated from the database. We then call 
 | 
					在 `update` 动作中,我们首先从数据库中获取需要更新的 `$user` 和 `$profile` 这两个模型。
 | 
				
			||||||
[[yii\base\Model::load()]] to populate these two models with the user input. If loading is successful, we will validate
 | 
					我们可以调用 [[yii\base\Model::load()]] 方法把用户提交数据填充到两个模型中。
 | 
				
			||||||
the two models and then save them — please note that we use `save(false)` to skip over validations inside the models
 | 
					如果加载成功,验证两个表单并保存 — 请注意我们使用了 `save(false)` 方法用来忽略内部保存时的二次验证,
 | 
				
			||||||
as the user input data have already been validated. If loading is not successful, we will render the `update` view which
 | 
					因为用户输入的数据已经手动验证过了。
 | 
				
			||||||
has the following content:
 | 
					如果填充数据失败,直接显示下面的 `update` 视图内容:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```php
 | 
					```php
 | 
				
			||||||
<?php
 | 
					<?php
 | 
				
			||||||
@ -79,8 +79,8 @@ $form = ActiveForm::begin([
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <?= $form->field($profile, 'website') ?>
 | 
					    <?= $form->field($profile, 'website') ?>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <?= Html::submitButton('Update', ['class' => 'btn btn-primary']) ?>
 | 
					    <?= Html::submitButton('更新数据', ['class' => 'btn btn-primary']) ?>
 | 
				
			||||||
<?php ActiveForm::end() ?>
 | 
					<?php ActiveForm::end() ?>
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
As you can see, in the `update` view you would render input fields using two models `$user` and `$profile`.
 | 
					你可以看到,在 `update` 视图中,我们同时显示了两个模型 `$user` 和 `$profile` 的属性的输入栏。
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user