我在Yii 2中使用了动态表单小部件来实现嵌套的动态表单。我有一个表单,它允许用户选择ASC中心并每次添加学生数据。场景是用户从下拉列表中选择ASC中心。选择ASC中心后,一个名为StudentList的函数返回所选ASC中心的学生。现在这些学生正在正确填充。
我为Student输入字段分配了一个类,并使用jquery的每个函数用StudentList函数返回的数据填充所有students字段
但是在更新时,它会导致这样的问题:所有学生都显示为加载的字段。如图所示,这是更新页面,学生数据被加载,但当用户单击加载的学生数据的下拉列表时,所有学生都显示出来。
下面是函数StudentList,它返回特定ASC中心的学生列表。
public function actionStudentLists($id)
{
$countstudents = Student::find()->where(['ASCId' => $id])->count();//Counts number of students
$Students = Student::find()->where(['ASCId' => $id])->all(); // Execute students for ASCId
if ($countstudents > 0) {
echo "<option value>Select Students</option>";
foreach ($Students as $Student) {
ob_start();
echo "<option value='" . $Student->StudentId . "'>" . $Student->StudentName . "</option>";
}
} else {
echo "<option> - </option>";
}
}
下面是_form.php
<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\jui\DatePicker;
use wbraganca\dynamicform\DynamicFormWidget;
use app\models\Ascassignment;
use app\models\Asccenter;
use kartik\time\TimePicker;
use yii\helpers\ArrayHelper;
use app\models\Student;
?>
<script>
$(function () {
$(document).ready(function() {
$(window).keydown(function(event){
if(event.keyCode == 13) {
event.preventDefault();
return false;
}
});
});
$("#dynamic-form")[0].reset();
});
// When the user clicks on Add Student button
$(document).ready(function(){
$(".dynamicform_student").on("afterInsert", function(e, item) {
const $i = $(item).find('.i');
$.post("index.php?r=student/student-lists&id="+$("select#ascteacherreport-ascid").val(),function(data){
$i.html(data);
});
});
});
//When the user clicks on Add Time button
$(document).ready(function(){
$(".dynamicform_wrapper").on("afterInsert", function(e, item) {
const $i = $(item).find('.i');
$.post("index.php?r=student/student-lists&id="+$("select#ascteacherreport-ascid").val(),function(data){
$i.html(data);
});
// When the user clicks on Add Student button
$(".dynamicform_student").on("afterInsert", function(e, item) {
const $i = $(item).find('.i');
$.post("index.php?r=student/student-lists&id="+$("select#ascteacherreport-ascid").val(),function(data){
$i.html(data);
});
});
});
});
</script>
<div class="ascteacherreport-form">
<?php $form = ActiveForm::begin(['id' => 'dynamic-form', 'options' => ['class' => 'disable-submit-buttons'],
]);?>
<div class="panel panel-primary " >
<div class="panel panel-heading"><font size="3"><b>Teacher Report</b></font></div>
<div class="row">
<div class="col-sm-4">
<?= $form->field($model, 'ASCId')->dropDownList(ArrayHelper::map(Asccenter::find()->leftJoin('ascassignment','`ascassignment`.`ASCId`=`asccenter`.`ASCId`')->where(['ascassignment.UserId' => \Yii::$app->user->identity->getonlyid()])->all(),'ASCId','ASCName'), ['prompt' => 'Select ASC Center','class'=>'form-control ascid','onChange' => '
$.post("index.php?r=student/student-lists&id=' . '"+$(this).val(),function(data){
$(".i").each(function(k,v)
{
$(".i").html(data);
}
);
});
'
]) ?>
</div>
<div class="col-sm-4">
<?= $form->field($model, 'DateofReport')->widget(DatePicker::classname(), [
//'language' => 'ru',
'dateFormat' => 'yyyy-MM-dd',
'options' => ['class' => 'form-control picker','readOnly'=>'readOnly'], 'clientOptions'=>['changeMonth'=>true,
'changeYear'=>true,
'readOnly'=>true]
]) ?>
</div>
</div>
</div>
<div class="panel panel-primary">
<div class="panel-heading"><font size="3"><b>Time and Student Details</b></font></div>
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper',
'widgetBody' => '.container-items',
'widgetItem' => '.time-item',
'limit' =>10,
'min' => 1,
'insertButton' => '.add-time',
'deleteButton' => '.remove-time',
'model' => $modelsTime[0],
'formId' => 'dynamic-form',
'formFields' => [
'FromTime',
'ToTime'
],
]); ?>
<table class="table table-bordered">
<thead>
<tr bgcolor='#B8B8B8'>
<th style='border: 1px solid black;'></th>
<th class ="text-center" style='border: 1px solid black;'>Time</th>
<th class ="text-center" style='border: 1px solid black;'>Student Details</th>
<th class="text-center" style='border: 1px solid black;'>
<button type="button" class="add-time btn btn-success btn-xs"><span class="fa fa-plus"></span> Add Time</button>
</th>
</tr>
</thead>
<tbody class="container-items">
<?php foreach ($modelsTime as $indexTime => $modelTime): ?>
<tr class="time-item">
<td class="vcenter" style='border: 1px solid black;'>
<?php
// necessary for update action.
if (! $modelTime->isNewRecord) {
echo Html::activeHiddenInput($modelTime, "[{$indexTime}]ASCReportDetailsId");
}
?>
</td>
<td style='border: 1px solid black;width:15%'>
<?= $form->field($modelTime, "[{$indexTime}]FromTime")->label(true)->widget(TimePicker::classname(),[
'pluginOptions' => [
'readOnly' => true,
'minuteStep' => 1,
],
])?><br>
<?=
$form->field($modelTime, "[{$indexTime}]ToTime")->label(true)->widget(TimePicker::classname(),[
'pluginOptions' => [
'readOnly' => true,
'minuteStep' => 1,
],
])?>
</td>
<td style='border: 1px solid black;'>
<?= $this->render('_form-studentdata', [
'form' => $form,
'indexTime' => $indexTime,
'modelsStudentdata' => $modelsStudentdata[$indexTime],
]) ?>
</td>
<td class="text-center vcenter" style='border: 1px solid black;'>
<button type="button" class="remove-time btn btn-danger btn-xs"><span class="fa fa-minus"></span></button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php DynamicFormWidget::end(); ?>
</div>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
下面是嵌套的form_form-studentdata. php
<?php
use yii\helpers\Html;
use yii\helpers\ArrayHelper;
use yii\bootstrap\ActiveForm;
//use nex\datepicker\DatePicker;
use yii\web\UploadedFile;
use wbraganca\dynamicform\DynamicFormWidget;
use app\models\Student;
?>
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_student',
'widgetBody' => '.container-student',
'widgetItem' => '.student-item',
'limit' => 50,
'min' => 1,
'insertButton' => '.add-student',
'deleteButton' => '.remove-student',
'model' => $modelsStudentdata[0],
'formId' => 'dynamic-form',
'formFields' => [
'StudentId',
'Subject',
'Topic',
'Confidence',
],
]); ?>
<table class="table table-bordered">
<thead>
<tr bgcolor='#B8B8B8'>
<th style='border: 1px solid black;'></th>
<th class ="text-center" style='border: 1px solid black;'>Student</th>
<th class ="text-center" style='border: 1px solid black;'>Subject</th>
<th class ="text-center" style='border: 1px solid black;'>Topic</th>
<th class ="text-center" style='border: 1px solid black;'>Confidence</th>
<th class="text-center" style='border: 1px solid black;'>
<button type="button" class="add-student btn btn-success btn-xs"><span class="glyphicon glyphicon-plus"></span> Add Student</button>
</th>
</tr>
</thead>
<tbody class="container-student">
<?php foreach ($modelsStudentdata as $indexStudent => $modelStudentdata): ?>
<tr class="student-item">
<td class="vcenter" style='border: 1px solid black;'>
<?php
// necessary for update action.
if (! $modelStudentdata->isNewRecord) {
echo Html::activeHiddenInput($modelStudentdata, "[{$indexTime}][{$indexStudent}]ASCTeacherReportTimeDetailsId");
}
?>
</td>
<td style='border: 1px solid black; width:30%'>
<?= $form->field($modelStudentdata, "[{$indexTime}][{$indexStudent}]StudentId")->label(false)->dropDownList(ArrayHelper::map(Student::find()->all(),'StudentId','StudentName'), ['prompt' => 'Select Student','class'=>'form-control i']) ?>
</td>
<td style='border: 1px solid black; width:30%'>
<?= $form->field($modelStudentdata, "[{$indexTime}][{$indexStudent}]Subject")->label(false)->textInput(['maxlength' => true]) ?>
</td>
<td style='border: 1px solid black; width:30%'>
<?= $form->field($modelStudentdata, "[{$indexTime}][{$indexStudent}]Topic")->label(false)->textInput(['maxlength' => true]) ?>
</td>
<td style='border: 1px solid black; width:30%'>
<?= $form->field($modelStudentdata, "[{$indexTime}][{$indexStudent}]Confidence")->label(false)->textInput(['maxlength' => true]) ?>
</td>
<td class="text-center vcenter" style=" border: 1px solid black;width: 90px;">
<button type="button" class="remove-student btn btn-danger btn-xs"><span class="glyphicon glyphicon-minus"></span></button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php DynamicFormWidget::end(); ?>
当前图像:图像显示了更新表单,其中数据从数据库中加载,但当单击学生字段的下拉列表时,将显示所有学生。只有选定的ASC中心的学生应显示在加载的学生字段中。
Update Form
1条答案
按热度按时间svmlkihl1#
检查数据库表中的数据是否包含ASCId列中没有值的记录。如果满足条件'ASCId' =〉$id,则Student表中ASCId列为空或NULL值的记录仍将包含在结果中。
验证Yii 2应用程序中的Student模型是否将ASCId列定义为属性,并且它正确Map到数据库中的相应列。Yii 2可能无法将其识别为有效列,并且可能不会将其包含在生成的SQL查询中。
仔细检查数据库表和Yii 2模型中的列名称'ASCId'的拼写和大小写敏感性,以确保它们匹配。