silverstripe直接通过textfield编辑has_one关系的属性

时间:2013-10-28 22:09:57

标签: content-management-system silverstripe

我正在尝试直接通过文本字段编辑相关数据对象的属性。例如,我有一个与每个页面相关的计数器对象。我可以非常方便地通过文本字段直接编辑计数器对象的值,而不是转到相关对象并在那里编辑它。那可能吗?

我至少可以在文本字段中显示当前值:$fields->addFieldToTab('Root.Main', new TextField('ILikeCount.Count', 'ILikeCount', $this->ILikeCount()->Count), 'Content');

但保存新值不起作用。 很多, 弗洛里安

1 个答案:

答案 0 :(得分:0)

也许你可以在onBeforeWrite() hook

中捕获textField值
$fields->addFieldToTab('Root.Main', new TextField('ILikeCountCount', 'ILikeCount', $this->ILikeCount()->Count), 'Content');

textField名称可以是任何内容,在这里我只是删除了点缀符号以使事情变得更容易。然后捕获onBeforeWrite()中的值并更新关系。

public function onBeforeWrite()
{
    if( $this->ILikeCountCount )
    {
        // check if a $has_on realtion exist
        if ( !$this->ILikeCountID )
        {
            // create new DataObject + relation
            $ILikeCount = ILikeCount::create();
            $ILikeCount->Count = $this->ILikeCountCount;
            $ILikeCount->write();

            $this->ILikeCountID = $ILikeCount->ID;
        }
        else{
            // update existing relation
            $ILikeCount = $this->ILikeCount();
            $ILikeCount->Count = $this->ILikeCountCount;
            $ILikeCount->write();
        }  

        $this->ILikeCountCount = false; // clear to avoid duplicate writes
    }
    parent::onBeforeWrite();
}