多个模型同时提交,如何收集表单数据? [ 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']);
}
}
官方文档我在看,这部分在开发中。求大牛解,我们比比速度。
最佳答案
-
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); }
改
foreach ($goods as $index => $v) { echo $form->field($v, "[{$index}]name")->label($v->name); echo $form->field($v, "[{$index}]cate")->dropDownList(['书籍'=>'书籍','生活用品'=>'生活用品','电子产品'=>'电子产品','其他'=>'其他'])->label($v->name); echo $form->field($v, "[{$index}]number")->label($v->name); }
共 1 条回复wersion 觉得很赞
其他 7 个回答
-
但是rule验证是个问题,比如动态新增的文本框的值,如果为空值时,在多模型下validateMultiple()会返回全部错误,不知道题主怎么解的,目前研究出来的也只是通过开启表单ajax验证来解决这个rule的问题。
<form> <div class="model-item" data-id="0" data-model="User"> <input name="User[0][login]" data-attribute="login" /> <input name="User[0][name]" data-attribute="name" /> </div> <div class="model-item" data-id="1" data-model="User"> <input name="User[1][login]" data-attribute="login" /> <input name="User[1][name]" data-attribute="name" /> </div> </form>
[['name'], 'required', 'whenClient' => "function (value, attribute) { return $(attribute).closest('.model-item').find('[data-attribute=login]').val().length > 0; }"]
参考:
https://github.com/yiisoft/yii2/issues/9811
https://github.com/yiisoft/yii2/issues/1399 -
qwer5741342 回答于 2017-11-19 12:39 举报
不错,学习了
ArthurSS 广东珠海
注册时间:2015-03-14
最后登录:2017-05-17
在线时长:61小时10分
最后登录:2017-05-17
在线时长:61小时10分
- 粉丝13
- 金钱1432
- 威望50
- 积分2542