初心者にもわかるCodeIgniter 其の六【Ajax通信とユーザー登録】
この記事は最終更新日から1年以上が経過しています。
Ajax利用のための準備
説明よりも実践あるのみ。
コードを入れていきます。
assets/js/my_post.js を作成
※Jsの読み込みを忘れずに
jQuery(document).ready(function($) {
$(document).on('click','.send-post',function(){
var data_form = $(this).attr("data-form");
var form_target = $('#form-'+data_form);
var str = form_target.serializeArray();
step_2(form_target);
var data_post = $(this).attr("data-post");
if(data_post){
var post_to = data_post;
}else{
var post_to = data_form;
}
var go_url = '/post/'+post_to;
scrollMove($('.step_2'));
$('.vali-item').html('');
$.ajax({
type: 'post',
url: go_url,
dataType:'json',
timeout: 10000,
data: {
'str': str
},
success: function(data) {
if(data[0] =="OUT"){
step_1(form_target);
errorValidation(form_target,data[1]);
}else{
step_3(form_target);
scrollMove($('.step_3', form_target));
form_target.removeClass('confirm');
form_target.addClass('sended');
}
},
error: function(data) {
alert('送信失敗');
}
});
});
function errorValidation(form_target,errors){
form_target.find('.vali-main').removeClass('vali-error');
var vali2 = '';
j = 0;
$.each(errors, function(i, value) {
var vali = '<div class="return_vali vali_error"><i class="fa fa-exclamation-triangle"></i>'+value+'</div>';
vali2 += '<li>'+value+'</li>';
form_target.find('.vali-'+i).html(vali);
//先頭のエラーに移動
if( j == 0){
scrollMove(form_target.find('.vali-'+i));
}
j++;
});
form_target.find('.all_vali').html(vali2);
}
function scrollMove(tg){
var position = tg.offset().top - 150;
$("html, body").animate({scrollTop:position}, "fast");
}
function step_1(tg){
tg.find('.step_1').css('display','block');
tg.find('.step_2').css('display','none');
tg.find('.step_3').css('display','none');
}
function step_2(tg){
tg.find('.step_1').css('display','none');
tg.find('.step_2').css('display','block');
tg.find('.step_3').css('display','none');
}
function step_3(tg){
tg.find('.step_1').css('display','none');
tg.find('.step_2').css('display','none');
tg.find('.step_3').css('display','block');
}
});
assets/css/style.css を作成
※Cssの読み込みを忘れずに
@charset "utf-8";
header{padding: 60px 0 0;}
.fa{margin-right: 5px;}
.vali_error {
color: #ff0000;
margin-top: 5px;
}
.step_2, .step_3 {
display: none;
}
application/views/index.php にフォームを追加
<form class="form-horizontal" id="form-regist"> <fieldset> <legend>登録フォーム</legend> <div class="step_1"> <div class="form-group"> <label for="inputEmail" class="col-lg-2 control-label">Name</label> <div class="col-lg-10"> <input class="form-control" name="name" id="inputName" placeholder="Name" type="text"> <div class="vali-item vali-name"></div> </div> </div> <div class="form-group"> <label for="inputEmail" class="col-lg-2 control-label">Email</label> <div class="col-lg-10"> <input class="form-control" name="mail" id="inputEmail" placeholder="Email" type="text"> <div class="vali-item vali-mail"></div> </div> </div> <div class="form-group"> <label for="inputEmail" class="col-lg-2 control-label">Password</label> <div class="col-lg-10"> <input class="form-control" name="password" id="inputPassword" placeholder="Password" type="password"> <div class="vali-item vali-password"></div> </div> </div> <div class="form-group"> <div class="col-lg-10 col-lg-offset-2"> <button type="button" class="btn btn-primary send-post" data-form="regist">送信</button> </div> </div> </div> <div class="step_2"> <h3 class="text-center"><i class="fa fa-spinner fa-pulse"></i>データ送信中</h3> </div> <div class="step_3"> <h3 class="text-center">送信完了</h3> </div> </fieldset> </form>
これで送信側の処理は完了です。
どういう流れで送信されるのかは、見てもらえばなんとなくわかると思います。
PHP側の処理について
jsの記述を見てもらうと分かる通り、POSTデータはシリアライズ化しています。
これは、formで囲まれた内容を全て送信するものであり、とても便利です。
しかし、一塊になってこのままでは処理できないデータ型になるので、PHPの方でひと工夫が必要になります。
というわけで、POSTデータの処理をライブラリ化。
application/libraries/Lib.php に以下を追加
//バリデーション専用処理
public function postVali($post, $vali_type){
$this->ci->form_validation->reset_validation();
$_POST = $post;
if ($this->ci->form_validation->run($vali_type) == FALSE){
$error = $this->ci->form_validation->error_array();
$html =array("OUT",$error);
header('Content-type: application/json');
echo json_encode($html);
exit;
}
return NULL;
}
//Ajax用POSTデータの変換
public function makePost($json) {
$data = array();
foreach($json as $v1) {
if(strpos($v1["name"],'[]') !== false){
$key = str_replace('[]', '', $v1["name"]);
$data[$key][] = $v1['value'];
}else{
$key = $v1["name"];
$data[$key] = $v1['value'];
}
}
return $data;
}
//パスワードの暗号化
public function getPassword($pass){
$password = password_hash($pass, PASSWORD_BCRYPT, ['cost' => 12]);
return $password;
}
続いて、データ受信側での処理を一通り。
application/controllers/Post.php を編集
public function regist(){
if($this->input->post()){
$json = $this->input->post("str");
$post = $this->lib->makePost($json);
$this->lib->postVali($post, 'regist');
$temp_pass = $post['password'];
$post['password'] = password_hash($temp_pass, PASSWORD_BCRYPT, ['cost' => 12]);
$user_id = $this->All->Insert('user', $post);
$html =array('OK',NULL);
header('Content-type: application/json');
echo json_encode($html);
}
exit;
}
◆注目
バリデーションの処理を抜けたところにユーザーの登録処理が入っています。
$this->All->Insert('user', $post);
の部分ですね。
その直前にパスワードの暗号化処理を入れてあります。
こうしてみると、ものすごく単純化できているんじゃないかと思います。
あまり詳しい説明はしませんが、ライブラリとの連携、JSの記述を確認すれば、流れがわかるかと思います。
以上です。
以下の参考ページでユーザー登録ができるので、遊びまでに操作してみて下さい。
参考ページ:http://sample.xn--pbku02iq0izkz.net/
