2016-11-09 5 views
2

Webサイトに常にある必要があるページ(ホームページのように、1つだけです)では、私は拡張機能を作りたがっています。このページは、dev/buildを実行するときに作成する必要があり、CMSで作成、削除、未公開、またはアーカイブすることはできません。しかしそれは編集することができます。SilverStripeは拡張機能で作成できます

canCreate機能を除いて、何も問題なく動作しているようです。これは、(n)(Data)Extension上にあるときにこの機能がCMSにあまり働かないためです。私が.../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' 
    ]; 
} 

:-)私の拡張子にしたい私は、これは正しい方法をやっているか、私は何かが足りないのですか?

EDIT

canCreate方法はうまく動作しますが、私はこのようにそれを解決することができます。

これは、魅力的な効果と効果があります。しかし、問題はエクステンションにcanCreateメソッドを配置することです。それもうまくいくはずですよね?

答えて

0

まあ、$this->owner->get()は機能しません。 $this->ownerは常にDataListではなく実際のオブジェクトを返します。 、あなたは別の名前をご検討ください。このモジュールをリリースする予定がある場合、私はすでに

+0

おかげであなたの応答のためのSiteTreeを利用し、簡単な1ページ分-サイトを作るためのhttps://github.com/wernerkrauss/silverstripe-onepage/を公開しています:ところで

public function canCreate() { $className = $this->owner->ClassName; return $className::get()->count() == 0; } 

:それは次のように動作するはずですしかし、 'get'関数は動作します。これは 'DataObject'の[メソッド](http://api.silverstripe.org/3.1/class-DataObject.html#_get)です。それはDataListを返すので、あなたは答えでそれを変更することができますか?私はそれを解放するつもりはないだけでなく、自分のためにそれを使用してください。あなたが実際のHomePageクラスに移動した場合、canCreate関数が動作すると述べたので、この答えは実際に私の質問に答えません。 –

+0

'get'は静的メソッドです。私はあなたが直接それを拡張から呼び出すことはできません。 – wmk

+1

静的メソッドを非静的メソッドとして呼び出す[可能です](http://stackoverflow.com/a/10907777/6251886)試してみてください。 –

関連する問題