2016-12-05 5 views
0

하나의 제출 단추를 사용하여 같은 컨트롤러에있는 두 개의 양식을 각각의 데이터베이스에 제출하려고합니다.Silverstripe - 하나의 컨트롤러에 두 개의 양식 제출

onAfterWrite 사용하기 첫 번째 양식을 제출하여 두 번째 양식에 전달한 다음 두 번째 양식을 제출 한 다음 성공으로 리디렉션해야합니다.

이렇게해도 될까요 아니면 다른 방식으로해야할까요?

public static function FormAction1($data, $form) { 

$form->sessionMessage('Update successful', 'success'); 
$submission = Form1::get()->byID($data["ID"]); 
$form->saveInto($submission); 
$submission->write(); 
return Controller::curr()->redirectBack(); 

public static function FormAction2($data, $form) { 

$form->sessionMessage('Update successful', 'success'); 
$submission = Form2::get()->byID($data["ID"]); 
$form->saveInto($submission); 
$submission->write(); 
return Controller::curr()->redirectBack(); 
+0

두 가지 양식이 필요한 이유가 있습니까? 단일 양식으로도 똑같이 할 수 없습니까? – bummzack

+0

그들은 현재 2 개의 분리 된 페이지에 있지만 나는 여분의 클릭을 사용자에게 저장하기 위해 그것들을 1 페이지에 둘 다 원합니다. 그들은 서로 다른 엔티티이므로 동일한 테이블에서 작업하지 않습니다. 별도로해야합니다. – Craig

+0

하지만 액션 핸들러는 모두 입력과 ​​동일한 데이터를 사용합니다. 맞습니까? 또는 사용자가 컨텐츠를 채울 기회가없는 경우 두 번째 양식 데이터를 채워야합니까? 어쩌면 당신의 질문을 분명히해야합니다 ... – bummzack

답변

3

일반적으로 나는 이것을 달성하기 위해 코드를 다르게 구성하는 것이 좋습니다.

세 가지 양식 작업이 있고 그 중 하나가 다른 두 작업을 수행하는 경우 요구 사항에 따라 다른 방법을 호출하는 세 가지 양식 작업으로 구조화 할 수 있습니다. 예를 들어 '저장', '사용자에게 알림'및 '& 사용자에게 알림'과 같은 세 가지 작업을 원한다고 가정 해 보겠습니다. 내가 지금처럼이 구조 것입니다 :

class Page_Controller extends ContentController { 
    public function Form() { 
     $actions = new ArrayList([ 
      new FormAction('save', 'Save'), 
      new FormAction('notify', 'Notify users'), 
      new FormAction('saveandnotify', 'Save & Notify users') 
     ]); 

     return new Form($this, 'Form', $fields, $actions); 
    } 

    public function save($data, Form $form) { 
     if($this->doSave($data, $form)) { 
      $form->sessionMessage('Save successful', 'good'); 
     } else { 
      $form->sessionMessage('Failed to save', 'bad'); 
     } 

     return $this->redirectBack(); 
    } 

    public function notify($data, Form $form) { 
     if($this->doNotify($data, $form)) { 
      $form->sessionMessage('Notified users successfully', 'good'); 
     } else { 
      $form->sessionMessage('Failed to notify users', 'bad'); 
     } 

     return $this->redirectBack(); 
    } 

    public function saveandnotify($data, Form $form) { 
     // First, attempt save 
     if($this->doSave($data, $form)) { 
      // Successful, so now notify users 
      if($this->doNotify($data, $form)) { 
       $form->sessionMessage('Saved and notified users', 'good'); 
      } else { 
       $form->sessionMessage('Saved, but unable to notify users', 'bad'); 
      } 
     } else { 
      $form->sessionMessage('Unable to save or notify users', 'bad'); 
     } 

     return $this->redirectBack(); 
    } 

    /** 
    * Saves data from a form submission. 
    * @return bool true if save was successful, false if it failed 
    */ 
    public function doSave($data, Form $form) { 
     // ... your code here ... 
    } 

    /** 
    * Notify users based on a form submission. 
    * @return bool true if notification was successful, false if it failed 
    */ 
    public function doNotify($data, Form $form) { 
     // ... your code here ... 
    } 
} 

이 형태의 액션 처리도보다 쉽게 ​​전체 양식 제출을 수행 할 필요없이 비즈니스 로직을 테스트 할 수 있습니다 실제 비즈니스 로직 사이의 문제를 분리 (단지 Form를 만들 개체, 값 설정 및 테스트 실행).

한 페이지 컨트롤러가 처리하기에 너무 복잡해지면 비즈니스 로직을 별도의 클래스로 옮길 수도 있습니다. 이 시점에서 필자는 일반적으로 분리 된 분리 된 클래스로 다양한 비즈니스 기능을 제공하는 '서비스'객체를 살펴 봅니다.

편집 : 현재 두 개의 별도 강의에이 양식이 있습니다. 이 두 개의 별도의 Form 클래스 또는 두 가지 다른 페이지 유형 중 하나라고 가정합니다. 이 경우 서비스 클래스를 사용하면 모든 페이지 유형에서 동일한 논리 (내 경우 doSavedoNotify)를 참조 할 수 있으며 매번 같은 논리를 얻을 수 있음을 의미합니다.

HTH!