yii2将值从视图传递给控制器

时间:2017-05-11 01:05:01

标签: php jquery yii2

我有这种问题。我有一个输入文本,其中包含无线电模板。

问题是,当我检查它并将其存储到数据库字段时,我想获得该无线电的值。

我的想法是从模型创建一个变量,但是当我保存它时,我无法将无线电值传递给该变量。

请帮帮我,我被困住了。

这是视图的图像:

Generated view

控制器操作:

public function actionCreate()
    {
        $model = new QbQuestion();

        if ($model->load(Yii::$app->request->post())) {
            $answer = $model->answer;
            $model->$answer;
            $model->save();
            return $this->redirect(Url::to(['qb-question/index']));
        } else {
            return $this->renderAjax('create', [
                'model' => $model,
            ]);
        }
    }

查看:

<div class="qb-question-form">

    <?php $form = ActiveForm::begin([
    'layout' => 'horizontal',
    'fieldConfig' => [
        'horizontalCssClasses' => [
            'label' => 'col-sm-4',
            'offset' => 'col-sm-offset-4',
            'wrapper' => 'col-sm-8',
            'button' => 'col-sm-8',
            'error' => '',
            'hint' => '',
        ],
    ],
]); ?>

    <?php echo $form->errorSummary($model); ?>

    <?= $form->field($model, 'q_cat')->dropDownList(
            ArrayHelper::map(QbCategory::find()->all(), 'id', 'category'),
            [
            'prompt' => 'Select Category'
    ]) ?>

    <?= $form->field($model, 'q_date')->dropDownList(
            ArrayHelper::map(QbDate::find()->asArray()->all(), 'id',
                function($model, $defaultValue) {
                return $model['month'].' '.$model['year'];
            }),
            [
            'prompt' => 'Select Date'
    ]) ?>

    <?php echo $form->field($model, 'question')->textarea(['rows' => 5]) ?>

    <?= $form->field($model, 'q_c1', [
        'inputTemplate' => '<div class="input-group"><span class="input-group-addon">'.
            Html::radio('answer').'</span>{input}</div>',
    ]); ?>

    <?= $form->field($model, 'q_c2', [
        'inputTemplate' => '<div class="input-group"><span class="input-group-addon">'.
            Html::radio('answer').'</span>{input}</div>',
    ]); ?>

    <?= $form->field($model, 'q_c3', [
        'inputTemplate' => '<div class="input-group"><span class="input-group-addon">'.
            Html::radio('answer').'</span>{input}</div>',
    ]); ?>

    <?= $form->field($model, 'q_c4', [
        'inputTemplate' => '<div class="input-group"><span class="input-group-addon">'.
            Html::radio('answer').'</span>{input}</div>',
    ]); ?>

        <?php echo Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>


    <?php ActiveForm::end(); ?>

</div>

提前感谢。

2 个答案:

答案 0 :(得分:1)

您已拍摄的无线电字段将始终返回1,因此您无法识别所选答案。您可以按照以下方式正常执行html:

更改表单文件:

  $.ajax
    ({
    url: '/api/TaskApi/',
    type: 'POST',
    data: Json.stringyfy(model),
    dataType: "json",
    success: function(data) {
        alert('Task Added');
        // location.reload(); // this is not a good practice
    },
    error: function() { alert('Task not Added'); }
});

此处,<?= $form->field($model, 'q_c1', [ 'inputTemplate' => '<div class="input-group"><span class="input-group-addon">'. '<input type="radio" name="QbQuestion[answer]" value="q_c1">'.'</span>{input}</div>', ]); ?> <?= $form->field($model, 'q_c2', [ 'inputTemplate' => '<div class="input-group"><span class="input-group-addon">'. '<input type="radio" name="QbQuestion[answer]" value="q_c2">'.'</span>{input}</div>', ]); ?> <?= $form->field($model, 'q_c3', [ 'inputTemplate' => '<div class="input-group"><span class="input-group-addon">'. '<input type="radio" name="QbQuestion[answer]" value="q_c3">'.'</span>{input}</div>', ]); ?> <?= $form->field($model, 'q_c4', [ 'inputTemplate' => '<div class="input-group"><span class="input-group-addon">'. '<input type="radio" name="QbQuestion[answer]" value="q_c4">'.'</span>{input}</div>', ]); ?> 会返回您选择的答案。

控制器更改:

QbQuestion['answer']

答案 1 :(得分:0)

您的属性未保存的原因是您没有将字段绑定到模型,因此表单中提交的字段名称不正确。

在我看来,你需要的是radioListHtml::radio()方法只添加一个单选按钮,不依赖于任何模型。要使用radioList,您需要执行以下操作;

首先,在视图文件中创建一系列可能的答案;

$answers = array('q_c1' => $model->q_c1, 'q_c2' => $model=>q_c2, 'q_c3' => $model=>q_c3, 'q_c4' => $model=>q_c4);

现在,因为它是一个收音机列表,它只会提交一个单选按钮的数据。它不允许选择多个单选按钮。由于存储数据的方式,在模型填充和验证时,您需要一个临时模型属性来存储此值。像这样在你的模型中创建它;

public $answerToQuestion;

允许大量分配;

public function rules() {
    return [
        [['answerToQuestion'], 'safe]
    ];
}

现在您可以像这样创建表单字段;

echo $ form-&gt; field($ model,'answerToQuestion') - &gt; radioList($ answers);

Yii现在应该生成具有正确名称的单选按钮列表,以将它们绑定到您的模型中并允许它们被大量分配。

表单提交的属性将采用表单形式(假设您的模型名为Question;

Question[answerToQuestion] => 'q_c2'

它将通过验证。现在由模型逻辑决定将所选答案解码到数据库的相关字段中。