【问题标题】:Template not being recognized in SilverstripeSilverstripe 中无法识别模板
【发布时间】:2017-01-23 01:55:50
【问题描述】:

我不知道我的老开发人员是如何做到的,但他能够创建几个可在我的网站上使用的自定义模板。我正在尝试自己创建一个,但没有成功,而且我的老开发人员似乎太忙了,无法向我展示如何去做。

我在 /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 类型有效,但模板无效,我的开发人员创建的模板全部有效,并且与我制作的模板位于同一目录中。不知道为什么我的不工作。我试过冲洗,但无济于事。

【问题讨论】:

    标签: php templates model-view-controller silverstripe


    【解决方案1】:

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

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

    ---
    Only:
      environment: 'dev'
    ---
    
    SSViewer:
      source_file_comments: true
    

    然后输出应该是这样的:

    这样您就可以查看您的模板是否被选中。还要确保你的类名或模板文件名没有拼写错误。

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

    【讨论】:

      【解决方案2】:

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

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

      也许&lt;% include InstitutionCoursesList %&gt; 应该进入那个循环?

      【讨论】:

      • 即使我把东西放在那里,它也无法识别。我尝试在文件中添加一些 html,然后进行了刷新,但它没有出现在页面的源代码中。不确定为什么文件本身无法识别。
      【解决方案3】:

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

      首先,假设有课程要展示,模板/控制器的那部分似乎是可以的。另一件可能出错的事情是模板没有完全加载。所以放置一些无论如何都会显示的文本(例如在模板文件的顶部)。如果没问题,让我们看一下您的模板,然后将其从 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

      在您的情况下,它可能会选择 page.ss。如果不是,那么您做错了其他事情,但这超出了这个问题的范围(那么可能是任何事情)。

      在这种情况下,我会通过在您的控制器中使用以下代码 sn-p 来手动强制使用模板:

          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
              );
          }
      

      如果对模板系统有更多了解的人能指出这个系统的复杂之处,我将非常感激......

      【讨论】:

      • 我做了一个小测试。您在我的代码中看到“
        ”吗?它也出现在源代码中。我在类列表中添加了“玻璃”,使其成为“内容排版玻璃”。刷新页面应该在源代码中显示玻璃,但它没有。因此,无论 Courses 是否有效,它甚至都不会读取文件(之所以会这样做,是因为我在主页上有一个显示课程列表的下拉菜单)。
      • 它仍在 if 中,但是还好,模板似乎没有加载。现在我们在模板继承国,这对我来说也有点模糊。我会更新我的答案
      猜你喜欢
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多