Silverstripe中无法识别模板

时间:2017-01-23 01:55:50

标签: php templates model-view-controller silverstripe

我不知道我的老开发者是如何做到的,但他能够创建一些可在我的网站上运行的自定义模板。我正在尝试自己创建一个但是没有成功,而我的老开发人员似乎太忙了,无法告诉我该怎么做。

我有/ templates / Layout

中的模板

我的布局(InstitutionCoursesPage.ss)具有以下代码:

<% include HeaderBar %>
<div class="container">
<div class="row">
    $setHasLeft(true)
    <div class="$LeftCssClass">
        <% include SideNavigation %>
        <% loop $WidgetArea(LeftSideBar) %>
        $WidgetHolder
        <% end_loop %>
    </div>
    <div class="$CenterCssClass">
        <% include PageHeader %>
        <% if $Content %>
        <article class="content typography glass">
            $Content
    <div>abc</div>
        </article>
    <% loop $DisplayCourses %>
    <% end_loop %>
        <% end_if %>
        <% include InstitutionCoursesList %>
        $PageComments
    </div>
    <% include RightSideBar %>
</div>
</div>
<% include FooterBar %>

用于创建页面类型的PHP文件(InstitutionCoursesPage.php)存储在/ code / PageTypes中,其代码如下:

<?php

class InstitutionCoursesPage extends Page
{

}

class InstitutionCoursesPage_Controller extends Page_Controller
{

public function DisplayCourses()
{
    return Qualification::get();
}

}

/ templates / Includes中的文件名为:InstitutionCoursesList.ss

Pge Type工作但不是模板,我的开发人员创建的模板全部工作,并且与我制作的模板位于同一目录中。不知道为什么我的不工作。我试过冲洗但没有用。

3 个答案:

答案 0 :(得分:1)

我不确定你是否错误地粘贴了它,但你没有任何循环:

<% loop $DisplayCourses %>
<% end_loop %>

也许假设<% include InstitutionCoursesList %>进入那个循环?

答案 1 :(得分:1)

可以使用调试信息将所有模板的文件名插入到开发模式下的渲染输出中,请参阅2016年的StripeCon演讲:https://speakerdeck.com/wernerkrauss/debug-silverstripe-like-a-pro#27

基本上将它放在config.yml文件中并刷新:

---
Only:
  environment: 'dev'
---

SSViewer:
  source_file_comments: true

输出应该是这样的:

template comments in SilverStripe

这样您就可以看到您的模板是否被选中。另外,请确保您的班级名称或模板文件名中没有拼写错误。

  

注意:这会破坏输出纯模板化JSON的ajax调用

答案 2 :(得分:0)

好的,这里有很多可能出错的地方。

首先,如果有要显示的课程,似乎模板/控制器的那部分是可以的。另一件可能出错的事情是模板没有完全加载。因此,放置一些无论如何都会显示的文本(例如,在模板文件的顶部)。如果还可以的话,让我们看看你的模板,然后从html中删除它:

<% include HeaderBar %>
$setHasLeft(true)
<% include SideNavigation %>
<% loop $WidgetArea(LeftSideBar) %>
    $WidgetHolder
<% end_loop %>
<% include PageHeader %>
<% if $Content %>
    $Content
    <% loop $DisplayCourses %>
    <% end_loop %>
<% end_if %>
<% include InstitutionCoursesList %>
$PageComments
<% include RightSideBar %>
<% include FooterBar %> 

您可以看到展示课程的循环是有内容的条件。如果该字段为空,那么IF将不会满足,并且它将完全跳过显示您的课程。

这可能是问题吗?您只需向页面添加一些虚拟内容即可进行测试......

更新:这不是问题所在。现在,我也在与Silvertripe的模板系统进行斗争。有时它会选择正确的模板,有时则不会。在这种情况下,您希望系统按以下顺序查找模板:

  1. InstitutionCoursesPage_index.ss(因为,当没有定义时,它使用索引方法
  2. InstitutionCoursesPage.ss
  3. Page.ss
  4. 在你的情况下,它可能会选择page.ss.如果没有,你做错了什么,但这不属于这个问题的范围(可能是任何事情)。

    在这种情况下,我会通过在控制器中使用这段代码来手动强制使用模板:

        public function index() {
            //TODO: why is the normal template engine not picking it up?
            return $this->renderWith(
                array('InstitutionCoursesPage', 'Page'),
                array() //here you can add extra data that's then available to the template
            );
        }
    

    如果对模板系统有更多了解的人可以指出这个系统的复杂性,我会非常感激......