SilverStripe:尝试实现联系表格功能,但获得死亡白屏

时间:2015-05-20 15:12:35

标签: silverstripe

我跟随此tutorial

我有一个名为' Contact.ss'的页面。 php文件如下所示:

class Contact extends Page {

    private static $has_one = array (
        'Photograph' => 'Image'
    );

    static $db = array (
        'MailTo' => 'Varchar(100)',
        'SubmitText' => 'Text'
    );

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.Main', $Photograph = UploadField::create('Photograph'), 'Content');
        $Photograph->getValidator()->setAllowedExtensions(array('png','jpeg','jpg','gif'));
        $Photograph->setFolderName('photographs');

        $fields->addFieldToTab("Root.Main", new Textfield('Mailto', 'Address to email contact form submission to'));
        $fields->addFieldToTab("Root.Main", new TextareaField('SubmiteText', 'Text displayed after contact form submission'));

        return $fields;
    }

}

class Contact_Controller extends Page_Controller {
    static $allowed_actions = array(
        'ContactForm'
    );

    function ContactForm() {
        // Create fields
        $fields = new FieldSet(
            new TextField('Name', 'Name*'),
            new EmailField('Email', 'Email*'),
            new TextareaField('Comments','Comments*')
        );

        // Create action
        $actions = new FieldSet(
            new FormAction('SendContactForm', 'Send')
        );

        // Create Validators
        $validator = new RequiredFields('Name', 'Email', 'Comments');

        return new Form($this, 'ContactForm', $fields, $actions, $validator);
    }
}

但是当我在模板中调用$ContactForm时,当我尝试加载页面时,我得到一个空白屏幕。 (500错误)

我已检查过是否可以通过将所有ContactForm()代码替换为:

来从模板调用该功能
return "Hello, World!"

它有效,所以我知道正在调用该函数。但我无法看到教程中的代码有什么问题。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

问题是当您使用较新版本SilverStripe 3.1时,您使用的教程是为SilverStripe 2.4编写的。

对于SilverStripe 3.1,我建议浏览SilverStripe Frontend Forms lesson而不是SSBits教程。 SSBits教程是2010年开始的,适用于SilverStripe 2.4。 SilverStripe Frontend Forms课程从2015年开始,适用于当前版本的SilverStripe。

使用当前代码,需要更新许多代码才能在最新版本的SilverStripe中使用。

FieldSet已被FieldList取代。您需要在代码中将FieldSet的每个实例替换为FieldList

您的ContactForm看起来应该更像这样:

function ContactForm() {
    // Create fields
    $fields = FieldList::create(
        TextField::create('Name', 'Name*'),
        EmailField::create('Email', 'Email*'),
        TextareaField::create('Comments','Comments*')
    );

    // Create action
    $actions = FieldList::create(
        FormAction::create('SendContactForm', 'Send')
    );

    // Create Validators
    $validator = RequiredFields::create('Name', 'Email', 'Comments');

    return Form::create($this, 'ContactForm', $fields, $actions, $validator);
}

在SilverStripe 3.1中,内置的静态变量需要声明为私有。

确保将$allowed_actions声明为私有:

private static $allowed_actions = array(
    'ContactForm'
);

与您的$db一样私密:

private static $db = array (
    'MailTo' => 'Varchar(100)',
    'SubmitText' => 'Text'
);