Silverstripe 3.2 可重用块
Silverstripe 3.2 re-usable blocks
我创建了一个新的页面类型,需要一些东西来分解内容。我创建了一个标语块,我想在页面的 3 个位置使用它,但是我只想创建一个版本的标语块并通过动态数据驱动该内容。
我在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。我以为他们很相似。
您可以在页面中创建一个函数,它将参数作为文字,并 returns 希望的标语。例如
<% $currentStrapline(1) %>
和页面中的一个函数,
public function currentStrapline($id) {
// returns the wished strapline or null;
}
就像 Firesphere 提到的那样,您可以创建一个可以在模板中调用的函数并将对象 ID 传递给它。
将此功能放在您的 Page_Controller class 中,或者如果您只想从主页访问它,请将它放在您的主页中Page_Controller class。
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 %>
代码未经测试,但应该可以工作;)
是的,有一种方法可以对 include 进行参数化,您几乎已经掌握了它:
<% include Strapline MyVar=$someVar, MyVar2=$someVar2 %>
然后在 Strapline.ss
:
<% if $MyVar == 1 %>
Say One
<% else_if $MyVar2 == 2 %>
Say Two
<% end_if %>
我创建了一个新的页面类型,需要一些东西来分解内容。我创建了一个标语块,我想在页面的 3 个位置使用它,但是我只想创建一个版本的标语块并通过动态数据驱动该内容。
我在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。我以为他们很相似。
您可以在页面中创建一个函数,它将参数作为文字,并 returns 希望的标语。例如
<% $currentStrapline(1) %>
和页面中的一个函数,
public function currentStrapline($id) {
// returns the wished strapline or null;
}
就像 Firesphere 提到的那样,您可以创建一个可以在模板中调用的函数并将对象 ID 传递给它。
将此功能放在您的 Page_Controller class 中,或者如果您只想从主页访问它,请将它放在您的主页中Page_Controller class。
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 %>
代码未经测试,但应该可以工作;)
是的,有一种方法可以对 include 进行参数化,您几乎已经掌握了它:
<% include Strapline MyVar=$someVar, MyVar2=$someVar2 %>
然后在 Strapline.ss
:
<% if $MyVar == 1 %>
Say One
<% else_if $MyVar2 == 2 %>
Say Two
<% end_if %>