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

时间:2017-04-26 12:15:43

标签: silverstripe

我有以下表单代码:

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

    // ...
}

如果我将它用作单个页面,这可以正常工作。当我尝试将其用作子页面时,表单不会显示。我得到标题,我得到的内容,但我没有得到表格。

为什么这不能正常工作的任何想法?

1 个答案:

答案 0 :(得分:4)

您的表单已在ContactPage_Controller上定义。如果您尝试呈现它的子页面不是ContactPage的后代,则通过继承看不到该方法。有几种选择。

1)将表格放在Page_Controller中。通常,您的所有页面都继承自该页面,因此他们可以访问该表单。但不是很好的练习。尽量让你的Page课程保持精益。

2)创建一个扩展,将表单工厂方法和处理程序注入控制器。这更像是“横向”方法,而不是垂直的继承方法,并且倾向于更好地扩展。

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