我正在使用unclead/yii2-multi-input小部件。
我想使用数据库中的值生成不同数量的行。 我该怎么做?
我可以在视图中设计我的列,并在生成页面后手动编辑数据。但是错过了如何在视图中对行数及其值进行编程。
我的代码在视图中:
<?= $form->field($User, 'User')->widget(MultipleInput::className(), [
'min' => 0,
'max' => 4,
'columns' => [
[
'name' => 'name',
'title' => 'Name',
'type' => 'textInput',
'options' => [
'onchange' => $onchange,
],
],
[
'name' => 'birth',
'type' => kartikdateDatePicker::className(),
'title' => 'Birth',
'value' => function($data) {
return $data['day'];
},
'options' => [
'pluginOptions' => [
'format' => 'dd.mm.yyyy',
'todayHighlight' => true
]
]
],
]
])->label(false);
例如,如何制作具有不同值的 8 行,并且还能够编辑/删除/更新其中一些?
您需要查看文档,因为它说您需要在模型中分配一个单独的字段,该字段将以 JSON 的形式存储所有计划,然后在编辑/更新模型时将其提供回字段。
您尚未添加适当的模型来验证如何在上述给定情况下创建字段User
。 因此,我将尝试创建一个简单的示例,该示例将帮助您在方案中实现它。
例如。
您必须将用户与他喜欢的书籍一起存储在数据库中。
User
id, name, email
Books
id, name
- 在表中创建一个
User
名称为文本类型的schedule
字段/列,您可以编写迁移或手动添加。 将其作为
safe
添加到User
模型中的规则中。像下面一样
public function rules() { return [ ....//other rules [ [ 'schedule'] , 'safe' ] ]; }
将小组件添加到
ActiveForm
中新创建的列请参阅下面的代码
echo $form->field($model,'schedule')->widget(MultipleInput::class,[ 'max' => 4, 'columns' => [ [ 'name' => 'book_id', 'type' => 'dropDownList', 'title' => 'Book', 'items' => ArrayHelper::map( Books::find()->asArray()->all (),'id','name'), ], ] ]);
保存
User
模型时,将数组转换为 JSON 字符串。像下面一样
if( Yii::$app->request->isPost && $model->load(Yii::$app->request->post()) ){ $model->schedule = yiihelpersJson::encode($model->schedule); $model->save(); }
重写
User
模型的afterFind()
,以便在加载表单之前将 json 隐藏回数组。像下面一样
public function afterFind() { parent::afterFind(); $this->schedule = yiihelpersJson::decode($this->schedule); }
现在,当保存针对当前用户的schedule
字段时,将具有所选书籍行的JSON,例如,如果我保存了三本具有ids(1,2,3(的书,那么它将具有如下所示的json。
{
"0": {
"book_id": "1"
},
"2": {
"book_id": "2"
},
"3": {
"book_id": "3"
}
}
上述 JSON 将在afterFind()
中转换为数组,以便小部件在您编辑记录时加载保存的计划。
现在转到更新页面或编辑新保存的模型,您将看到自动加载的书籍。