我在如何做类似于http://www.silverstripe.org/archive/show/2431的事情时遇到了麻烦。基本上我希望用户能够创建内容并将他们的 ID 与新内容一起放入数据库中。如果这很明显,我很抱歉。我有点难过。我很难理解它实际上是如何工作的。我知道我可以使用以下代码检索当前用户,但我不确定从那里去哪里。
$currentUser = Member::currentUser();
我在如何做类似于http://www.silverstripe.org/archive/show/2431的事情时遇到了麻烦。基本上我希望用户能够创建内容并将他们的 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();
}
}