在处理一些复杂数据时,您可能需要使用多个不同的模型来收集用户输入。例如,假设用户登录信息存储在 user
表中,而用户个人资料信息存储在 profile
表中,您可能希望通过 User
模型和 Profile
模型来收集有关用户的输入数据。借助 Yii 模型和表单支持,您可以以与处理单个模型没有太大区别的方式解决此问题。
在下文中,我们将展示如何创建一个表单,使您能够收集 User
和 Profile
模型的数据。
首先,收集用户和个人资料数据的控制器操作可以编写如下:
namespace app\controllers;
use Yii;
use yii\base\Model;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use app\models\User;
use app\models\Profile;
class UserController extends Controller
{
public function actionUpdate($id)
{
$user = User::findOne($id);
if (!$user) {
throw new NotFoundHttpException("The user was not found.");
}
$profile = Profile::findOne($user->profile_id);
if (!$profile) {
throw new NotFoundHttpException("The user has no profile.");
}
$user->scenario = 'update';
$profile->scenario = 'update';
if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) {
$isValid = $user->validate();
$isValid = $profile->validate() && $isValid;
if ($isValid) {
$user->save(false);
$profile->save(false);
return $this->redirect(['user/view', 'id' => $id]);
}
}
return $this->render('update', [
'user' => $user,
'profile' => $profile,
]);
}
}
在 update
操作中,我们首先从数据库加载要更新的 $user
和 $profile
模型。然后,我们调用 yii\base\Model::load() 来使用用户输入填充这两个模型。如果加载成功,我们将验证这两个模型,然后保存它们——请注意,我们使用 save(false)
跳过模型内部的验证,因为用户输入数据已过验证。如果加载不成功,我们将渲染 update
视图,该视图具有以下内容:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
$form = ActiveForm::begin([
'id' => 'user-update-form',
'options' => ['class' => 'form-horizontal'],
]) ?>
<?= $form->field($user, 'username') ?>
...other input fields...
<?= $form->field($profile, 'website') ?>
<?= Html::submitButton('Update', ['class' => 'btn btn-primary']) ?>
<?php ActiveForm::end() ?>
如您所见,在 update
视图中,您将使用两个模型 $user
和 $profile
渲染输入字段。
发现错字或您认为此页面需要改进?
在 github 上编辑它 !
注册 或 登录 以发表评论。