2016-12-05 31 views
0

我想通過一個提交按鈕將兩個表單提交到同一個控制器上的相應數據庫。Silverstripe - 一個控制器上的兩個表單提交

使用onAfterWrite我需要提交第一個表單獲取其ID並將其傳遞給第二個表單,然後提交第二個表單,然後重定向到成功。

這是可能的,還是應該以另一種方式做?

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!

相關問題