我正在集成易2-形巫师作为表格输入,但无法将数据提交给我的控制器操作并使用Model::loadMultiple。
我必须将我的模型声明为数组,然后我需要在传递到视图之前初始化它,在buttflattery/yii2-formwizard前端,我必须将我的模型指定为数组,但是我不能动态地从控制器中检索数据。
我需要从前端动态创建实例,并将它们保存在后端。我只能保存我从我的controller.if中初始化的实例--我不能只初始化第一个实例saved.and --也可以在初始化多个实例时使用for循环,并一次为所有实例进行前端复制--这也是我不需要的。
//controller
public function actionCreatemulti()
{
$this->layout='layout2';
$education = [new Edusubject()];
//## initialize array for 2 element (if I not initialize only one object pass or saved)
for ($i=0; $i < 2 ; $i++) {
$education[]= new Edusubject();
}
//## Model::loadMultiple --> works only if $education is declared as array
if (Model::loadMultiple($education, Yii::$app->request->post()) && Model::validateMultiple($education)) {
foreach ($education as $edu) {
$edu->save(false);
}
return $this->render('dummy');
}
return $this->render('createmulti', [
'education' => $education,
]);
} FormWizard代码在我的视图中
<?php
echo FormWizard::widget(
[
'formOptions' => [
'id' => 'my_form_tabular'
],
'steps' => [
[
//should be a single model or array of Activerecord model objects but for a single model only see wiki on github
'model' => $education, //## here I canot declared array again as I pass an array alredy from controller
//set step type to tabular
'type' => FormWizard::STEP_TYPE_TABULAR,在我看来,当我将模型声明为数组时,我可以获得维基中描述的动态表单,但由于无法实现所描述的yii2集表输入,所以无法保存该数组;另一方面,如果我将模型声明为数组并初始化它并发送到前端,则表单是不动态的。它以形式显示所有实例,因此我不需要按“添加”按钮,我不需要。
发布于 2019-08-29 20:05:26
我开发了这个小部件,但在建议您阅读有关表格输入的基本实现之前,尽管指南不是完全有用的,但仍有一些部分在TBD下,而且还没有添加到表中插入/创建表格数据的代码示例,但最好还是查看源方法,毕竟我们是工程师,我们应该能够理解任何函数的实现,无论是框架核心的一部分还是单独的文件。
解决问题
现在,关于这个问题,您没有理由使用在操作之上添加的for循环。
for ($i=0; $i < 2 ; $i++) {
$education[]= new Edusubject();
}您从指南这里中获取了这个部分,并复制粘贴了它,就像代码¯\_(ツ)_/中一样。
指南中的这一部分代码只是为了了解如何填充表格模型数组,然后在创建新记录时为加载和验证提供这些信息。
理解
我们需要通过以下方式加载和验证表格输入
这两种方法都以$models数组作为第一个参数,该参数应包含待加载/验证的模型实例。
对于loadMultiple($models, $attributes),请记住它将把$attributes数组中指定的所有属性加载到$models数组中指定的每个模型中,和所有这些模型都需要属于同一个类。$attributes数组可以是$_POST或$_GET或任何其他有效数组之一,有关详细信息,请参阅文档。
对于validateMultiple($models),它可以是不同的模型,也可以是相同的,它将对$models数组中的每个模型调用validate()。
实现
所以你需要把它改到下面
public function actionCreatemulti()
{
$this->layout='layout2';
$education = [new Edusubject()];
//cehck if post request
if(Yii::$app->request->isPost){
//get total models submitted
$count = count(Yii::$app->request->post('Edusubject',[]));
//start the loop from 1 rather than 0 and use the $count for limit
for ($i=1; $i < $count ; $i++) {
$education[]= new Edusubject();
}
if (
Model::loadMultiple($education, Yii::$app->request->post())
&& Model::validateMultiple($education)
) {
foreach ($education as $edu) {
$edu->save(false);
}
return $this->render('dummy');
}
}
return $this->render('createmulti', [
'education' => $education,
]);
}在您的视图中,model属性在FormWizard中将如下所示
'model' => $education,我只是在本地主机上测试了它,它正确地加载、验证和保存。
https://stackoverflow.com/questions/57713074
复制相似问题