当前位置:  开发笔记 > 编程语言 > 正文

Silverstripe 3.2可重复使用的块

如何解决《Silverstripe3.2可重复使用的块》经验,为你挑选了1个好方法。

我创建了一个新的页面类型,需要分解内容.我创建了一个我想在页面上的3个位置使用的带状块,但是我想创建仅1个版本的带状块并通过动态数据驱动该内容.

我在Straplines.php中有以下内容

class Straplines extends DataObject{
    private static $db = array(
        'Title'=>'Text',
        'Content'=>'HTMLText',
        'SortOrder'=>'Int'
    );
    private static $has_one = array(
        'Parent'=>'Page'
    );

    private static $default_sort = 'SortOrder';

    public function getCMSFields(){
            $fields = parent::getCMSFields();
            $fields->addFieldToTab("Root.Main", new HtmlEditorField('Content','Content'));
            $fields->addFieldToTab("Root.Main", new TextField('Title','Title'));
            return $fields;
    }
}

然后我将cms字段添加到HomePage.php.我可以添加表带没有问题,他们都出现了.然后在HomePage.ss我有以下内容

<% include PricesBlock %>
<% include TourStraplineBlock %>
<% include QuickFacts %>
<% include TourStraplineBlock %>

但是后来我无法在TourStraplineBlock中弄清楚为每个内容获取单独的内容.当然必须有参数化包含或不必创建多个模板.我对Silverstripe dev很新,并且发现创建可重用内容是一个艰难的过程.

编辑:这是处理显示的strapline.ss模板.

<% loop Straplines %> $Content <% end_loop%>

正如你可能猜到的那样,如果我把它放在两次,它只是显示所有的标语.我想做点什么

<% include Strapline?id=1 %>

然后在Strapline.ss中解码并从那里开始.

编辑抱歉是的3.2不是3.0.我以为它们非常相似.



1> csy_dot_io..:

就像Firesphere提到的那样,您可以创建一个可以在模板中调用的函数,并将对象ID传递给它.

将此函数放在Page_Controller类中,或者只想从主页访问它,而不是将它放在HomePage_Controller类中.

public function StraplineByID($id) {
  $strapline = Straplines::get()->byID($id);
  if($strapline) {
    return $strapline;
  }
}

在您的模板中,您现在可以使用:

<% if $StraplineByID(1) %>
  <% with $StraplineByID(1) %>
    $Title, $Content, $WhatEver or an include
  <% else %>
    Can't find a strapline with this ID
  <% end_with %>
<% end_if %>

如果你想通过id而不是名字识别表带(这将更加用户友好)你应该创建一个名为"Name"的新字段或类似的东西,并使用它来代替id.但请注意,"名称"字段中的值应该是唯一的

public function StraplineByName($name) {
  $strapline = Straplines::get()->find('Name', $name);
  if($strapline) {
    return $strapline;
  }
}

并在您的模板中

<% if $StraplineByName(prices) %>
  <% with $StraplineByName(prices) %>
    $Title, $Content, $WhatEver or an Include
  <% else %>
    Can't find a strapline with this Name
  <% end_with %>
<% end_if %>

代码未经测试但它应该工作;)

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有