SilverStripe 3 中带有表单的控制器扩展不会在自定义控制器上处理

Controller Extension with a form in SilverStripe 3 doesn't process on custom controllers

好的,这可能看起来有点令人费解,所以我会尽力而为:

  1. 我有一个带有显示数据的自定义路由的自定义控制器 对象作为页面。 TourController 扩展 Page_Controller。为了这 例如,假设到此页面的路由是 /tours/south-america/patagonia/tour-name/.这很好用。
  2. 我在整个站点中还有其他正常页面是通过 内容管理系统
  3. 我有一个新的 DataExtension,它只是将一个表单添加到所有 Page_Controller 个对象。下面的代码。

    class CurrencyPageExtension extends DataExtension {
    private static $allowed_actions = array(
        'CurrencyForm',
        'setCurrency'
    );
    
    public function CurrencyForm() {
    
        $currencies = [
            'NZD',
            'AUD',
            'USD',
            'GBP',
            'EUR'
        ];
    
        $currentCurrency = 'NZ';
    
        $currencyField = DropdownField::create('Currency', ' ', $currencies, $currentCurrency);
        $currencyField->addExtraClass('form-control');
        $currencyField->setAttribute('onchange', 'this.form.submit()');
    
        $fields = FieldList::create(
            $currencyField
        );
    
        $actions = FieldList::create(
            FormAction::create('setCurrency', 'Save')
        );
    
        $form = new Form(
            $this->owner,
            'CurrencyForm',
            $fields,
            $actions
        );
    
        return $form;
    
    }
    
    public function setCurrency($data, $form) {
        // Set currency stuff
        $this->owner->redirectBack();
    }
    
    }
    

在所有页面中,包括自定义控制器,表单都呈现得很好。当我提交时,我得到了问题。在普通页面上,一切正常,并且触发了 setCurrency 操作。例如。表单已提交至 /home/CurrencyForm。然而,在自定义控制器上,表单被提交到 /TourController/CurrencyForm 并出现 404 错误。

我搜索并找到了一些 关于在自定义控制器上创建 Link() 方法的方法,我成功地做到了。然而,404 问题仍然存在。

知道我该怎么做。我有一半认为将操作直接放在 Page_Controller 上会更容易,但我宁愿将所有这些代码封装起来。

尝试将 formAction 设置为始终使用 /home/myform,例如$form->setAction('/home/myForm');

那是在返回表单之前。然后它应该总是使用 URL,不管你在哪个页面。