SilverStripe:表单可以在主页面上工作,但不能在子页面上工作

SilverStripe:表单可以在主页面上工作,但不能在子页面上工作,silverstripe,Silverstripe,我有以下表格代码: ContactPage_Controller extends Page_Controller { static $allowed_actions = array( 'submit' ); public function Send() { $contact = new Contact(); $validator = new RequiredFields('Anrede', 'Vorname', 'Na

我有以下表格代码:

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);
    }

    // ...
}
如果我把它作为一个单独的页面使用,它就可以很好地工作。当我尝试将其用作子页面时,表单不会显示。我得到了标题,我得到了内容,但我没有得到表格


你知道这为什么不能正常工作吗

您的表单是在
ContactPage\u Controller
上定义的。如果您试图在其上呈现的子页面不是
ContactPage
的后代,则该方法通过继承不可见。有几种选择

1) 将表单放入控制器的
页面
。通常,您的所有页面都继承自该表单,因此它们可以访问该表单。不过,这不是很好的练习。尽量让你的
页面
类保持精简

2) 创建将表单工厂方法和处理程序注入控制器的扩展。这更多的是“水平”继承方法,而不是垂直继承方法,而且往往规模更大


3) 按照同样的思路,创造一种做同样事情的特质。可能是更好的选择,因为扩展是特殊的,可能会在某个时候被弃用。

您的表单是在
ContactPage\u Controller
上定义的。如果您试图在其上呈现的子页面不是
ContactPage
的后代,则该方法通过继承不可见。有几种选择

1) 将表单放入控制器的
页面
。通常,您的所有页面都继承自该表单,因此它们可以访问该表单。不过,这不是很好的练习。尽量让你的
页面
类保持精简

2) 创建将表单工厂方法和处理程序注入控制器的扩展。这更多的是“水平”继承方法,而不是垂直继承方法,而且往往规模更大


3) 按照同样的思路,创造一种做同样事情的特质。可能是更好的选择,因为扩展是特殊的,在某些时候可能会被弃用。

子页面是什么意思?子页面也是联系人页面吗?@bummzack,子页面我指的是childpage。@wmk是。这正是让我困惑的地方。你确定你对允许的孩子没有任何限制吗
private static$allowed_children
将允许一系列允许的子类型,因此您可能无法将ContactPage类型作为要在其下创建ContactPage的页面的子类型?如果是这种情况,子页面将默认为普通页面类型,最简单的方法是查看您希望成为联系人页面的页面的“设置”选项卡,从下拉列表中查看其类型“子页面”是什么意思?子页面也是联系人页面吗?@bummzack,其中子页面我指的是childpage。@wmk是。这正是让我困惑的地方。你确定你对允许的孩子没有任何限制吗
private static$allowed_children
将允许一系列允许的子类型,因此您可能无法将ContactPage类型作为要在其下创建ContactPage的页面的子类型?如果是这种情况,子页面将默认为普通页面类型,最简单的方法是查看您希望成为联系人页面的页面的设置选项卡,从下拉列表中查看其类型