Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We're retiring the forums!

The SilverStripe forums have passed their heyday. They'll stick around, but will be read only. We'd encourage you to get involved in the community via the following channels instead:

Template Questions /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

If function for images in ss template not working

Go to End

5 Posts   2017 Views

Samba Sam

Community Member, 85 Posts

13 November 2009 at 5:31pm

Edited: 13/11/2009 5:35pm

I am trying to get the function ImagesR, which checks for occurrence of any one of three images, to work.

This is what I have in the ss template:

<% if ImagesR %>
<img width="$ImageWidthR" src="<% control ImageR.SetWidth(280) %>$URL<% end_control %>" alt="$AltTextR" title="$TitleTextR" />
<img width="$ImageWidthR" src="<% control ImageR2.SetWidth(280) %>$URL<% end_control %>" alt="$AltTextR2" title="$TitleTextR2" />
<img width="$ImageWidthR" src="<% control ImageR3.SetWidth(280) %>$URL<% end_control %>" alt="$AltTextR3" title="$TitleTextR3" />
<div class="caption"><p><i>$CaptionR</i></p></div><% end_if %>
<% end_if %>

This is what I have in Page.php
class Page_Controller extends ContentController {
function ImagesR() {
return ($this->ImageR || $this->ImageR2 || $this->ImageR3 );

It doesn't work. It works if I pass non-image arrays (e.g., $this->CaptionR), but not apparently with images.

Is there a trick for creating an OR function for images (e.g., class Page_Photo extends Image)?

I don't get it?



Forum Moderator, 5523 Posts

13 November 2009 at 9:30pm

I am assuming this is because an Image is a relation. So you need to check that the image object exists.

return ($this->Image1() .... 

// or the more verbose way..

return (($this->Image1ID && $this->Image1()->exists() || ......


Community Member, 203 Posts

14 November 2009 at 12:48am

I tested this and to my amazement this worked: I did create an Image2 in my template, but how should I know that this also includes the creation of an Image2ID? Image2()->ID I can understand. Or should I know this - and is this just me being a N00b?

For the record: I compared what the Image2() returns with or without an Image, and noticed that for instance a Title was present when there actually was an Image2 on a page. Testing for Image2()->Title should therefor enough of an indication that there is an image. (Of course this could change in future releases.)

Therefor I tested with just $this->Image2()->ID and with just Image2()->exists(), and they both give me the right result. Why the double testing? (I would prefer the Image2()->exists())

Samba Sam

Community Member, 85 Posts

14 November 2009 at 3:48am

Edited: 14/11/2009 3:54am

Thanks guys!
Big help.

So I experimented with the ways suggested so far:

1. return ($this->ImageR() || $this->ImageR2() || $this->ImageR3());

2. return (($this->ImageRID && $this->ImageR()->exists()) || ($this->ImageR2ID && $this->ImageR2()->exists()) || ($this->ImageR3ID && $this->ImageR3()->exists()));

3. return ($this->ImageR()->exists() || $this->ImageR2()->exists() || $this->ImageR3()->exists());

Interestingly versions 2 and 3 worked fine. But version 1 didn't. It was returning a false true on the second image. For example, to test it, I attached only the third image to a page (ImageR3), and removed it from the function: So it was just "return ($this->ImageR() || $this->ImageR2());". Yet the function was still passing true? The image appeared on the page. I then removed $this->ImageR2() from the function as well, so that it was just returning $this->ImageR(). Only then did the ImageR3 on the page not appear.
The short of it is, I am sticking with the 2nd and 3rd options for now.

Thanks again,


Community Member, 203 Posts

14 November 2009 at 4:48am

return print_r(ImageR()) always returns something, but only when there is an image in it, it returns data about the image. So you have to check if the image exists.