有时你需要在一个表单中以单一的形式处理多个模型。例如,有多个设置, 每个设置存储为一个 name-value,并通过 Setting 活动记录 模型来表示。这种形式也常被称为“列表输入”。与此相反, 处理不同模型的不同类型,在 多模型同时输入章节中介绍。
下面展示了如何在 Yii 中收集列表输入。
在三种不同的情况下,所需处理的略有不同:
与之前介绍的单一模型表单相反,我们现在用的是一个数组类的模型。这个数组将 每个模型传递到视图并以一种类似于表格的方式来显示表单字段。 我们使用 yii\base\Model 助手类方法来一次性地加载和验证多模型数据:
让我们从控制器的动作开始:
<?php namespace app\controllers; use Yii; use yii\base\Model; use yii\web\Controller; use app\models\Setting; class SettingsController extends Controller { // ... public function actionUpdate() { $settings = Setting::find()->indexBy('id')->all(); if (Model::loadMultiple($settings, Yii::$app->request->post()) && Model::validateMultiple($settings)) { foreach ($settings as $setting) { $setting->save(false); } return $this->redirect('index'); } return $this->render('update', ['settings' => $settings]); } } 在上面的代码中,当用模型来从数据库获取数据时,我们使用 indexBy() 来让模型的主键成为一个数组的索引。其中 Model::loadMultiple() 用于接收以 POST 方式提交的表单数据并填充多个模型, Model::validateMultiple() 一次验证多个模型。 正如我们之前验证的模型,使用了 validateMultiple(),现在通过传递 false 作为 save()的一个参数使其不会重复验证两次。
现在在 update 视图的表单:
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; $form = ActiveForm::begin(); foreach ($settings as $index => $setting) { echo $form->field($setting, "[$index]value")->label($setting->name); } ActiveForm::end(); 在这里,我们为每个设置渲染了名字和一个带值的输入。重要的是给 input name 增加添加适当的索引, 因为这是由 Model::loadMultiple() 来决定以哪些值来填补哪个模型。
创造新的记录与修改记录很相似,除部分实例化模型不同之外:
public function actionCreate() { $count = count(Yii::$app->request->post('Setting', [])); $settings = [new Setting()]; for($i = 1; $i < $count; $i++) { $settings[] = new Setting(); } // ... } 在这里,我们创建了一个初始的 $settings 数组包含一个默认的模型,所以始终至少有一个文本字段是可见的。 此外,我们为每个可能会收到的输入行添加更多的模型。
在视图中,可以使用 JavaScript 来动态地添加新的输入行。
注意: 此章节正在开发中。
还没有内容。
TBD
Found a typo, or you think this page needs improvement?
Edit it on GitHub !
Signup or Login in order to comment.