0

このhttp://www.silverstripe.org/archive/show/2431と同様のことを行う方法に問題があります。基本的に、ユーザーがコンテンツを作成し、ID を新しいコンテンツと共にデータベースに入れられるようにしたいと考えています。これがかなり明白である場合は申し訳ありません。私は少し困惑しています。それが実際にどのように機能するかについて頭を悩ませています。次のコードを使用して現在のユーザーを取得できることはわかっていますが、そこからどこに行くべきかわかりません。

$currentUser = Member::currentUser();
4

1 に答える 1

3

SilverStripeでは、通常、FormFieldの3番目の引数が値であるため、たとえば、TextFieldには次の引数があります。

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

ただし、これはCMSでは機能しません(少なくともページを使用している場合はSilverStripe 2で、DataObjectでは不明)。SilverStripeはフォームに現在のオブジェクトの値を入力しようとするとすべての値を上書きするためです。

したがって、いくつかの選択肢があります。最も簡単な2つの選択肢は次のとおりです。

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

2番目のオプションは、この場合ははるかに優れています。隠しフィールドも必要ありません。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();
    }
}
于 2012-08-20T19:58:10.720 に答える