CodeIgniterフレームワークでは、フィールドが必須であっても(form_phone_dataメソッドで)常に検証に必要なエラーが生成されます。 AJAXで読み込まれた「user_id」フィールドの値。Codeigniter required error
フォームの送信ボタンをクリックすると、「電話」フィールドが入力されていないことを示すメッセージが表示されます。検証パラメータから「必須」を削除すると、ページロードが無限に表示され(フォームを送信する)表示されます。
コード:
<?php
defined("BASEPATH") OR exit("Access denied.");
class Sup extends CI_Model {
function __construct()
{
parent::__construct();
if($this->app->user != FALSE){
echo $this->app->tpl('Ошибка доступа','access_denied');
exit;
}
}
function signup_form()
{
$phone_signup = $this->security->xss_clean($this->session->userdata("phone_signup"));
$this->app->header_file = 'signup';
if(!empty($phone_signup)){
$user = $this->app->get_user($phone_signup, 'phone');
if($user && $user['firstname'] == 'none'){
$this->form_user_data();
}else{
$this->session->set_userdata("phone_signup", NULL);
echo "sss";
exit;
}
}else{
$this->form_phone_data();
}
}
function form_phone_data()
{
$this->fv->set_error_delimiters('<div class="error">','</div>');
$this->fv->set_rules('phone','Номер телефона','trim|required|numeric|min_length[10]|max_length[10]|xss_clean|callback__scode');
$this->fv->set_rules('verify_code','Код подтверждения','trim|required|numeric|min_length[6]|max_length[6]|xss_clean');
$this->fv->set_rules('user_id','Системное поле','trim|required|numeric|xss_clean');
if($this->fv->run() == FALSE){
echo $this->app->tpl('Регистрация','signup/phone');
}else{
header("Location: ".URI."signup");
exit;
}
}
function send_phone_sms($phone)
{
$phone = $this->security->xss_clean($phone);
if(!preg_match("/^[0-9]{10,10}+$/", $phone)){
echo '<div class="error">Номер телефона должен быть в 10-значном формате, например 9098087766</div>';
}else{
$phone = "8".$phone;
$sql = $this->app->get_user($phone, 'phone');
if($sql){
if($sql['firstname'] == 'none'){
?>
<script>
$(".next").hide();
$("input[name=verify_code]").css("display","block");
$("input[name=user_id]").val(<?=$sql['id'];?>);
</script>
<?php
echo '<div class="inform">Код для подтверждения номера был отправлен Вам ранее. Пожалуйста, введите тот код, который мы Вам отправляли.</div><input type="submit" class="submit" value="Продолжить"/>';
}else{
echo '<div class="error">На данный номер телефона уже регистрировались ранее. Введите другой номер и нажмите <b>Далее</b></div>';
}
}else{
$phone_code = rand(100000,999999);
$data = array('firstname'=>'none','lastname'=>'none','last_online'=>SERVER_TIME,'signup_date'=>SERVER_TIME,'photo_cover'=>'none','password'=>'none','phone'=>$phone,'verify_code'=>$phone_code);
$this->db->insert('users', $data);
$user_id = $this->db->insert_id();
?>
<script>
$(".next").hide();
$(".next").hide();
$("input[name=verify_code]").css("display","block");
$("input[name=user_id]").val(<?=$insert_id;?>);
</script>
<?php
// тут отправляем смс с кодом
echo '<input type="submit" class="submit" value="Продолжить"/>';
}
}
}
function code($phone)
{
$phone = $this->security->xss_clean($phone);
$code = $this->security->xss_clean(set_value('verify_code'));
$user_id = $this->security->xss_clean(set_value('user_id'));
$phone = "8".$phone;
$sql = $this->app->get_user(array('id'=>$user_id, 'phone'=>$phone, 'verify_code'=>$code));
if(!$sql){
$this->fv->set_message('_scode','Неверный код подтверждения: '.$code.'');
return FALSE;
}else{
exit;
$this->session->set_userdata("phone_signup", $sql['phone']);
return TRUE;
}
}
function form_user_data()
{
$user = $this->app->get_user($this->session->userdata("phone_signup"));
$this->fv->set_error_delimiters('<div class="error">','</div>');
$this->fv->set_rules('firstname','Имя','trim|required|max_length[20]|xss_clean');
$this->fv->set_rules('lastname','Фамилия','trim|required|max_length[20]|xss_clean');
$this->fv->set_rules('password','Пароль от профиля','trim|required|alpha_numeric|min_length[6]|max_length[36]|xss_clean');
if($this->fv->run() == FALSE){
echo $this->app->tpl('Завершение регистрации','signup/data', array('step'=>1));
}else{
$this->update_user_data($user['id']);
echo $this->app->tpl('Завершение регистрации','signup/data', array('step'=>2));
}
}
function update_user_data($user_id)
{
$data = $this->app->get_form(array('firstname','lastname','password'));
$data['is_active'] = 1;
$this->db->where('id', $user_id)->update('users', $data);
}
}
は、テンプレート:
<script>
function phone_sms()
{
var phone = $("input[name=phone]").val();
$.ajax({
url: "/index.php/signup/send_sms/"+phone,
success: function(html){
$("#phone_step").html(html);
}
});
return false;
}
</script>
<div class="padding">
<center>
<?=validation_errors();?>
<form action="" method="POST">
<input type="number" name="phone" placeholder="Номер телефона"/>
<a class="submit next" onclick="phone_sms();" id="ignore_dynamic">Продолжить</a>
<input type="hidden" name="user_id"/>
<input type="number" name="verify_code" placeholder="Код подтверждения" style="display: none;"/>
<div id="phone_step">
</div>
</form>
</center>
</div>
に
callback_code
の代わりcallback_scode
する必要がありません: