小部件中的验证表单

Validation Form in wiget

我希望在我的网络应用程序的每个页面上都有一个可用的表单。所以我创建了一个带有表单的小部件。

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 显示验证错误或成功消息?在我的模型中,我几乎没有自定义验证规则。

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

动作 actionNewUrl() 必须呈现视图 addNewURLForm 以便 Pjax 可以用从动作接收到的新 html 替换旧形式。

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