Yii2:从列表视图获取数据以使用活动记录进行记录

Yii2: get data from list view to record with active record

我正在创建一份调查问卷,我正在尝试记录获得的答案,我在 listview 中显示从一个 table(问题)中获得的问题,我想记录他们在另一个 table(答案)中使用 active record。我试图在 itemView class 中添加活动表单,但每次我有超过 1 个问题时发送按钮都会重复显示,然后我尝试将它添加到 itemView 之外,如果提交按钮只出现一次但我无法获取 itemView 中列出的数据,因为我不知道如何发送活动表单的字段以从 itamView 获取数据,我试图通过 itemView 的呈现器发送它们,但它抛出 Undefined变量错误。

查看

<?php $form = ActiveForm::begin([
'enableClientValidation' => false,
'enableAjaxValidation' => true,]) ?>

<?= ListView::widget([
    'layout' => '<div class="pull-left">{items}</div>',
    'dataProvider' => $dataProvider,
    'itemView' => function ($model, $key, $index, $widget) {
        return $this->render('_answers',[
            'model' => $model, 
            'index' => $index
        ]);
    },
]); ?><div class="form-group">
<?php echo Html::submitButton('<span class="fa fa-plus"></span>'.' '.Yii::t('backend', 'Send') , ['class' => 'btn btn-primary']) ?>

查看_answers

<td width="5%" class="vcenter" rowspan="3">
    <span class="panel-title-address"><label class="control-label">Nr: <?php echo ($index+1); ?></label></span>
</td>
<td width="95%" class="vcenter">
        <div class="form-group field-qquestion-0-title required">
            <label class="control-label" for="qquestion-type_id"><?= Yii::t('backend', 'Question'.' : ')?></label>
        </div>  
        <div class="form-group field-qquestion-0-title required">
            <label class="control-label" for="qquestion-type_id"><?= $model->question ?></label>
        </div>
    <div class="col-md-4">
        <?php echo $form->field($answer, 'answer')->textInput(['maxlength' => true]) ?>
    </div>
</td>

我想得到的是每个问题的idanswer,以便能够将它们注册到答案table。

像这样更改您的答案输入,您将获得每个问题的答案输入:

<?php echo $form->field($answer, '['.$model->id.']answer')->textInput(['maxlength' => true]) ?>

当您提交表单时,该表单将连同所有回答问题一起提交。所以你可以像这样检查并保存 $_POST

if(isset($_POST['Answer']) and !empty($_POST['Answer'])){
    foreach($_POST['Answer'] as $question_id => $answer){
        //save your answer to your question
    }
}

你必须像这样改变你的ajaxvalidation foreach

您收到未定义变量错误,因为您没有将 $form 变量从主视图传递到 _answers.php。你可以这样传递:

<?php $form = ActiveForm::begin([
'enableClientValidation' => false,
'enableAjaxValidation' => true,]) ?>

<?= ListView::widget([
    'layout' => '<div class="pull-left">{items}</div>',
    'dataProvider' => $dataProvider,
    'itemView' => function ($model, $key, $index, $widget) use ($form) {
        return $this->render('_answers',[
            'form' => $form,
            'model' => $model, 
            'index' => $index,
        ]);
    },
]); ?><div class="form-group">
<?php echo Html::submitButton('<span class="fa fa-plus"></span>'.' '.Yii::t('backend', 'Send') , ['class' => 'btn btn-primary']) ?>

至于如何发送带有问题 ID 的多个答案,您可以使用 vvpanchev 的 答案中提到的方式或添加带有问题 ID 的隐藏字段。具有隐藏字段的 _answers.php 视图:

<td width="5%" class="vcenter" rowspan="3">
    <span class="panel-title-address"><label class="control-label">Nr: <?php echo ($index+1); ?></label></span>
</td>
<td width="95%" class="vcenter">
        <div class="form-group field-qquestion-0-title required">
            <label class="control-label" for="qquestion-type_id"><?= Yii::t('backend', 'Question'.' : ')?></label>
        </div>  
        <div class="form-group field-qquestion-0-title required">
            <label class="control-label" for="qquestion-type_id"><?= $model->question ?></label>
        </div>
    <div class="col-md-4">
        <?php
            //set the question's id to answer model if you haven't done that already
            $answer->question_id = $model->id;
            //output the hidden input with question id
            echo \yii\helpers\Html::activeHiddenInput($answer, "[$index]question_id"); 
        ?>
        <?php echo $form->field($answer, "[$index]answer")->textInput(['maxlength' => true]) ?>
    </div>
</td>

如果您使用隐藏字段方法,那么在您的控制器中,您可以使用 \yii\base\Model::loadMultiple() 方法将数据加载到答案模型中。您还可以使用 \yii\base\Model::validateMultiple() 进行验证。我假设答案模型 class 的名称是 Answer.

$count = count(\Yii::$app->request->post('Answer', []));
$answers = [];
for ($i = 0; $i < $count; $i++) {
    $answers[] = new Answer();
}
if (
    \yii\base\Model::loadMultiple($answers, \Yii::$app->request->post())
    && \yii\base\Model::validateMultiple($answers)
) {
    // ... save your answers and/or do other things needed
}