自定义CMS

时间:2012-08-20 15:55:29

标签: silverstripe

我在如何做与此http://www.silverstripe.org/archive/show/2431类似的事情上遇到了麻烦。基本上我希望用户能够创建内容并使用新内容将其ID放入数据库。如果这很明显,我很抱歉。我虽然有点难过。我无法理解其实际工作方式。我知道我可以使用以下代码检索当前用户,但我不知道从那里去哪里。

$currentUser = Member::currentUser();

1 个答案:

答案 0 :(得分:3)

在SilverStripe中,FormField的第三个参数通常是值,因此例如TextField具有以下参数:

new TextField($name = 'myField', $title = 'Please write something in my Field', $value = "yay");

但这在CMS中不起作用(至少在SilverStripe 2中,如果你使用的是Page,对DataObject不确定),因为SilverStripe在尝试使用当前对象的值填充Form时会覆盖所有值

所以你有几种选择,最简单的两种选择是:

class MyContentObject extends DataObject {
    public static $db = array(
        'Text' => 'HTMLText',
    );
    public static $has_one = array(
        'Member' => 'Member',
    )
    public function getCMSFields()  {
        $fields = new FieldSet();
        $fields->push(new Textarea('Text', 'Text'));
        if (!$this->MemberID)
            $this->MemberID = Member::currentUserID();
        $fields->push(new HiddenField('MemberID'));
        return $fields;
    }
}

第二个选项,在这种情况下更好,你甚至不需要隐藏字段,只需在使用onBeforeWrite将记录写入数据库之前设置MemberID:

class MyContentObject extends DataObject {
    public static $db = array(
        'Text' => 'HTMLText',
    );
    public static $has_one = array(
        'Member' => 'Member',
    )
    public function getCMSFields()  {
        $fields = new FieldSet();
        $fields->push(new Textarea('Text', 'Text'));
        return $fields;
    }
    public function onBeforeWrite() {
        // this method will be called every time the object gets saved
        parent::onBeforeWrite();
        if (!$this->MemberID)
            $this->MemberID = Member::currentUserID();
    }
}