我有2个模型A和B,其中A有很多B. 现在我想同时创建多个B(页面)。 这是我的代码。
B.php
...
public function rules()
{
return [
[['username', 'xx', 'yy'], 'required'],
[['xx', 'yy'], 'string'],
[['username'], 'string', 'max' => 255]
];
}
...
_form.php这个
<div class="b-form">
<?php $form = ActiveForm::begin(); ?>
<?php for ($i=0; $i < 3; $i++) {
?>
<h3>B #<?=$i+1?></h3>
<hr />
<?= $form->field($model, 'xx[]')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'yy[]')->textInput(['maxlength' => true]) ?>
<?php
}
?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
我想让这些6(3x2)文本输入单独响应,至少需要2对xx
和yy
才能通过验证。
现在我如何建立良好的规则来满足我的需求?
答案 0 :(得分:0)
官方文档中有专门的部分 - Collecting Tabular Input。
控制器示例:
<?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]);
}
}
使用过的方法:
还有更多信息,例如如何创建动态的新记录集,如果需要,可以使用它。
另外,请查看一些扩展程序,以简化多项输入的工作,例如unclead/yii2-multiple-input或wbraganca/yii2-dynamicform。
我想让那些6(3x2)文本输入单独响应并且在 至少需要2对xx和yy才能通过验证。
这听起来很奇怪,你永远不应该信任并且总是验证来自用户的所有数据。