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) 按照同样的思路,创建一个执行相同操作的特征。可能是更好的选择,因为扩展是特殊的,可能会在某个时候被弃用。