Silverstripe - 在一个控制器上提交两个表单

时间:2016-12-05 08:19:46

标签: forms controller 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();

1 个答案:

答案 0 :(得分: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!