SilverStripe 3 中带有表单的控制器扩展不会在自定义控制器上处理
Controller Extension with a form in SilverStripe 3 doesn't process on custom controllers
好的,这可能看起来有点令人费解,所以我会尽力而为:
- 我有一个带有显示数据的自定义路由的自定义控制器
对象作为页面。 TourController 扩展 Page_Controller。为了这
例如,假设到此页面的路由是
/tours/south-america/patagonia/tour-name/.这很好用。
- 我在整个站点中还有其他正常页面是通过
内容管理系统
我有一个新的 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,不管你在哪个页面。
好的,这可能看起来有点令人费解,所以我会尽力而为:
- 我有一个带有显示数据的自定义路由的自定义控制器 对象作为页面。 TourController 扩展 Page_Controller。为了这 例如,假设到此页面的路由是 /tours/south-america/patagonia/tour-name/.这很好用。
- 我在整个站点中还有其他正常页面是通过 内容管理系统
我有一个新的 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 错误。
我搜索并找到了一些
知道我该怎么做。我有一半认为将操作直接放在 Page_Controller 上会更容易,但我宁愿将所有这些代码封装起来。
尝试将 formAction 设置为始终使用 /home/myform,例如$form->setAction('/home/myForm');
那是在返回表单之前。然后它应该总是使用 URL,不管你在哪个页面。