如何在Silverstripe 3中显示具有每页视图类型的子页面

时间:2016-03-14 03:48:03

标签: single-page-application silverstripe

我有一个单页应用,我可以通过

显示我的page.ss中的所有孩子
<% control children %>

然而,这只会通过page.ss输出为1个视图,我希望在单页应用程序设计中为每种页面类型使用单独的视图。

所以我的索引页面包含子页面中的所有内容,但我希望每个子页面都有自己的视图。

这是否可能在Silverstripe 3中,如果是这样,怎么样?

2 个答案:

答案 0 :(得分:1)

您可以使用DataObjects而不是页面,因为另一个答案表明(我的blocks-module无耻插件)。

如果你喜欢页面,那也是可能的。在模板方面需要一些技巧,但一旦设置就能很好地工作。

主页

首先,您需要一个页面入口点。这通常是主页。它需要一个单独的模板,因此我建议您为此创建一个特殊的HomePage类。

EG。

<?php
class HomePage extends Page
{
    // only allow one HomePage
    public function canCreate($member = null)
    {
        return parent::canCreate($member) 
            ? HomePage::get()->count() == 0
            : false;
    }
}

class HomePage_Controller extends Page_Controller
{

}

特殊模板

您的主页会将所有其他页面呈现为一个模板。我已经以页面使用不同模板呈现到单页面视图中的方式实现了这一点。在Page类中创建这样的方法:

/**
 * Get markup for single-page layout
 * @return HTMLText
 */
public function getHTML()
{
    return $this->renderWith(array('Flat' . $this->ClassName, 'FlatPage'));
}

此设置要求模板为您的类名,前缀为Flat。因此,如果您有GalleryPage课程,则会使用FlatGalleryPage模板。如果找不到该模板,它将回退到FlatPage。为清楚起见,您可以在单独的文件夹中创建所有这些模板。例如。

# Example folder structure
templates
  + SinglePage
      + FlatPage.ss
      + FlatGalleryPage.ss
      + …

通过此设置,您可以为单页输出和&#34;常规&#34;提供不同的模板。输出

结合前面的步骤

HomePage.ss模板中,您现在可以呈现如下所有网页:

<% loop $Menu(1) %>
    <section id="$URLSegment">
        $HTML
    </section>
<% end_loop %>

您的导航可能如下所示:

<nav class="main">
    <ul>
    <% loop $Menu(1) %>
        <li>
            <a href="#/$URLSegment" >$MainMenuTitle</a>
        </li>
    <% end_loop %>
    </ul>
</nav>

这将只添加基于锚点的导航以导航到不同的页面。你可以自由地用一些JavaScript来增添趣味。

警告和提示

单页视图中的表单很棘手,因为您通过单个控制器查看不同的页面。响应渲染也很困难。如果您需要在单页应用程序中使用表单,我建议您使用AJAX将用户保留在当前视图中。

如果要阻止直接访问子页面,可以使用将用户重定向到主页的数据扩展。例如:

<?php

/**
 * Redirect to the home-page whenever somebody tries to access this page
 */
class RedirectToHomeExtension extends DataExtension
{
    public function contentcontrollerInit($controller)
    {
        // Check if the current user isn't somebody with CMS access,
        // since this would mess with the CMS preview-pane.
        if (!(
            Permission::check('CMS_ACCESS_CMSMain', 'any') ||
            Permission::check('CMS_ACCESS_LeftAndMain', 'any')
        )){
            $controller->redirect(HomePage::get()->First()->Link(), 301);
        }
    }
}

然后像往常一样通过config:

应用它
GalleryPage:
  extensions:
    - RedirectToHomeExtension

答案 1 :(得分:0)

查看StripeCon EU website的代码 它适用于部分(实际上是页面)。这些部分是独立可见的,但在主页上,它是一个接一个。

我认为这就是你所追求的目标?