Yii2表单中如何将多文本框值求和赋值至合计字段
嘿,作为Yii新手碰到这种计算字段不生效的问题挺常见的,我来帮你分析下可能的原因和解决办法~
先搞清楚核心问题:你之前的赋值时机不对
你直接在new AsdaPa0025()之后就赋值,这时候表单提交的数据还没加载到模型里呢!propia、usofructo这些字段都是默认值(大概率是null),加起来自然是空,而且就算赋值了,后续也没关联到表单提交的真实数据。
解决方案分这几步来:
1. 先确保字段能被批量赋值(关键前提)
Yii的模型有安全字段机制,得保证propia、usofructo、arrendada、cuerdas这几个字段在创建场景下是允许被赋值的。打开你的AsdaPa0025模型,检查rules()方法:
public function rules() { return [ // 其他字段规则... [['propia', 'usofructo', 'arrendada', 'cuerdas'], 'number'], // 确保是数值类型 [['propia', 'usofructo', 'arrendada'], 'safe', 'on' => ['create']], // 标记为创建场景的安全字段 ]; }
如果这些字段不在safe列表里,表单提交的值根本不会被赋值到模型属性上,计算自然无效。
2. 调整控制器里的赋值时机
正确的顺序应该是先加载表单数据,再计算赋值,最后验证保存,修改你的actionCreate:
public function actionCreate() { $model = new AsdaPa0025(); $modelosfacilidades = [new FacilidadesAReali... // 你的其他变量 if ($this->request->isPost) { // 先把表单提交的数据加载到模型里 if ($model->load($this->request->post())) { // 现在再计算求和,加?:0是防止字段为null时加法出错 $model->cuerdas = ($model->propia ?: 0) + ($model->usofructo ?: 0) + ($model->arrendada ?: 0); // 验证并保存 if ($model->save()) { return $this->redirect(['view', 'id' => $model->id]); } } } return $this->render('create', [ 'model' => $model, 'modelosfacilidades' => $modelosfacilidades, ]); }
3. 更优雅的方式:把计算逻辑放到模型里(推荐)
为了符合MVC设计,这种字段计算逻辑应该封装在模型中,不管是创建还是更新都能自动生效。在AsdaPa0025模型里重写beforeSave()方法:
public function beforeSave($insert) { if (parent::beforeSave($insert)) { // 自动计算cuerdas的值 $this->cuerdas = ($this->propia ?: 0) + ($this->usofructo ?: 0) + ($this->arrendada ?: 0); return true; } return false; }
这样控制器里就不用写计算代码了,只要正常加载数据、保存模型就行,逻辑更清晰。
4. 调试小技巧
如果还是没生效,可以在赋值前打印字段值,确认是否获取到了表单数据:
var_dump($model->propia, $model->usofructo, $model->arrendada); die;
如果打印结果是null,那就是安全字段的问题,回到第一步检查rules()。
内容的提问来源于stack exchange,提问作者KevG
相关产品推荐
相关产品推荐

