Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Silverstripe 3.2可重用块_Php_Silverstripe - Fatal编程技术网

Php Silverstripe 3.2可重用块

Php Silverstripe 3.2可重用块,php,silverstripe,Php,Silverstripe,我创建了一个新的页面类型,需要一些东西来分解内容。我已经创建了一个strapline块,我想在页面上的3个位置使用它,但是我只想创建strapline块的1个版本,并通过动态数据驱动该内容 我在Straplines.php中有以下内容 class Straplines extends DataObject{ private static $db = array( 'Title'=>'Text', 'Content'=>'HTMLText',

我创建了一个新的页面类型,需要一些东西来分解内容。我已经创建了一个strapline块,我想在页面上的3个位置使用它,但是我只想创建strapline块的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中找到每一个单独的内容。当然,参数化include还是不必创建多个模板都是有必要的。我对Silverstripe开发非常陌生,我发现创建可重用内容是一个艰难的过程

编辑:这是strapline.ss模板,用于处理显示

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

$Content
正如你可能猜到的,如果我把这个放两次,它只会显示所有的带子。我想做一些像

<% include Strapline?id=1 %>

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


编辑抱歉是3.2而不是3.0。我假设它们非常相似。

您可以在page中创建一个函数,该函数将参数作为文本,并返回所需的strapline。e、 g

<% $currentStrapline(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 %>
在你的模板中

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

$Title、$Content、$WhatEver或Include
找不到具有此名称的束带

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

是的,有一种方法可以将include参数化,而您几乎做到了:

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

private static$db
听起来绝对不像Silverstripe 3.0,更像是3.1或3.2。你使用的是什么版本的SS?你能展示更多的HomePage.php代码和你想要修改的include模板吗?根据@wmkThanks的要求做了一些编辑以获得你的答案。我选择了另一个,因为我可以更准确地了解正在发生的事情,而且我对silverstripe非常陌生。
<% 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 %>
<% include Strapline MyVar=$someVar, MyVar2=$someVar2 %>
<% if $MyVar == 1 %>
Say One
<% else_if $MyVar2 == 2 %>
Say Two
<% end_if %>