Yii2 renderPartial 客户端验证不起作用

问题描述 投票:0回答:4

renderPartial 客户端验证不起作用。我想用ajax渲染部分表单。前任。: _form.php

$form = ActiveForm::begin([
    'options' => [
        'enableAjaxValidation' => true,
    ]
]); 
$form->field($model, 'category_id')->dropDownList($category, [
'onchange'=>'
    $.get( "'.Url::toRoute('/controller/params').'", { id: $(this).val() } )
           .done(function( data ) {
                     $( "#offers-param-content" ).html( data );
           }
     );'
]);

控制器.php

public function actionParams($id)
{
    $model = new Param();
    $params = EavAttribute::find()->where(['category_id'=>$id])->all();
    $this->renderPartial('_params', ['model' => $model, 'params' => $params];
}

_params.php

foreach($params as $item){
    echo Html::activeTextInput('text', $model, $item->name);
}
yii2 yii2-advanced-app yii2-validation
4个回答
4
投票

如果要启用客户端验证,请将此属性设置为 true。

$form = ActiveForm::begin([
    'options' => [
        'enableAjaxValidation' => true,
    'enableClientValidation'=>true

    ]
]); 

并使用 renderAjax() 函数代替 renderPartial() ,它将使用注册到视图的 JS/CSS 脚本和文件注入渲染结果


0
投票

在您的

Controller.php
中,您需要将
layout
设置为
false
die
执行

public function actionParams($id)
{
    $this->layout = false;
    $model = new Param();
    $params = EavAttribute::find()->where(['category_id'=>$id])->all();
    $this->renderPartial('_params', ['model' => $model, 'params' => $params];
    die;
}

0
投票

您没有将任何验证错误从控制器返回到您的视图。 存档该用途

yii\widgets\ActiveForm::validate($yourModel);

如果您不使用 activeform,您可以通过

返回错误
$model->getErrors();//will return errors from $model->validate()

从你的摘录中尝试这个

public function actionParams($id) {
        $model = new Param();
        if ($model->load(Yii::$app->request->post())) {
            if (Yii::$app->request->isAjax) {
                Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                return ActiveForm::validate($model); /* Validation error messages are returned by this static function */
            }
            $params = EavAttribute::find()->where(['category_id' => $id])->all();
            $this->renderPartial('_params', ['model' => $model, 'params' => $params]);
        }
    }

0
投票

问题在于该部分没有渲染所需的资产脚本和实际的表单注册。创建下面的类,它有两种方法,第一个简单地渲染表单注册,如其他答案所规定的那样,第二个渲染包含实际库的 Yii js 文件,我发现两个是 yii.validation.jsyii.activeForm .js 并且该方法注册并检索其正确位置,例如 assets/ea6a7d55/yii.activeForm.js.

请注意,您只需要加载一次 JS 文件,并在调用 renderClientValidation 方法之前加载它们。

class PartialClientValidation {
    
    /**
     * Renders the JavaScript validation code for Yii active form.
     * @param \yii\web\View $view
     * @param \yii\widgets\ActiveForm $form
     */
    public static function renderClientValidation($view, $form) {
        echo "<script>\n";
        $form->registerClientScript(); 
        foreach ($view->js as $codeblocks) {
            foreach ($codeblocks as $codeLine) {
                echo $codeLine."\n";
            }
        }
        echo "</script>\n";
    }
    
    /**
     * renders required Yii script files in their proper contexts.
     * @param \yii\web\View $view
     * @return array
     */
    public static function renderRequiredScriptFiles($view) {
        $scriptFiles = [];
        $formAsset = \yii\widgets\ActiveFormAsset::register($view);
        foreach ($formAsset->js as $f) { $scriptFiles[] = $formAsset->baseUrl.'/'.$f; }
        $validationAsset = \yii\validators\ValidationAsset::register($view);
        foreach ($validationAsset->js as $f) { $scriptFiles[] = $validationAsset->baseUrl.'/'.$f; }
        foreach ($scriptFiles as $scriptFile) {
            echo "<script src=\"$scriptFile\"></script>\n";
        }
        return $scriptFiles;
    }
    
 }

要使用上述类,只需调用部分视图文件中的一个或两个函数即可,例如

PartialClientValidation::renderRequiredScriptFiles($this);
PartialClientValidation::renderClientValidation($this, $form);

其中$this指的是视图,$form是通过调用

获取的

$form = ActiveForm::begin()

© www.soinside.com 2019 - 2024. All rights reserved.