SilverStripe:表单适用于主页但不适用于 child 页面
SilverStripe: Form works on main page but not on a child page
我有以下表单代码:
ContactPage_Controller extends Page_Controller {
static $allowed_actions = array(
'submit'
);
public function Send() {
$contact = new Contact();
$validator = new RequiredFields('Anrede', 'Vorname', 'Nachname', 'Email', 'Message');
$fields = new FieldList(
new TextField('securityidentifier', 'securityidentifier', $this->cryptTime()),
new DropdownField('Anrede', 'Anrede:*', $contact->dbObject('Anrede')->enumValues()),
new TextField('Vorname', 'Vorname:*'),
new TextField('Nachname', 'Nachname:*'),
new EmailField('Email', 'E-Mail-Adresse:*'),
new TextareaField('Message', 'Nachricht:*')
);
$actions = new FieldList(
new FormAction('submit', 'Senden')
);
return new Form($this, 'submit', $fields, $actions, $validator);
}
// ...
}
如果我将它用作单个页面,则效果很好。当我尝试将其用作 child 页面时,表单没有显示。我得到了标题,得到了内容,但我没有得到表格。
知道为什么这不能正常工作吗?
您的表单是在 ContactPage_Controller
上定义的。如果您尝试在其上呈现它的子页面不是 ContactPage
的后代,则该方法通过继承不可见。有几个选项。
1) 将表格放入Page_Controller
。通常,您的所有页面都继承自该页面,因此它们可以访问该表单。不过,这不是很好的做法。尽量保持 Page
类 苗条。
2) 创建一个扩展,将表单工厂方法和处理程序注入控制器。这更多的是 "horizontal" 方法而不是垂直继承方法,并且倾向于更好地扩展。
3) 按照同样的思路,创建一个执行相同操作的特征。可能是更好的选择,因为扩展是特殊的,可能会在某个时候被弃用。
我有以下表单代码:
ContactPage_Controller extends Page_Controller {
static $allowed_actions = array(
'submit'
);
public function Send() {
$contact = new Contact();
$validator = new RequiredFields('Anrede', 'Vorname', 'Nachname', 'Email', 'Message');
$fields = new FieldList(
new TextField('securityidentifier', 'securityidentifier', $this->cryptTime()),
new DropdownField('Anrede', 'Anrede:*', $contact->dbObject('Anrede')->enumValues()),
new TextField('Vorname', 'Vorname:*'),
new TextField('Nachname', 'Nachname:*'),
new EmailField('Email', 'E-Mail-Adresse:*'),
new TextareaField('Message', 'Nachricht:*')
);
$actions = new FieldList(
new FormAction('submit', 'Senden')
);
return new Form($this, 'submit', $fields, $actions, $validator);
}
// ...
}
如果我将它用作单个页面,则效果很好。当我尝试将其用作 child 页面时,表单没有显示。我得到了标题,得到了内容,但我没有得到表格。
知道为什么这不能正常工作吗?
您的表单是在 ContactPage_Controller
上定义的。如果您尝试在其上呈现它的子页面不是 ContactPage
的后代,则该方法通过继承不可见。有几个选项。
1) 将表格放入Page_Controller
。通常,您的所有页面都继承自该页面,因此它们可以访问该表单。不过,这不是很好的做法。尽量保持 Page
类 苗条。
2) 创建一个扩展,将表单工厂方法和处理程序注入控制器。这更多的是 "horizontal" 方法而不是垂直继承方法,并且倾向于更好地扩展。
3) 按照同样的思路,创建一个执行相同操作的特征。可能是更好的选择,因为扩展是特殊的,可能会在某个时候被弃用。