[Yii2笔记]026收集表格输入(Collecting tabular input) [ 技术分享 ]
说明
学习Yii Framework 2(易2框架)的过程是漫长的,也是充满乐趣的,以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现,提供了较完整的代码,供你参考。不妥之处,请多多指正!
原文网址:
http://www.yiiframework.com/doc-2.0/guide-input-tabular-input.html
本文主题:收集表格输入(Collecting tabular input)
有时你可能需要在一个表单中处理多个相似的模型。例如,多项设置(multiple settings),每个设置都存储为一个键-值对,并使用一个Setting活动记录模型来表示。这种表单也被称为表格输入(tabular input)。与此相对比,处理不同类型的模型的复杂表格输入请参见Complex Forms with Multiple Models: http://www.yiiframework.com/doc-2.0/guide-input-multiple-models.html
接下来将描述如何使用Yii实现表格输入。
大概有三种不同的情形,处理时会有一些微小的差别: 1、从数据库更新一组固定记录 2、创建一个新的动态记录集 3、在一个页面中更新,创建和删除多条记录
与前面的单模型表单处理相比,我们现在将与一个模型数组打交道,此数组将传递给视图,在同一张表格中显示每个模型的输入字段,我们将使用yii\base\Model的帮助方法,它允许我们一次性加载和验证多个模型: Model::loadMultiple(),将提交的数据加载到一个模型数组中 Model::validateMultiple(),验证一个模型数组。
更新一组固定记录(Updating a fixed set of records)
我们从控制器的动作开始:
<?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()使用提交的表单数据填充多模型,Model::validateMultiple()一次性验证所有的模型。我们在前面使用validateMultiple()验证了多个模型,所以现在给save()传入一个false参数就不支再次验证了。
接下来是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();
我们在这里为每一个设置提供一个名字和一个带值的输入框。为输入框的名字添加一个索引是非常必要的,这样Model::loadMultiple()才能知道哪个值该填充哪个模型的。
创建一个新的动态记录集(Creating a dynamic set of new records)
创建新的记录集与更新类似,除了实例化模型的部分:
public function actionCreate(){
$count=count(Yii::$app->request->post('Setting',[]));
$settings=[new Setting()];
for($i=1;$i<$count;$i++){
$settings[]=new Setting();
}
}
在这里我们创建了一个初始化的$settings 数组,它默认包含了一个模型,所以在视图中我们都至少可以看到一个文本项。另外,我们为每行可以接收到的输入添加了其他模型。
在视图中你可以使用JavaScript动态添加新的输入项。
在同一页面中进行更新、创建和删除(Combining Update,Create and Delete on one page)
注意:此节内容正在完善中。 暂无内容。
TBD(To Be Determined)
(全文完)
共 0 条回复
阿江
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276