【问题标题】:Silverstripe 3.2 re-usable blocksSilverstripe 3.2 可重复使用的积木
【发布时间】:2016-03-25 18:27:27
【问题描述】:

我创建了一个新的页面类型,它需要一些东西来分解内容。我创建了一个strapline 块,我想在页面上的3 个位置使用它,但是我只想创建一个版本的strapline 块并通过动态数据驱动该内容。

我在 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 开发人员的新手,我发现创建可重复使用的内容是一个艰难的过程。

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

<div class="strapline"> 
        <% loop Straplines %>
            $Content        
        <% end_loop%>
</div>

你可能猜到了,如果我把它放两次,它只会显示所有的标语。我想做类似的事情

<% include Strapline?id=1 %>

然后在 Strapline.ss 中对其进行解码并从那里开始。

编辑对不起是它的 3.2 不是 3.0。我认为它们非常相似。

【问题讨论】:

  • private static $db 听起来不像 Silverstripe 3.0,更像是 3.1 或 3.2。你用的是什么版本的SS?您能否显示更多 HomePage.php 代码和您要修改的包含模板?
  • 按要求进行了一些编辑@wmk

标签: php silverstripe


【解决方案1】:

就像 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 %>

代码未经测试,但应该可以工作;)

【讨论】:

    【解决方案2】:

    您可以在页面中创建一个函数,该函数将参数作为文字,并返回所需的strapline。例如

    <% $currentStrapline(1) %>
    

    和页面中的一个函数,

    public function currentStrapline($id) {
     // returns the wished strapline or null; 
    }
    

    【讨论】:

    • 感谢您的回答。我和另一个一起去了,因为我可以更好地了解正在发生的事情,而且我对 silverstripe 很陌生。
    【解决方案3】:

    是的,有一种方法可以对包含进行参数化,而且您几乎拥有它:

    <% include Strapline MyVar=$someVar, MyVar2=$someVar2 %>
    

    然后在Strapline.ss:

    <% if $MyVar == 1 %>
    Say One
    <% else_if $MyVar2 == 2 %>
    Say Two
    <% end_if %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多