【问题标题】:Silverstripe Template IssueSilverstripe 模板问题
【发布时间】:2014-02-17 11:22:58
【问题描述】:

我正在掌握 Silverstripe 框架,但遇到了一个奇怪的错误。

例如,我想创建一个新的“会员”页面。在 mysite/code 中,我设置了一个如下的 members.php 页面:

class Membership extends Page {

}

class Membership_Controller extends Page_Controller {

}

然后我在我的模板/布局文件夹中创建了一个 members.ss 文件,其中包含一些测试输出。然后我进行开发构建并在“会员”类型的 CMS 中创建一个页面。在前端,如果我单击导航栏成员的新页面,我看不到测试文本,所以似乎没有阅读模板?

有什么想法吗?

谢谢。

艾伦。

【问题讨论】:

  • 快速检查,您的根模板文件夹中的Page.ss 中有$Layout 吗?请参阅下面的@Zauberfisch 答案以进行调试...
  • @colymba 是的,我的 page.ss 中有 $layout

标签: templates content-management-system silverstripe


【解决方案1】:

关于模板有几个常见的陷阱:

  • 在过去的版本中,刷新的工作方式已经改变了好几次。
    我不会在这里解释细节,因为这些可能很快就会再次发生变化。
    但是,当前版本 (3.1) 中有两件事与此相关:

    1. /dev/build 根本不刷新
    2. /dev/build?flush=1 仅刷新清单和配置(无模板)

    (开发构建不使用模板,因此没有刷新模板)
    这意味着您必须在普通页面上执行 ?flush=1不仅仅是dev/build

  • 模板文件的名称必须与类完全相同(我认为它区分大小写)
  • 检查模板文件没有被另一个位置的另一个模板文件覆盖。 (例如,如果您有 moduleName/templates/Foo.ss 和 Themes/simple/templates/Foo.ss 则主题的模板将覆盖模块模板
  • 确保模板不为空(这会导致 SilverStripe 出现错误,至少在 3.1 版中)
  • 控制器上的操作可以覆盖模板使用。这里有一些例子:

    // this will not use a template at all, it will just print "some string"
    public function index() { return "some string"; } 
    
    // this will not use a template at all, it will output an empty string
    public function index() { return; } 
    
    // this will use template named "Bar.ss"
    public function index() { return $this->renderWith(array('Bar')); } 
    

SilverStripe 还提供了一个调试选项来查看使用了哪些模板。 您可以通过 2 种方式激活它:

  1. 在你的 yml 配置中设置 source_file_comments

    SSViewer:
      # display template filenames as comments in the html output
      source_file_comments: true
    
  2. 使用“URL Variable Tools”:查看您的网站时只需添加 ?showtemplate=1

启用后,查看页面的 HTML 源代码(在 firefox 中为 CTRL+u)
silverstripe 会添加 cmets 让你知道使用了哪些模板。

【讨论】:

  • @Zauberfisach - 感谢您的回复。我已经运行了一些测试并创建了一个带有荒谬文件名的页面类型以避免任何冲突,然后我创建了相应的 .ss 文件,无论我做什么我都无法读取模板文件,我已经失败了重建和冲洗。我已经设置了一个本地测试以尝试复制该问题,我已经复制了 index.php、2 个 page.ss 文件以及我的 newpage.php 和 newpage.ss 文件,但无法复制该问题。除了一个一个拉我的文件并重建不知道如何继续。
  • 这方面有什么进展吗?
  • 不,我还在用头撞墙。我将整个站点复制到本地服务器,问题消失了,开发服务器上的文件相同,我无法添加新模板。这向我表明这是一个文件权限错误,但我已经检查了所有内容并且存在完整权限。
  • 是的,听起来像是 tmp / cache 文件夹的问题。尝试在服务器的 Web 根目录中创建一个名为“silverstripe-cache”的新文件夹。
【解决方案2】:

确保您的类具有正确声明和命名的 Page_Controller 扩展名。我最近遇到了这个问题。页面控制器扩展有错字,因此没有使用模板文件。

例如,如果您的页面类是 RidiculouslyNamedPage

class RidiculouslyNamedPage extends Page {

}

class RidiculouslyNamedPage_Controller extends Page_Controller {

}

然后在您的themes/[theme-name]/templates/Layout/ 文件夹中,您将拥有您的RidiculouslyNamedPage.ss

如果你拼错了RidiculouslyNamedPage_Controller,模板将不会被调用。

【讨论】:

  • 谢谢,我仔细检查了所有内容,没有错别字。如上所述,如果将站点移动到我的本地服务器,则选择模板,在我的开发服务器上存在问题!
【解决方案3】:

我找到了问题的答案。

我的 .php 缺少以下内容:

function getInfo() {
return $this->renderWith('Media');
}

否则,将不会使用 Media.ss 文件!希望这将帮助其他可能正在掌握 SS 的人!

【讨论】:

  • -1 因为这个答案与问题完全无关。你的问题从来没有说你想用Media.ss 渲染当前对象,也没有说你想在一个动作上完成它。请更新答案以解释这一点或接受我的答案,其中已经包含renderWith() 的示例
  • @Alan - 你的班级是Media吗?如果是这样,您不必致电renderWith()。如果不是,您的问题没有正确描述这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多