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've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Template Questions /

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

Using GD resize() on Image objects in a page controller


Go to End


2 Posts   3675 Views

Avatar
david_nash

Community Member, 55 Posts

18 March 2009 at 6:33pm

I'm writing a function that selects an image at random and returns an image tag. I'd like to scale that image, but I can't work out how.

class HomePage_Controller extends Page_Controller {
...

  function RandomImage() {
    $galleryItem = DataObject::get_one('GalleryItem', 'MyHomePageID != 0', false, 'RAND()');
    $g = DataObject::get_by_id("GalleryItem_ProductImage", $galleryItem->GalleryItemImageID);

    //somehow scale $g here

    return "<img src=\"$g->Filename\" alt=\"$galleryItem->GalleryItemTitle\" />";	
  }

...
}

As I understand it, my get_by_id() call should be returning an Image (GalleryItem_ProductImage extends Image) which means that I should be able to use GD functions on it.

But if I create a new GD object and use resize() it, how do I then get the filename for the src attribute?

Avatar
david_nash

Community Member, 55 Posts

19 March 2009 at 1:28pm

Edited: 19/03/2009 1:30pm

Here's the workaround that I used. In mysite/code/HomePage.php.

I now have:

function RandomImage() {
	return DataObject::get_one('GalleryItem', 'MyHomePageID != 0', false, 'RAND()');
}

In my template I just wanted to have $RandomImage, which would output an <img scr="blah.jpg" alt="blah"> tag.

Instead I do this in the template:

<% if ClassName = HomePage %>
	<% control RandomImage %>
		<img src="$GalleryItemImage.Scaled.URL" alt="$GalleryItemTitle" class="Logo{$LightLogo}" >
	<% end_control %>
<% end_if %>

RandomImage() returns at GalleryItem, and I used RandomImage to "iterate" through the set of one GalleryItem.

In mysite/code/GalleryItem.php, after the GalleryItem model class I have:

class GalleryItem_ProductImage extends Image {

	function generateScaled($gd) {
		return $gd->resize(552, 561);
	}

} //end class

I'm not really sure why but this allows me to use "$GalleryItemImage.Scaled" in the template. SS chops off the 'generate' part of 'generateScaled' and 'Scaled' returns a GD object, which for some reason I don't understand I can then access its URL property.

I hope this helps someone, and I hope someone else can explain to me the things I don't understand :-)

(ps wow, tabs work in "code" blocks!)