我有以下表单代码:
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);
}
// ...
}
如果我将它用作单个页面,这可以正常工作。当我尝试将其用作子页面时,表单不会显示。我得到标题,我得到的内容,但我没有得到表格。
为什么这不能正常工作的任何想法?
答案 0 :(得分:4)
您的表单已在ContactPage_Controller
上定义。如果您尝试呈现它的子页面不是ContactPage
的后代,则通过继承看不到该方法。有几种选择。
1)将表格放在Page_Controller
中。通常,您的所有页面都继承自该页面,因此他们可以访问该表单。但不是很好的练习。尽量让你的Page
课程保持精益。
2)创建一个扩展,将表单工厂方法和处理程序注入控制器。这更像是“横向”方法,而不是垂直的继承方法,并且倾向于更好地扩展。
3)沿着同样的路线,创造一个做同样事情的特质。可能是一个更好的选择,因为扩展是特殊的,可能会在某些时候被弃用。