SilverStripe 3:循环中模板中的替代值

时间:2013-02-26 20:06:06

标签: silverstripe

我正在尝试创建一个页面,显示持有者子页面中的最新图像。 每行将在以下示例之间交替:

大图片|小图片

小图片|大图

大图片|小图片

依旧......

template.ss

<div class="row">
<div class="span8">  
  LARGE IMAGE
</div>  
<div class="span4"> 
  SMALL IMAGE
</div>
</div> 
<div class="row">
<div class="span4"> 
  Small Image
</div>  
<div class="span8"> 
 Large IMage
</div> 
</div>  
</div> 
<div class="row">
<div class="span8">  
 Large Image
</div> 
<div class="span4">  
 Small Image
</div> 
</div> 

如何在模板文件中处理?

我尝试编写自定义函数来处理Holder Controller中的最新图像

Controller.php这样

$works = WorkPage::get();

这只返回图片ID,我尝试了左连接,但没有返回文件路径。

$works = WorkPage::get()->leftJoin("File", "\"File\".\"ID\" = \"WorkPage\".\"FeaturedImageID\"");

4 个答案:

答案 0 :(得分:0)

File::get()->
    leftJoin("SiteTree", "\"SiteTree\".\"ParentID\" = ".$this->ID)->
    leftJoin("WorkPage", "\"WorkPage\".\"ID\" = \"SiteTree\".\"ID\"")->
    where("\"File\".\"ID\" = \"WorkPage\".\"FeaturedImageID\"");

可能是您所追求的SQL查询(尽管未经测试)

答案 1 :(得分:0)

这就是我的方式,不确定它是否是最好的方式,但它有效。

$works = WorkPage::get();

foreach ($works as $work) {
  //Build the IMage Object so we can add it to the Work Object
  $ImageObj = File::get()->byID($work->FeaturedImageID);
  $Image->ID = $ImageObj->ID;
  $Image->Title = $ImageObj->Title;
  $Image->Name = $ImageObj->Name;
  $Image->Filename = $ImageObj->Filename;
  $work->ImageObj = $Image;

  $ImagePath = $work->ImageObj->Filename;

}

答案 2 :(得分:0)

您的问题并非100%明确。我不确定你是否遇到模板循环和条件问题,或者从WorkPage获取图像对象,所以我会试着回答它们。

要创建交替布局,最简单的方法是根据循环计数是奇数还是偶数来使用条件。一个快速未经测试的例子:

<% loop $Works %>
<div class="row">
    <% if $Odd %>
    <div class="span8">LARGE IMAGE</div>  
    <div class="span4">SMALL IMAGE</div>
    <% else %>
    <div class="span4">SMALL IMAGE</div>  
    <div class="span8">LARGE IMAGE</div>
    <% end_if %>
</div>    
<% end_loop %>

文档参考位于http://docs.silverstripe.org/framework/en/reference/templates#position-indicators

要在循环中获取不同大小的图像,只需使用$FeaturedImage->CroppedImage(xxx,xxx)即可。这假设你每行都有'工作'并且每件作品有两张图片,但正如我所说的那样问题不是那么清楚,所以如果我的假设不正确,你需要提供更多关于你的模型和你正在尝试的内容的信息。实现。

答案 3 :(得分:0)

只是评论您测试的加入:

这不会起作用: $ works = WorkPage :: get() - &gt; leftJoin(“File”,“\”File \“。\”ID \“= \”WorkPage \“。\”FeaturedImageID \“”);

该连接不会获取连接表的数据;本质上,你是请求工作页面对象,没有那个作为数据。如果您已经完成了加入,那么您将能够获得您之后的信息

无论如何,正如Columba所提到的那样,你可以通过调用字段来正确地获得关系,因为“一个函数”有一个并且有很多,例如$ this-&gt; hasmanyrelation()&lt;返回datalist(是ss3 :)的coorect term)。在tempate上使用$ hasmanyrelation关系时,它只是神奇地获得了集合。

此外,您应该使用Link()来获取oppinnion中文件的路径,因为它也适用于sitetree对象。