阿江 2017-10-03 07:17:42 2647次浏览 0条回复 0 0 0

说明

学习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)

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册