2017-11-29 5 views
-1

CodeIgniter 프레임 워크는 필드가 필요한 경우에도 (form_phone_data 메서드에서) 유효성 검사에 필요한 오류를 지속적으로 생성합니다. AJAX로로드 된 "user_id"필드의 값.Codeigniter 필수 오류

양식 전송 버튼을 클릭하면 "전화"필드가 채워지지 않았다는 메시지가 표시됩니다. 유효성 검사 매개 변수에서 "필수"를 제거하면 폼을 보내는 무한한 페이지로드가 나타납니다.

코드 :

<?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> 
+0

휴대 전화 규칙에 callback_code 대신 callback_scode해야하지 않습니다 더 이상은 더 이상 사용되지 않습니다. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/center – Vickel

답변

0

그것은

보조 노트로
+0

I n 컨트롤러 함수 scode -> $ this-> sup-> code ($ phone) –

+0

콜백 메소드 이름은'code'가 아니고'scode'입니다. –

+0

@ S.Grig 그럼 다른 접근법에서 이것을 시도해 볼 수 있습니다 - callback__scode - 그래서 _scode()라는 메소드는 어디에 있습니까? 참고 : 1 대신 2 개의 밑줄이 있습니다. – TimBrownlaw