为父子关系模型使用 Yii2.0 复选框列表
Utilising Yii2.0 checkboxlist for Parent-child relation models
我有一个问题模型和答案模型,其中问题到答案是一对多关系。 Yii2中如何实现checkboxlist以如下形式显示:
Form:
Question 1 description
[checkbox] Answer 1 description
[checkbox] Answer 2 description
Question 2 Description
[checkbox] Answer 3 description
[checkbox] Answer 4 description
Question 3 Description
[checkbox] Answer 5 description
[checkbox] Answer 6 description
[Save button]
当我点击保存时,例如。选中答案 1 和答案 3,post 应 return 字符串中的“1,3”。我如何使用复选框列表来做到这一点?我尝试使用我的代码,但现在它仅在选中时捕获 Answer 5 和 Answer 6 的值。如果选中答案 1 到答案 4,则不会捕获它们。应该是我的循环有问题。
希望有人能帮助我..
非常感谢
更新:我重组了我的代码,但它仍然只从属于最后一个问题的答案中捕获值:
<?php
$form = ActiveForm::begin([
'id' => 'form',
'type' => ActiveForm::TYPE_HORIZONTAL,
]);
?>
<?php
$qnamodel = $questionmodel->joinWith('answermodel')->all();
$selected_array = array_map('intval', explode(',', $selected_list));
foreach($qnamodel as $num=>$per_qn)
{
echo '<div class="form-group"><div class="col-sm-9">'.$per_qn->QN_DESC.'</div></div>';
foreach($per_qn->answermodel as $per_ans)
{
$arr_list[$per_qn->QA_TABLE_ID][$per_ans->QA_ANS_TABLE_ID] = $per_ans->ANS_DESC;
}
$recordmodel->ANS_TABLE_ID = $selected_array;
echo $form->field($recordmodel, 'ANS_TABLE_ID', ['template' => "{label}\n{input}\n{hint}"])->checkboxList($arr_list[$per_qn->QA_TABLE_ID], $selected_array, ['separator' => '<p>'])->label(false);
echo '<p><br />';
}
?>
<?= Html::submitButton('save', ['class' => 'btn btn-primary']) ?>
<?phpgmst
ActiveForm::end();
?>
In Question Model
public function getAnswermodels()
{
return $this->hasMany(Answermodel::className(), ['QN_TABLE_ID' => 'QA_TABLE_ID']);
}
In Answer Model
public function getQNTABLE()
{
return $this->hasOne(Questionmodel::className(), ['QA_TABLE_ID' => 'QN_TABLE_ID']);
}
如果我理解你正确地看待逻辑,你应该能够做这样的事情。我输入了通用字段名称和 table 名称以使代码更易于阅读。我还删除了一些其他代码,以便更容易看到发生了什么。这应该会替换您为视图发布的全部代码;
foreach ($model->questions as $question) {
echo '<p>' . $question->description . '</p>';
if ($question->answers) {
echo $form->field($question, 'answers[' . $question->id . '][]')->checkboxList(yii\helpers\ArrayHelper::map($question->answers, 'id', 'description'), ['separator' => '<p>']);
}
}
第一部分遍历模型的所有可能问题。如果该问题有答案,则会显示这些答案的复选框列表。 arrayHelper 是一种从模型数组中获取值数组的简单方法;给定一个模型数组,您可以使用它来获取一个由 id 索引的数组,并带有描述中的标签。
需要注意的是checkboxlist会以数组的形式提交数据,所以属性名需要是数组。因此,复选框列表的属性需要采用 'answers[' 形式。 $question->id 。 '][]'。提交表单后,您将获得一个名为 answer 的属性,其中包含问题 ID 的索引以及为该问题选择的答案的子数组。这样你就会知道答案是针对什么问题选择的。希望对您有所帮助!
我有一个问题模型和答案模型,其中问题到答案是一对多关系。 Yii2中如何实现checkboxlist以如下形式显示:
Form:
Question 1 description
[checkbox] Answer 1 description
[checkbox] Answer 2 description
Question 2 Description
[checkbox] Answer 3 description
[checkbox] Answer 4 description
Question 3 Description
[checkbox] Answer 5 description
[checkbox] Answer 6 description
[Save button]
当我点击保存时,例如。选中答案 1 和答案 3,post 应 return 字符串中的“1,3”。我如何使用复选框列表来做到这一点?我尝试使用我的代码,但现在它仅在选中时捕获 Answer 5 和 Answer 6 的值。如果选中答案 1 到答案 4,则不会捕获它们。应该是我的循环有问题。
希望有人能帮助我.. 非常感谢
更新:我重组了我的代码,但它仍然只从属于最后一个问题的答案中捕获值:
<?php
$form = ActiveForm::begin([
'id' => 'form',
'type' => ActiveForm::TYPE_HORIZONTAL,
]);
?>
<?php
$qnamodel = $questionmodel->joinWith('answermodel')->all();
$selected_array = array_map('intval', explode(',', $selected_list));
foreach($qnamodel as $num=>$per_qn)
{
echo '<div class="form-group"><div class="col-sm-9">'.$per_qn->QN_DESC.'</div></div>';
foreach($per_qn->answermodel as $per_ans)
{
$arr_list[$per_qn->QA_TABLE_ID][$per_ans->QA_ANS_TABLE_ID] = $per_ans->ANS_DESC;
}
$recordmodel->ANS_TABLE_ID = $selected_array;
echo $form->field($recordmodel, 'ANS_TABLE_ID', ['template' => "{label}\n{input}\n{hint}"])->checkboxList($arr_list[$per_qn->QA_TABLE_ID], $selected_array, ['separator' => '<p>'])->label(false);
echo '<p><br />';
}
?>
<?= Html::submitButton('save', ['class' => 'btn btn-primary']) ?>
<?phpgmst
ActiveForm::end();
?>
In Question Model
public function getAnswermodels()
{
return $this->hasMany(Answermodel::className(), ['QN_TABLE_ID' => 'QA_TABLE_ID']);
}
In Answer Model
public function getQNTABLE()
{
return $this->hasOne(Questionmodel::className(), ['QA_TABLE_ID' => 'QN_TABLE_ID']);
}
如果我理解你正确地看待逻辑,你应该能够做这样的事情。我输入了通用字段名称和 table 名称以使代码更易于阅读。我还删除了一些其他代码,以便更容易看到发生了什么。这应该会替换您为视图发布的全部代码;
foreach ($model->questions as $question) {
echo '<p>' . $question->description . '</p>';
if ($question->answers) {
echo $form->field($question, 'answers[' . $question->id . '][]')->checkboxList(yii\helpers\ArrayHelper::map($question->answers, 'id', 'description'), ['separator' => '<p>']);
}
}
第一部分遍历模型的所有可能问题。如果该问题有答案,则会显示这些答案的复选框列表。 arrayHelper 是一种从模型数组中获取值数组的简单方法;给定一个模型数组,您可以使用它来获取一个由 id 索引的数组,并带有描述中的标签。
需要注意的是checkboxlist会以数组的形式提交数据,所以属性名需要是数组。因此,复选框列表的属性需要采用 'answers[' 形式。 $question->id 。 '][]'。提交表单后,您将获得一个名为 answer 的属性,其中包含问题 ID 的索引以及为该问题选择的答案的子数组。这样你就会知道答案是针对什么问题选择的。希望对您有所帮助!