2016-11-09 35 views
2

對於必須始終在網站上的頁面(只有1個,而不是像主頁),我想進行擴展。當我運行開發/構建時,應該創建頁面,並且不能在CMS中創建,刪除,取消發佈或存檔。但可以編輯它。SilverStripe可以在分機上創建

寄託都似乎工作得很好,除了canCreate功能。看起來,這個功能對於CMS在(n)(數據)擴展中時並沒有太多的幫助。當我在.../admin/pages/add時,我仍然可以根據需要多次創建頁面。

如果我移動canCreate HomePage類,它的工作。但我想它在我的分機:-)

class OnePage extends DataExtension 
{ 
    public function requireDefaultRecords() 
    { 
     if($this->canCreate()) { 
      $page = $this->owner; 

      $page->Title = $this->owner->className; 
      $page->write(); 
      $page->publish('Stage', 'Live'); 
      $page->flushCache(); 
     } 
    } 

    public function canCreate($member = null) 
    { 
     return $this->owner->get()->count() == 0; 
    } 

    public function canDeleteFromLive($member = null) 
    { 
     return false; 
    } 

    public function canArchive($member = null) 
    { 
     return false; 
    } 
} 


class HomePage extends Page 
{ 
    private static $extensions = [ 
     'OnePage' 
    ]; 
} 

我是不是該做的正確的方式還是我失去了一些東西?

編輯

canCreate方法工作得很好,這樣我就可以解決這個問題這樣;

class HomePage extends Page 
{ 
    public function canCreate($member = null) 
    { 
     return $this->get()->count() == 0; 
    } 
} 

這具有理想的效果,像魅力一樣工作。但是,問題是將canCreate方法放入擴展中。這也應該工作,對嗎?

回答

0

那麼,$this->owner->get()將無法​​正常工作。 $this->owner總是返回實際的對象,而不是DataList。它應該像:

public function canCreate() { 

    $className = $this->owner->ClassName; 

    return $className::get()->count() == 0; 
} 

順便說一句:如果你計劃發佈的這一個模塊請考慮另外一個名字,我已經作出利用SiteTree簡單onepage的網站爲您迴應

+0

感謝公佈https://github.com/wernerkrauss/silverstripe-onepage/,然而'get'函數確實有效。它是'DataObject'上的[method](http://api.silverstripe.org/3.1/class-DataObject.html#_get)。它返回一個DataList,所以你可以在你的答案中改變它?除此之外,我不打算髮布它,只是將它用於我自己的。這個答案並沒有真正回答我的問題,因爲我聲明canCreate函數可以工作,如果你將它移動到實際的HomePage類 –

+0

'get'是一個靜態方法,我懷疑你可以直接從擴展中調用它。 – wmk

+1

作爲非靜態方法調用靜態方法[is possible](http://stackoverflow.com/a/10907777/6251886)試試看。 –

相關問題