Silverstripe 定制CMS

Silverstripe 定制CMS,silverstripe,Silverstripe,我很难做类似的事情。基本上,我希望用户能够创建内容,并将其ID与新内容一起放入数据库。如果这很明显,我很抱歉。不过我有点被难住了。我很难理解它到底是如何工作的。我知道我可以使用下面的代码检索当前用户,但我不确定从那里去哪里 $currentUser = Member::currentUser(); 在SilverStripe中,FormField的第三个参数通常是值,因此,例如,TextField具有以下参数: new TextField($name = 'myField', $title =

我很难做类似的事情。基本上,我希望用户能够创建内容,并将其ID与新内容一起放入数据库。如果这很明显,我很抱歉。不过我有点被难住了。我很难理解它到底是如何工作的。我知道我可以使用下面的代码检索当前用户,但我不确定从那里去哪里

$currentUser = Member::currentUser();

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

new TextField($name = 'myField', $title = 'Please write something in my Field', $value = "yay");
但这在CMS中不起作用(至少在SilverStripe 2中,如果您使用的是页面,在DataObject上不确定),因为SilverStripe在尝试用当前对象的值填充表单时会覆盖所有值

因此,您有几个备选方案,最简单的两个备选方案是:

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

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

new TextField($name = 'myField', $title = 'Please write something in my Field', $value = "yay");
但这在CMS中不起作用(至少在SilverStripe 2中,如果您使用的是页面,在DataObject上不确定),因为SilverStripe在尝试用当前对象的值填充表单时会覆盖所有值

因此,您有几个备选方案,最简单的两个备选方案是:

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

您是否完成了第一个()和第二个教程(请确保选择正确的版本-3.0或2.4)?一旦你做到了这一点,你应该很好地自我解释。或者,您需要重新表述您的问题,但内容过于宽泛……您是否完成了第一个()和第二个教程(请确保选择正确的版本-3.0或2.4)?一旦你做到了这一点,你应该很好地自我解释。或者您需要重新表述您的问题,但它太宽泛了……很高兴看到一些有经验的silverstripe开发人员在stackoverflow采取行动+1卓越的解释@Zauberfisch。这正是我想要的。谢谢。:)很高兴看到一些有经验的silverstripe开发人员在stackoverflow采取行动+1卓越的解释@Zauberfisch。这正是我想要的。谢谢。:)