2011-02-22 5 views
1

PHP와 CodeIgniter에서 다중 단계/페이지 양식을 작성하려고합니다. 귀하가 저를 도울 수 있는지 궁금합니다.PHP와 CodeIgniter의 다중 단계/페이지 양식

뒤로 버튼을 사용하여 이전 단계로 돌아 왔을 때 다시 삽입하지 않고 업데이트하는 CI의 다중 단계 양식은 어떻게 만들 수 있습니까? 뒤로 버튼 POST 양식을 다시 보내지 않은 양식을 어떻게 가질 수 있습니까?

편집 :

덕분에 가능하면 JS없이!

+2

모든 것을 한 번에 ... – prodigitalson

+0

@prodigitalson 죄송합니다, 내 질문에 이것을 언급하는 것을 잊어 버렸지 만 JS 무료로 제공하고 싶습니다. 감사합니다 – RS7

답변

3

마법사의 모든 단계에서 사용하는 고유 한 ID를 만듭니다. 양식을 처음 저장할 때 해당 ID를 데이터베이스에 저장하십시오. input type="hidden"을 사용하여이 ID를 다음 단계로 전달합니다.
단계를 저장할 때 먼저 ID를 일치시키고 데이터베이스에서 발견되면 삽입 대신 업데이트를 수행하십시오.

을 방지하기 위해, 두 CodeIgniter의 컨트롤러 액션에서 각 마법사 단계를 수행 "당신이 게시물에 데이터를 다시 보내 싶어"

  • SaveStep5 (POST : 폼 인스턴스 ID + 다른 입력 "마법사는 5 단계") : 은 데이터베이스에서 양식 인스턴스 ID를 조회하고 삽입/업데이트 명령을 수행합니다. 은 LoadStep6으로 리디렉션하고 GET 매개 변수에 양식 인스턴스 ID를 전달합니다.
  • LoadStep6 (GET : 양식 인스턴스 ID); 인스턴스가 발견되지 않는 경우 데이터베이스, 에 양식 인스턴스를 찾습니다 : 인스턴스가 발견되면 처리 오류가, "6 단계"에 대한 입력 폼을 렌더링하면 해당 메시지를 피하려면
+0

는 앞서 이와 유사하지만 uri 세그먼트를 사용하여 진행했습니다. 덕분에 – RS7

+0

ID를 데이터베이스에 추가 할 필요가 없습니다. 세션에 추가하기 만하면됩니다 (설정에 따라 DB에 자동으로 추가 될 수 있습니다). 예 : '$ this-> session-> set_userdata ('wizard_id', rand()); ' –

0

하는 사용자에게 게시물 재발송에 대해 경고하고 자바 스크립트에서 다른 단계가 아닌 여러 개의 적절한 페이지를 원한다면 URL에 GET 매개 변수로 답을 넣을 수 있습니다. 첫 번째 양식 제출 후 form2가 표시됩니다. PHP? URL에 .. 당신은 폼 2에 숨겨진 변수로 그 해답을 추가 할 수 있습니다.
매우 우아한 해결책은 아닙니다. javascript를 사용하는 것이 좋습니다. 양식 제출을위한 사용자 지정 처리기를 추가하고 ajax를 통해 양식 내용을 제출 한 다음 ajax 완료시 다음 양식을로드하십시오.
또한 다른 사람이 응답 한 것처럼 서버 측에서는 데이터베이스의 제출 데이터를 가져 오거나 업데이트하는 고유 한 ID가 필요합니다.

0

나는 모든 단계가 완료 될 때까지 데이터베이스 업데이트를 기다리는 접근 방식을 좋아합니다. 중간 단계의 모든 데이터를 세션에 저장할 수 있습니다. 한 세션에서 사용중인 모델 객체를 저장할 수도 있고 모든 단계를 완료 한 후에 데이터베이스 삽입 작업을 수행 할 수 있습니다.

5

다음은 다른 질문에서 내 대답입니다. 데이터를 잃을 기회없이 전방/후방 능력을 제공하고 페이지 간을 즉시 이동하며 코드 작성이 쉽고 세션이 필요 없으며 프레임 워크와 무관합니다 (어떤 상황에서도 사용할 수 있음) :

제품을 개발했습니다 심리학에 근거한 테스트에 250 개의 질문을하는 심리학 시장. 완전히 압도적이지 않은 테스트를하기 위해, 순차적 ID가 추가 된 div 태그 (예 : div1, div2, div3)를 통해 루프에서 출력하는 동안 양식을 25 개의 질문 세그먼트로 구분합니다. 각 div는 다음과 같이 표시되도록 설정됩니다. 첫 번째 만 빼고.

나는 그 (DIV 1의 경우, 돌아 가기 버튼이 반대를 수행 $(#div2).show() 등 할 것 예.

중요한 부분이 형성하는 일 현재 사업부입니다 + 전환 버튼을 사용자에게 제공 모든 div를 다루고 있습니다. 제출 버튼을 사용하여 끝에있는 앞으로/뒤로 단추를 바꿔주는 것만으로도 가능합니다.

Voila! 예, 기술이 뛰어납니다. 앞으로 또는 뒤로 이동하십시오.

따라서 잘린 예 :

,451,515,
<form> 
    <div id="div1"> 
    First 25 Questions 
    <input type="button">shows next div</input> 
    </div> 
    <div id="div2" style="display:none"> 
    Second 25 Questions 
    <input type="submit">Submit Form</input> 
    </div> 
</form> 
+0

나는이 논리를 좋아한다. 어떻게 작동하는지 몇 가지 데모를 제공해 주시겠습니까 ?? –

0

나는 양식의 각 필드에 대한 변수로 내 마법사의 데이터를 저장할 수있는 모델을 가지고 :

class Class_signup_data extends CI_Model { 
const table_name="signups_in_progress"; 
public $market_segment; // there is a field named 'market_segment' in the wizard view 
... ...

나는 전체를 처리하는 하나의 컨트롤러가 과정의 SESSION_ID에 대한 매개 변수와 우리가있는 프로세스의 단계로이 컨트롤러에서

class Signup extends CI_Controller { 
    public function in_progress($session_id=NULL,$stage=1) { 
     $this->index($session_id,$stage); 
    } 
    public function index($session_id=NULL,$stage=1) { 
    if ($session_id===NULL) $session_id=$this->session->userdata('session_id'); 
... 
... 

나는 우리가 어느 단계에 대한 스위치가 있습니다 - 그것은 리터 먼저 '이전'버튼 ooks :

switch ($stage) { 
     case 2: 
      if ($this->input->post('prev')) { // if they click Previuous, the validations DON'T need to be met: 
       $signup_data->save_to_db(array_merge(array('ip'=>$_SERVER['REMOTE_ADDR'],'session_id'=>$session_id,'signup_stage' => '1', 
        'signup_complete' =>'0'),$this->input->post()),$this->db,$session_id); 
       $this->load->helper('url'); 
       redirect("/signup/in_progress/".$session_id."/1"); 

그리고 나중에 내가 클릭 않았거나 단지 호출되는 경우 형태와 '다음'과정을 표시하는 CI의 검증을 사용하는 스위치에/가입/IN_PROGRESS/각 뷰 (예를 들어 'signupStage2.php') 나는 이전 및 다음 버튼이 하단에서

$this->form_validation->set_rules("your rules"); 
if ($this->form_validation->run() == FALSE) { 
    $this->load->view('signupStage2',array('signup_data'=>$signup_data)); 
} else { 
    $signup_data->save(array_merge(array('ip'=>$_SERVER['REMOTE_ADDR'],'session_id'=>$session_id,'signup_stage' => '3', 
    'signup_complete' =>'0'),$this->input->post()),$this->db,$session_id); 
    $this->load->helper('url'); 
    redirect("/signup/in_progress/".$session_id."/3"); 
}; 

: 세션/2

<span class="align-left"><p><input type="submit" name="prev" class="big-button" 
value="<- Prev" /><input type="submit" name="next" class="big-button" 
value="Next ->" /></p></span> 
그때 제출 단계를 통해 갈 JS을 사용