谁一开始就是大神?

多个模型同时提交,如何收集表单数据?[2.0]

先说我想问什么,现在有一个表格,比如商家登记要卖的商品:
商品名称 商品种类 数量
手机 电子产品 2
电脑 电子产品 1
书籍 书籍 10
这个表单如上已经填写好,现在提交后如何同时写入三条记录到数据库?
并且不一定仅仅是三条,要实现用户点击“添加”按钮就会多一行表单。
我的代码问题在哪里?
控制器:

public function actionRelease() 
    {
        $model = new Seller();
        $goods=[new Goods()];
        $count = count(Yii::$app->request->post('Goods', []));
        for($i = 1; $i < $count; $i++) {
            $goods[] = new Goods();
        }
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $model->save(); 
            if (Model::loadMultiple($goods, Yii::$app->request->post()) && Model::validateMultiple($goods)) {
                foreach ($goods as $good) {
                    $good->release_date=  date('y-m-d',time());
                    $good->seller_id=$model->id;
                    $good->save(false);
                }
            return $this->render('release-confirm');
            }
            return $this->render('release-wrong');
        } else {
            // 无论是初始化显示还是数据验证错误
            return $this->render('release', ['model' => $model,'goods'=>$goods]);
        }
    }

视图:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
//use kartik\select2\Select2;
?>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name'); ?>
<?= $form->field($model, 'gender')->dropDownList(['男'=>'男','女'=>'女']) ?>
<?= $form->field($model, 'student_number') ?>
<?= $form->field($model, 'mobile') ?>
<?= $form->field($model, 'if_big')->dropDownList(['有'=>'有','没有'=>'没有']) ?>
<?= $form->field($model, 'if_alipay')->dropDownList(['是'=>'是','否'=>'否']) ?>
<?= $form->field($model, 'if_present')->dropDownList(['是'=>'是','否'=>'否']) ?>
<?= $form->field($model, 'sell_time')->dropDownList(['全天'=>'全天','上午'=>'上午','下午'=>'下午']) ?>

<?php
foreach ($goods as $index => $v) {
    echo $form->field($v, "name[]")->label($v->name);
    echo $form->field($v, "cate[]")->dropDownList(['书籍'=>'书籍','生活用品'=>'生活用品','电子产品'=>'电子产品','其他'=>'其他'])->label($v->name);
    echo $form->field($v, "number[]")->label($v->name);
}
?>


<div class="form-group">
    <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>

模型数据如下:

<?php

namespace app\models;

use yii\db\ActiveRecord;
/**
 * LoginForm is the model behind the login form.
 */
class Goods extends ActiveRecord
{
    public static function getDb()
    {
        return \Yii::$app->db2;  
    }
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // username and password are both required
            [['name', 'cate','number'], 'required'],
            // rememberMe must be a boolean value
            ['name', 'string','length'=>[1,10]],
            ['number', 'number'],
        ];
    }
    public function getSeller()
    {
        return $this->hasOne(Seller::className(), ['id' => 'seller_id']);
        //'id'是表seller里面的,'seller_id'是本表里面的
    }
    public function attributeLabels() {
        parent::attributeLabels();
        return [
            'name'=>'名称',
            'cate'=>'种类',
            'number'=>'数量',
            'sell_time'=>'登记时间',
            
        ];
    }
}

和:

<?php
namespace app\models;
use yii\db\ActiveRecord;

class Seller extends ActiveRecord
{
    public static function getDb()
    {
        return \Yii::$app->db2;
    }
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            [['name', 'gender','student_number','mobile','if_alipay','if_present','if_big','sell_time'], 'required'],
            ['name', 'string','length'=>[1,5]],
            ['student_number', 'number','min'=>0,'max'=>9999999999],
            ['mobile', 'number','min'=>0,'max'=>99999999999],
        ];
    }
    
    public function attributeLabels() {
        parent::attributeLabels();
        return 
        ['name'=>'姓名',
        'gender'=>'性别',
        'qq'=>'qq(选填)',
        'wechat'=>"微信(选填)",
            'student_number'=>'学生号',
            'major'=>'专业(选填)',
            'grade'=>'年级(选填)',
            'mobile'=>'手机号码',
            'if_big'=>'是否有大件商品',
            'if_present'=>'6.3号当天是否能亲自到场摆摊',
            'if_agent'=>'是否同意将书籍放入书籍专区,由工作人员售出',
            'if_together'=>'是否同意与他人合摊',
            'if_alipay'=>'是否同意用支付宝付款',
            'if_donate'=>'是否同意将未售出物品捐赠',
            'sell_time'=>'摆摊时间',
        ];
    }
    public function getGoods()
    {
        //建立一对多关系
        return $this->hasMany(Goods::className(), ['seller_id' => 'id']);
    }
    
}

官方文档我在看,这部分在开发中。求大牛解,我们比比速度。


这里有个Yii1的教程,你先参考一下:
http://www.yiichina.com/tutorial/9
视图:
感谢分享代码,在你的代码的基础上,我可以实现新增的时候一次插入多条数据。在网上找了js代码实现了点击‘新增一行’和‘删除’一行的功能。但是在更新数据的时候遇到了麻烦,如何在更新的时候,对新增加的行数据进行保存,而对删除了的行数据进行删除呢?
不知道你有没有已经解决了我遇到的问题?
但是rule验证是个问题,比如动态新增的文本框的值,如果为空值时,在多模型下validateMultiple()会返回全部错误,不知道题主怎么解的,目前研究出来的也只是通过开启表单ajax验证来解决这个rule的问题。
参考:
https://github.com/yiisoft/yii2/issues/9811
https://github.com/yiisoft/yii2/issues/1399
不错,学习了
field($v, “[{$index}]name”)

field($v, “{$index}name”),请问这两种写法谁是正确的?新手表示看不懂,这里的{}、[]应该怎么理解?
用来标识下表的,用field($v, ‘[‘.$index.’]name’)才可以。

赞(0) 打赏
未经允许不得转载:菜鸟之家 » 多个模型同时提交,如何收集表单数据?[2.0]

评论 抢沙发

登录

找回密码

注册