【问题标题】:Post inside controller not loading into model in Yii2在 Yii2 中发布内部控制器未加载到模型中
【发布时间】:2020-04-08 20:14:06
【问题描述】:

当我想从表单中获取变量时,post 操作不会加载。

这是我的看法:

<?php
        $form = ActiveForm::begin();
        ?>
            <div class="form-group">
                <input type="text" name="username" placeholder="FullName">

                <?= Html::a(Yii::t('app', 'Start'), ['start', 'link' => $model->link], ['type' => 'button','class' => 'btn btn-primary btn-round']) ?>
            </div>

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

这是我的控制器:

if ($model->load(Yii::$app->request->post())){
    exit(var_dump('everything is ok'));
}else {
    exit(var_dump('nothing is right'));

}

结果是'什么都不对'。

【问题讨论】:

  • 我认为这是因为您没有提交表单而是调用了普通链接。看看 Html::submitButton
  • 我试过了,但我仍然得到同样的错误

标签: yii yii2 yii2-advanced-app yii-extensions yii-form


【解决方案1】:

终于找到解决办法了

<?php
$form = ActiveForm::begin(
    [
        'action' => 'start',
    ]
);
?>
<div class="form-group">
    <input type="text" name="username" placeholder="FullName">
    <?= Html::a('submit', Url::to(['start', 'link' => $model->link]), ['data-method' => 'POST']) ?>
</div>

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

谢谢大家

【讨论】:

  • 我在表单中将['start', 'link' =&gt; $model-&gt;link] 更改为Url::to(['start', 'link' =&gt; $model-&gt;link],代码正常工作。
  • 在anchore标签的情况下两者相同
  • 所以[' data-method '=&gt;' POST '] 选项可能解决了问题
  • 好的,但是您的问题和答案不匹配。请更正问题
【解决方案2】:

除了使用锚链接而不是提交按钮之外,您没有使用模型来创建活动输入,因此字段名称没有模型名称或 Yii 接受的标准数组格式,您应该将空字符串传递给 load 方法作为第二个参数,即formName,如下所示

$model->load(Yii::$app->request->post(),'');

所以你的完整表格应该看起来像

<?php
    $form = ActiveForm::begin(
        [
            'action' => 'start',
        ]
    );
?>
<div class="form-group">
    <input type="text" name="username" placeholder="FullName">
    <?php echo Html::submitButton(Yii::t('app', 'Start'), ['class' => 'btn btn-primary btn-round']) ?>
</div>

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

编辑

您的控制器代码应如下所示,请注意首先检查它需要在那里,以便代码在您仅提交而不是页面加载时运行

if (Yii::$app->request->isPost) { //this should be here before the rest of the code

    if ($model->load(Yii::$app->request->post(), '')) {
        exit(var_dump('everything is ok'));
    } else {
        exit(var_dump('nothing is right'));
    }

}

【讨论】:

  • 这个解决方案对我不起作用,帖子仍然没有加载,var_dump 消息是“没有什么是正确的”
  • @adnenmanssouri 你有没有检查过 $model-&gt;errors 在 else 部分的内容?
  • 为您的控制器操作添加完整代码@adnenmanssouri 并查看编辑部分并相应地更新您的代码
【解决方案3】:

这是因为load() 方法在模型名称属性中查找发布数据,而您自己编写输入,而不是使用 Yii 方法处理表单。

所以你的帖子Yii::$app-&gt;request-&gt;post()返回:

array(
 'username' => 'value of username',
)

而你的$model-&gt;load 正在寻找

 array(
     'modelName' => array(
         'username' => 'value of username',
       )
  )

要使您的帖子数据看起来也像这样,您可以以正确的方式进行操作,即删除您的输入并在表单中使用此方法:

<?= $form->field($model, 'username')->textInput(['maxlength' => true]) ?>

或者错误的方式,修改你的输入和内部用户名使用:

<input type="text" name="modelName[username]" placeholder="FullName">

当然,我放用户名的地方你必须放你的真实型号。

【讨论】:

  • 在这种情况下,我没有使用模型,但我只想读取从视图发送的变量
  • 那么不要使用model-&gt;load()。使用$params = Yii::$app-&gt;request-&gt;post(),在$params 中你将拥有$params['username']。或者你可以用 if(Yii::$app->request->post('username')){...}` 替换 if($model-&gt;load(...
  • @adnenmanssouri 将您的 Html::a 更改为 Html::submitButton。
  • @adnenmanssouri 而不是加载等.. 做if(Yii::$app-&gt;request-&gt;isPost){ var_dump("Hei"); die() }
  • @adnenmanssouri 那么你就遇到了问题,在 chrome 中使用 F12 检查 html 并检查表单操作中的 url。
猜你喜欢
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多