1

silverstripe内の新しいページにデフォルトのウィジェットを設定したり、子ページに最初に親からウィジェットを継承させたりすることは可能ですか?サイドバー全体は、私が作業しているサイトのカスタムウィジェットによって占められており、クライアントが作成する(多くの)新しいページにデフォルトで表示されるいくつかの選択があれば便利です。それらは、それらを削除するか、他のいずれかを追加するオプションを引き続き持つ必要があります。

ドキュメントを検索しましたが、これが可能であるという指標は見つかりませんでした。

4

1 に答える 1

2

デフォルトのウィジェットはかなり簡単に実行できるはずです。デフォルトを設定できるウィジェット領域をSiteConfigに追加し、PageでpopulateDefaultsを使用して、SiteConfigから新しいページにウィジェットをコピーできます。

ファイルmysite/code/mysiteSiteConfigDecorator.php

class mysiteSiteConfigDecorator extends DataObjectDecorator {
    public function extraStatics() {
        return array(
            'has_one' =>array(
                'DefaultWidgets' => 'WidgetArea'
            ),
        );
    }
    public function updateCMSFields(FieldSet &$fields) {
        $fields->removeByName('Theme');
        $fields->addFieldToTab('Root', new Tab('DefaultWidgetsTab', _t('SiteConfig.DefaultWidgetsTab', 'Default Widgets for new Pages')));
        $fields->addFieldToTab("Root.DefaultWidgetsTab", new WidgetAreaEditor("DefaultWidgets"));
    }
}

ファイルmysite/_config.php

...

Object::add_extension('SiteConfig', 'mysiteSiteConfigDecorator');

...

ファイルmysite/code/Page.php

class Page extends SiteTree {
    public static $has_one = array(
        'Sidebar' => 'WidgetArea'
    );
    public function populateDefaults() {
        parent::populateDefaults();
        if ($this->Sidebar()) {
            $widgetArea = new WidgetArea();
            $widgetArea->write();
            $this->SidebarID = $widgetArea->ID;
        } else {
            $widgetArea = $this->Sidebar();
        }
        $siteConfig = SiteConfig::current_site_config();
        if ($siteConfig && $siteConfig->DefaultWidgets() && $siteConfig->DefaultWidgets()->Widgets()->exists()) {
            foreach ($siteConfig->DefaultWidgets()->Widgets() as $widget) {
                $widget->ID = 0;
                $widget->write();
                $widgetArea->Widgets()->add($widget);
            }
        }
    }
    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->addFieldToTab("Root.Content.Widgets", new WidgetAreaEditor("Sidebar"));
        return $fields;
    }
}

...

ただし、親からの対処はそれほど簡単ではありません。ただし、必要に応じて、現在のページにウィジェットがあるかどうかを確認することもできます。ない場合は、次のように親ウィジェットを表示します。

class Page extends SiteTree {
    ...
    public function SidebarForTemplate() {
        if ($this->Sidebar())
            return $this->Sidebar();
        elseif ($this->Parent())
            return $this->Parent()->SidebarForTemplate();
        return false;
    }
    ...
}

次に、テンプレートで$SidebarForTemplateを使用します

于 2012-09-22T12:54:53.307 に答える