1

Page.php に Color というフィールドを設定しました。子に対しては、親の色を取得するか、色のフィールドが設定されている親が見つかるまでループします。

以下の関数は 2.4 で動作するようですが、テンプレートのループ内で $Inherited(Colour) として呼び出す SS3 では動作しません。

あなたの助けに感謝します

public function Inherited($objName) {
    $page = $this->owner->Data();
    do {

        if ($obj = $page->obj($objName)) {

            if ($obj instanceof ComponentSet) {
                if ($obj->Count()) {
                    return $obj;
                }
            } elseif ($obj instanceof DataObject) {

                if ($obj->exists()) {
                    return $obj;
                }
            } elseif ($obj->exists()) {
                return $obj;
            }
        }
    } while ($page->ParentID != 0 && $page = $page->Parent());
}
4

2 に答える 2

1

Colorフィールドがデータベースフィールドであり、別のデータオブジェクトとの関係ではないと仮定して、次のメソッドをPageクラスに追加します。

パブリック関数getColour(){

    //このページのバナーを返してみてください
    $ colour = $ this-> getField('Colour');
    if($ colour){
        $colourを返します。
    }

    //このページの色はありませんか?親をループします。
    $ parent = $ this-> Parent();
    if($ parent-> ID){
        $ parent-> getColour();を返します。
    }

    //フォールバック位置が必要です(テンプレートで処理されます)
    nullを返します。
}

colorが関連するデータオブジェクトである場合、ほとんど同じことを行うことができますが、上記のコードの代わりにgetComponentorgetComponentsメソッドを使用します。getFieldこれは、Silverstripeバージョン2.4.xと3.0.xの両方で機能するはずです。

この種の操作は便利ですが、ページの読み込みの大部分で再帰的に発生し、変更されることはめったにないため、控えめに実行するか、大量にキャッシュする必要があります。

于 2012-10-22T07:02:27.470 に答える
1

$this->owner現在のページを参照するために使用しているため、この関数をいくつかの DataObjectDecorator 内で定義したと思います。

SilverStripe 3 には DataObjectDecorator がもうないため ( http://www.robertclarkson.net/2012/06/dataextension-class-replacing-dataobjectdecorator-silverstripe-3-0/を参照)、2 つの可能な解決策があります。

a) DataObjectDecorator を DataExtension に置き換えます

b) 関数を Page クラスに移動し、次のようInheritedに置き換えます。$this->owner$this

于 2012-10-17T06:20:00.403 に答える