0

現時点では、Directorルールを使用してカスタムSilverstripeコントローラーを使用しています。

---
Name: myroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'category/$Action/$Slug': 'Category_Controller'

コントローラは次のようになります。

class Category_Controller extends Page_Controller {
    public function show($arguments) {
       echo "Slug: " . $arguments->param("Slug");
   }
}

ブラウザでURLhttp://mysite.com/category/show/mobileを開くと 出力は「Slug:mobile」のようになります。

フォルダ「themes/templates/Layout」のCategory.ssテンプレートを使用して出力をレンダリングするにはどうすればよいのでしょうか。そしてもちろん、Page.ssからのコンテナhtml(ヘッダー/フッター付き)も含める必要があります。レイアウトフォルダにカスタムページコントローラ/クラスと対応するテンプレートがある場合は、いつものように。

私はこれを試しました:

public function show($arguments) {
    echo $this->renderWith("Category");
}

出力のレンダリングにCategory.ssを使用しますが、コンテナーhtmlはありません...

助けてくれてありがとう。よろしく、フロリアン

4

1 に答える 1

3

配列をに渡すこともできrenderWith()、テンプレートが見つかるまで配列を試行します。

つまり$this->renderWith(array('Category', 'Page')); 、最初にと呼ばれるテンプレートを Category.ss検索しますが、(レイアウトフォルダーではなくテンプレートフォルダー内で)それを見つけられない場合、それを見つけPage.ssて使用するとします。$Layoutこれで内部にヒットPage.ssし、Layoutフォルダー内の配列を再度チェックします。これで、が見つかりますCategory.ss。これは、質問が正しければ、まさにあなたが探しているものです。

実行したくない場合は、実行return $this->renderWith();することもできますreturn $this;。silverstripeは、呼び出したアクションと$ thisのクラス階層を取得し、それを次の配列として使用します。renderWith()

したがって、クラスがCategory_Controller > Page_Controller > ContentController配列の場合、次のようになります。

array(
    'Category_show', // because your action is show
    'Category',
    'Page_show',
    'Page',
    'ContentController_show',
    'ContentController',
)

(Page_showとContentController_showも含まれているかどうかは100%わかりません。)

于 2012-08-27T13:32:13.620 に答える