wiget验证表格

时间:2018-11-12 00:19:25

标签: forms yii2 widget pjax

我想在我的Web应用程序的每个页面上都有一个可用的表单。所以我用表格创建了一个小部件。

class AddNewURL extends Widget{

    public $model;


    public function init()
    {
        parent::init();
        if ($this->model === null) {
            $this->model = new ProductUrlForm();
        }
    }

    public function run()
    {
        return $this->render('addNewURLForm', [
            'model' => $this->model,
        ]);
    }
}

和小部件视图

<div class="modal fade bs-example-modal-lg" id="newURL" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog modal-lg" role="document">

        <div class="modal-content">
            <?php Pjax::begin(); ?>
            <?php $form = ActiveForm::begin([
                'action' => Url::to(['site/new-url']),
                'options' => ['data' => ['pjax' => true]],
            ]) ?>
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
                </button>
                <h4 class="modal-title" id="myModalLabel">Add new URL</h4>
            </div>
            <div class="modal-body">
                <div class="row">
                    <div class="col-md-12">
                        <?= $form->field($model, 'url', ['errorOptions' => ['class' => 'help-block', 'encode' => false]])
                            ->textInput(['maxlength' => false])
                        ?>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button type="submit" class="btn btn-primary">Add</button>
            </div>

            <?php ActiveForm::end() ?>
            <?php Pjax::end(); ?>
        </div>

    </div>
</div>

这就是我在layouts / main.php中使用此小部件的方式

<?= \app\widgets\AddNewURL::widget() ?>

在我的 site / new-url 操作中

public function actionNewUrl()
    {
        $model = new ProductUrlForm();
        $model->status = STATUS_NEW;

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
           //return success message
        }

        return $this->render('index', [
            'model' => $model,
        ]);
    }

现在,当我提交表单数据时,该表单将被重置,仅此而已。如何使用pjax显示验证错误或成功消息?在我的模型中,我没有几个自定义验证规则。

也许有更好的解决方案在所有页面上使用一种表单?

1 个答案:

答案 0 :(得分:1)

动作actionNewUrl()必须呈现视图addNewURLForm,以便Pjax可以用从动作中接收的新html替换旧表单。

最好将小部件,控制器和表单模型放置在单独的模块中。