概要
以下は、私がやりたいことです:
1. User answers the form, clicks submit
2. The data will be evaluated by the CodeIgniter `validate_new_account()`
a. If there are errors, prevent submission so that the dynamically added fields will not disappear
b. If successful / no error validation, proceed to the **else** part of `validate_new_account()` to `$this->view_preview_form( $this->get_post_data() );`
validate_new_account()
フォームがあり、コントローラーの関数に送信します。
function validate_new_account()
{
// validations here
if ( $this->form_validation->run() == FALSE ) {
// JSON-encoded validations
$errors = json_encode( $this->form_validation->error_array() );
echo $errors;
} else {
// next step
$this->view_preview_form( $this->get_post_data() );
}
}
jQuery Form Pluginを使用してコントローラーと対話します。
var options = {
url: "<?php echo site_url('new_account/validate_new_account'); ?>",
type: 'POST',
dataType: 'json',
success: function(data) {
if (data.length === 0) {
alert('Form successfully submitted!');
} else {
// echo validation errors from CodeIgniter
alert("Some fields weren't answered successfully. Please answer them.");
$.each(data, function(key, value){
var container = '<div class="error">'+value+'</div>';
$('.form-element input[name="'+key+'"]').after(container);
});
}
}
};
$('#main-submit').click(function(e) {
$('#main-form').valid();
$('#main-form').ajaxSubmit(options);
e.preventDefault();
});
問題
私のajax関数がなければ、上記のコードは完全に機能しますが、すべての検証を処理するためにajaxを必要とする要素を動的に追加しました。そうしないと、これらの要素がなくなります(悪いUX)。
したがって、ajax 関数を有効にして使用すると、CodeIgniter からの検証エラーが (ajax の成功部分を介して) 希望どおりに出力されますが、すべての検証が正しい場合、フォームは に移動しません$this->view_preview_form( $this->get_post_data() );
。
なぜこうなった?同様の問題を検索しましたが、残念ながら私のケースに似たものはありません。
e.preventDefault()
フォームが正常に送信された場合、パススルーを取得するにはどうすればよいですか?
感じる
この問題で私を助けてくれたすべての人に、コメントまたは回答をお願いします。このソリューション (CodeIgniter の検証 + jQuery の検証 + AJAX の送信 + シームレスなファイルのアップロード) を 2 か月間探していましたが、ようやく息ができるようになりました。皆様のご支援を決して忘れません。これが私にとってどれほど意味があるか、あなたには決してわからないでしょう。