我使用JS动态地在页面上生成许多表单。
每个表单对应一个yii2模型(为每个属性设置了规则)。
我希望每个表单验证所有元素(名称,电子邮件文本输入)以使用ajax进行验证(因为它们通常会像我只有一个表单一样)。
我发现使用此处指出的方法: https://yii2-cookbook.readthedocs.io/forms-activeform-js/
`$('#contact-form').yiiActiveForm('validateAttribute', 'contactform-name');`
给出了JS错误:
yii.activeForm.js:276 Uncaught TypeError: Cannot read property 'attributes' of undefined
at jQuery.fn.init.find (yii.activeForm.js:276)
at jQuery.fn.init.validateAttribute (yii.activeForm.js:268)
at jQuery.fn.init.$.fn.yiiActiveForm (yii.activeForm.js:16)
at HTMLInputElement.<anonymous> (search-follow.js:130)
有没有办法将动态生成的表单绑定到yii2验证? (不仅仅是单个字段,而是整个表单,每个表单都有唯一的ID)。
关于Yii2 js表单验证的文档似乎并不那么令人遗憾
非常感谢
克
答案 0 :(得分:1)
简而言之,您可以使用以下步骤利用本机gii生成的活动形式来完成模态验证:
在位置创建文件: app / web / js / ajax-modal-popup.js
$(function(){
$(document).on('click', '.showModalButton', function(){
if ($('#modal').data('bs.modal').isShown) {
$('#modal').find('#modalContent')
.load($(this).attr('value'));
document.getElementById('modalHeader').innerHTML = '<h4>' + $(this).attr('title') + '</h4>';
} else {
$('#modal').modal('show')
.find('#modalContent')
.load($(this).attr('value'));
document.getElementById('modalHeader').innerHTML = '<h4>' + $(this).attr('title') + '</h4>';
}
});
});
在位置更新文件: app / asset / AppAsset.php
class AppAsset extends AssetBundle {
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [
];
public $js = [
'js/ajax-modal-popup.js', //<<<------- Register the script.
];
public $depends = [
'yii\web\YiiAsset',
];
}
将代码块添加到文件位置: app / views / index.php
<?php
Html::button('Close',
['value' => Url::to(['ticket/close', 'id'=>$model->ticket_id]),
'class' => 'showModalButton btn btn-success']
);
Modal::begin([
'header' => '<h2>Ticket Manager</h2>',
'id' => 'modal',
'size' => 'modal-md',
]);
echo "<div id='modalContent'></div>";
Modal::end();
?>
添加到控制器: app / controllers / ticketController.php
public function actionClose($id) {
$model = $this->findModel($id);
$model->scenario = 'close'; //Applied by Ticket model rules.
if ($model->load(Yii::$app->request->post()) && $model->save()) {
$model->record_void = 1;
$model->save();
return $this->redirect(['index']);
}elseif (Yii::$app->request->isAjax) {
return $this->renderAjax('close', [
'model' => $model
]);
} else {
return $this->render('close', [
'model' => $model
]);
}
}
您的表单文件位置: app / views / ticket / close.php
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model app\models\Ticket */
/* @var $form ActiveForm */
?>
<div class="ticket-_close">
<h3>Close Ticket</h3>
<?php
$form = ActiveForm::begin(['options' => [
'id' => 'takeModal',
'enableClientValidation' => true,
'enableAjaxValidation' => true,
]]);?>
<?= $form->field($model, 'ticket_id')->textInput(['readonly' => true, 'value' => $model->ticket_id]) ?>
<?= $form->field($model, 'problem') ?>
<?= $form->field($model, 'solution') ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div><!-- ticket-_close -->
有关其他详细信息,请参阅以下文章。
答案 1 :(得分:0)
我简要介绍了一些使用Yii 2进行ajax表单操作的代码片段。
<?php $form = \yii\widgets\ActiveForm::begin([
// pay attention this config.
'id' => 'account-form',
'enableClientValidation' => true,
'enableAjaxValidation' => true,
// validation URL via ajax
'validationUrl' => \yii\helpers\Url::to(['/account/do-ajax-request', 'userId'=>$model->id, 'op' => 'validate-form']),
]); ?>
<?= $form->field($model, 'email')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'password')->passwordInput(['maxlength' => true]) ?>
<?= $form->field($model, 'passwordConfirm')->passwordInput(['maxlength' => true]) ?>
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<div class="form-group">
<?= \yii\helpers\Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php \yii\widgets\ActiveForm::end(); ?>
<script type="text/javascript">
$(function () {
// URL to save form via ajax
var formSaveUrl='<?= \yii\helpers\Url::to(['/account/do-ajax-request', 'userId'=>$model->id, 'op' => 'save-form']) ?>';
// post form via ajax to save
$(document).on('beforeSubmit', '#account-form', function () {
$.post(formSaveUrl, $(this).serialize(), function (data) {
alert(data.message);
});
return false;
});
});
</script>
public function actionDoAjaxRequest($userId, $op)
{
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$model = $this->findModel($userId);
$model->load(Yii::$app->request->post());
// validate form
if ($op == 'validate-form') {
$data = \yii\widgets\ActiveForm::validate($model);
// save form
} else if ($op == 'save-form') {
if ($model->save()) {
$data['result'] = true;
$data['message'] = 'Success!';
} else {
$data['result'] = false;
$data['message'] = 'Failed!';
}
}
return $data;
}