1

문제/간단한 소개CodeIgniter는 - 컨트롤러 다른보기 (? URL/라우팅)

내가 최근 CodeIgniter를 사용하기 시작했습니다, 그리고 나는 또한 전체 MVC 아키텍처에 아주 새로운 해요, 그래서 '로드 너와 나랑 벗고달라고 부탁 할께.

현재 내가 만들고있는 과정은 간단한 등록/로그인 시스템입니다 (이는 나중에 더 자세히 설명 할 예정입니다). 나는 주로 두 가지 기능을 가진 Users이라는 컨트롤러를 가지고있다. 하나는 show_register()이고 하나는 send_register()입니다. 이것은 모델 User_Model과 쌍을 이루며, 공장 UserFactory과 짝을 이루며 현재 (주로 테스팅을 위해 나중에 결합 될 것입니다) 세 가지보기 register_success, register_failshow_register과 짝을 이룹니다. 그들은 기본적으로 "이봐, 축하해."라고 말했어. 하나는 "Oh noes, no register!"라고 말했어. 실제 등록 양식을 보여주기위한 것입니다.

http://url.com/register으로 가면 등록 양식 자체가 자동으로 표시됩니다 ($route['register'] = 'users/show_register';으로 라우팅 됨).

따라서 양식을 show_register에 입력하면 양식 작업에 따라 Users- 컨트롤러의 send_register 기능이 사용됩니다. 입력이 확인되고 모두 유효하면 데이터베이스 입력을 위해 UsersFactory으로 전송됩니다. 모두 양호한 경우 컨트롤러는 "true"를 결과로 수신하고 해당보기를 표시합니다. 여기가 우리의 문제입니다!

등록 할 수있는 URL은 현재 http://url.com/public/users/send_register입니다. 공용 폴더는 파일을 보관하는 곳이며 htaccess를 통해 URL에서 제거해야한다는 것을 알았습니다. htaccess는 수행 방법에 대한 방법을 찾을 것입니다. 문제는 내 URL이 users-controller와 send_register 기능으로 구성되는 것을 원하지 않는다는 것입니다. http://url.com/register/으로 유지하고 다른보기를 표시하고 싶습니다.

내가 무엇을 시도했다/나는 무엇보다도 먼저 라우팅을 검토 한 결과

로 보았다. 나는 깨달았다. (잘하면 나는 이것에 대해 옳다. 그렇지 않다면 나는 읽는 법을 배워야한다.) 내가 기술 한 문제에 대해 작동하지 않을 것이라는 것을 알기 바란다. 그 주된 이유는 내가 무엇을 지정해도 그것을 특정 클래스/함수로 전송하기 때문입니다. 이 경우 우리가하고있는 일은 이미 적절한 클래스/기능으로 가고 있지만 "잘못된"URL이 사용자에게 표시됩니다. 이 컨트롤러 내부에 다른 메소드가 있기 때문에 어렵습니다. 즉, 모든 액션을 정적으로 매핑하여 단일 함수로 유도 할 수는 없습니다.

.htaccess도 살펴 봤지만 실제로 쓰는 방법을 찾지 못했습니다. 좋은 측정을 위해 .htaccess 파일이 도움이 될 수 있도록 아래쪽에 인쇄하도록하겠습니다. 내가 한 모든 것은 index.php 파일이 URL에서 제거되도록 수정하는 것입니다.

htaccess로 파일

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php/$0 [PT,L] 

당신이 나에게 보여주고 싶은 다른 파일이있는 경우, 나는 기꺼이 그렇게 할 것입니다. 현재로서는 컨트롤러 자체가 관련성이 있다고 생각할 수 있습니다.

<?php 
if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Users extends CI_Controller { 

    public function show_register() 
    { 
     $this->load->view("show_register"); 
    } 

    public function send_register() 
    { 
     // Populate the model with the information we got from the form. 
     $data = array(
      'user_name' => $this->input->post('username'), 
      'user_pass' => $this->input->post('password'), 
      'user_email' => $this->input->post('email'), 
      'user_level' => 1 
      ); 

     // Then pass that on to the User Factory, which will insert that into the database. 
     $this->load->library("UserFactory"); 

     if($this->userfactory->registerUser($data)) 
     { 
      $this->load->view("register_success"); 
     } 
     else 
     { 
      $this->load->view("register_fail"); 
     } 
    } 
} 
?> 

답변

0

답변을 받기까지 오랜 시간이 걸릴 수 있습니다.

왜 그냥 아약스 전화를하지 않습니까? 보기에

양식입니다 :

<div id="message_box" class="hidden"></div> 
<form id="theForm" method="post" action="submitForm()"></form> 

<script> 
function submitForm() { 
    $.post("<?= site_url('Users/send_register');?>", $("#theForm").serialize(), function(data) { 
     success: $("#message_box").html(data).show(); 
     error: $("#message_box").html("<p>There was an error with your request</p>").show(); 
    }); 
} 
</script> 

이 할 수있는 백만 가지 방법이 물론 있습니다. 하지만 나는 짧은 HTML 성공/실패 (위에서 말했듯이) 에서처럼 이러한 뷰가 메시지 뷰일 뿐이라고 가정하고 있습니다. 아약스의 장점은 사용자가 페이지에 머무르면 URL을 숨길 수 있다는 것입니다.

희망 하시겠습니까?

+0

그건 분명히 할 수있는 방법 중 하나입니다! 그러나 어떻게해야 할 지에 대해서는 조금 궁금합니다. 가능한 한 많은 논리적 인 논리를 피하고 싶습니다. 성공/오류 메시지만큼 간단하지 않은 시나리오를 따라 가면서보다 고급 시나리오가 나타날 것입니다. 고맙습니다 만, 분명히 이것을 고려하고 있습니다! – CmdrSharp

+0

좋아요, 다른 방법은'redirect()'메소드를 사용하는 것입니다. 컨트롤러 내에서'register_success()'와'register_fail()'에 대해 별도의 함수를 만들 수 있고'리디렉션 (Users/register_success)'을 수행하고 전에 설명한 것처럼 경로 2에 추가 할 수 있습니다. – acupajoe

+1

감사합니다! 왜 내가 그런 생각을하지 않았는지 모르겠습니다. 나는 리다이렉트를 사용하지 않기로 마음 먹었으나 대신에 그 클래스의 register-function에 여러 시나리오를 처리하도록했다. 나를 궤도에 다시 설정해 주셔서 고마워요! – CmdrSharp

관련 문제