SAImageDisplayer is a Yii Widget providing a better display of images in the views.
##Description This extension resizes images and thumbnail only when they are called and if resized image or his thumbnail not exists. This means that you can upload images without take care of dimensions.
This extension is based on justintimeimageresizer extension adding some improvements :
- We can Specify an unlimited number of sizes, we are no more limited to "Big" or "Thumbs"
- We can specify a default image to display if the original image doesn't exists
- we can specify some groups: if we don't want to mix multiple type of image, by specifying the type it will store each image type in a separate folder
- Add the possiblity to define the class, id and style in image tag
- We can define where we would like to store the images (inside the webroot folder)
- We can choose the name of the folder storing the originals images
- If the folder that should contain the resized image doesn't exist then the widget try to create it before throwing an error
- Since V1.1: We can display the original file (with the original size)
- Since V1.2: We can generate the newly sized image whitout displaying it on the screen
(For others updates see below)
##Requirements
- Yii 1.1 or above
- PHP 5.3
- image (yii extension)
##Installation
To install this extension it's really easy, all you have to do is extract the SAImageDisplayer.php
file in your ``extension` folder!
In this part we are going to configure the extension. This part is optional but I encourage you to do it because later you won't have to put all the variables defined in the config in each of your call to the widget!
There are some params that won't change from one call to the widget to another. This is why I encourage you to use the ability that yii offers to globally configure some widgets option!
To do it edit your configuration main file (in general config/main.php
) and add the following code:
return array(
...
'components'=>array(
'widgetFactory'=>array(
'widgets'=>array(
...
'SAImageDisplayer'=>array(
'theOption'=>theValue,
'otherOption'=>otherValue,
),
),
),
),
);
The options that I encourage you to put in this configuration are:
- The path to the dir that will contain originals and resized folders. The root of this param will be
webroot
. Default toimages
:
'baseDir' => 'images',
- The name of the folder holding the originals images. default to
originals
:
'originalFolderName' => 'originals',
- The different available sizes for the plugin (when you are not using
groups
):
'sizes' =>array(
'nameOfTheSize' => array('width' => width, 'height' => height),
),
- The groups and the sizes going with it :
'groups' => array(
'nameOfTheGroup' => array(
'nameOfTheSize' => array('width' => width, 'height' => height),
),
),
The following example:
'sizes' =>array(
'tiny' => array('width' => 40, 'height' => 30),
'big' => array('width' => 640, 'height' => 480),
'thumb' => array('width' => 400, 'height' => 300),
),
will give the following structure (if images
is defined as baseDir
and originals
as originalFolderName
):
images/
big/
originals/
thumb/
tiny/
The following example:
'groups' => array(
'news' => array(
'tiny' => array('width' => 40, 'height' => 30),
'big' => array('width' => 640, 'height' => 480),
),
'reviews' => array(
'thumb' => array('width' => 400, 'height' => 300),
),
),
will give the following structure (if images
is defined as baseDir
and originals
as originalFolderName
):
images/
news/
big/
originals/
tiny/
reviews/
originals/
thumb/
Here is a complete configuration example that you could use:
return array(
...
'components'=>array(
'widgetFactory'=>array(
'widgets'=>array(
...
'SAImageDisplayer'=>array(
'baseDir' => 'images',
'originalFolderName'=> 'originals',
'sizes' =>array(
'tiny' => array('width' => 40, 'height' => 30),
'big' => array('width' => 640, 'height' => 480),
'thumb' => array('width' => 400, 'height' => 300),
),
'groups' => array(
'news' => array(
'tiny' => array('width' => 40, 'height' => 30),
'big' => array('width' => 640, 'height' => 480),
),
'reviews' => array(
'thumb' => array('width' => 400, 'height' => 300),
),
),
),
),
),
),
);
For the usage, I'll assume that you have followed the configuration step above. If not, each params defined before need to be put in each widget call in your views.
All the originals images have to be in the folder defined by originalFolderName
. If you are using the option group
then the original image has to be in the folder groupName/originalFolderName
To simply display an image with a given size here is the syntax:
<?php $this->widget('ext.SAImageDisplayer', array(
'image' => 'yourImage.png',
'size' => 'thumb',
)); ?>
Now you can simply add a title to the image:
<?php $this->widget('ext.SAImageDisplayer', array(
'image' => 'yourImage.png',
'size' => 'thumb',
'title' => 'My super title',
)); ?>
This way you can set:
- The title by using the param
title
- The alternative text by setting the param
alt
- The class using
class
- The id =>
id
- The style =>
style
If you want to display the original file with its original size (for a gallery for example) you can do it by not setting size
or setting it to original
:
<?php $this->widget('ext.SAImageDisplayer', array(
'image' => 'yourImage.png',
)); ?>
Not sure your image really exists? No need to check it, the plugin do it for you and allow you to define a default image!
This image as to be in your original folder and will be resized to match the size
you set.
<?php $this->widget('ext.SAImageDisplayer', array(
'image' => 'yourImage.png',
'size' => 'thumb',
'defaultImage' => 'default.png',
)); ?>
Let's say you have some images representing the news on your site and some others the reviews. You don't want to mix them because after it's a mess to now what image belongs to what type. I agree with you, everything need to be clean!
This is why you can declare a group for each image you are displaying! The plugin will work in the folder corresponding to the group name.
So to display a new image I'll use:
<?php $this->widget('ext.SAImageDisplayer', array(
'image' => 'yourImage.png',
'size' => 'thumb',
'defaultImage' => 'default.png',
'group' => 'news',
)); ?>
And for a review:
<?php $this->widget('ext.SAImageDisplayer', array(
'image' => 'yourImage.png',
'size' => 'thumb',
'defaultImage' => 'default.png',
'group' => 'reviews',
)); ?>
And in your image folder you'll have something clean like:
images/
news/
big/
originals/
thumb/
reviews/
originals/
thumb/
Be careful, since you are using the option group
, the original and the default images have to be in the folder groupName/originalFolderName
!
Of course we can use group
and size
for some images and just specify size
for others!
This way you'll endup with a structure looking like:
images/
big/
originals/
news/
big/
originals/
tiny/
reviews/
originals/
thumb/
thumb/
tiny/
Since v1.2 we can generate a new image size whitout displaying the image on the screen!
All we have to do is set the option displayImage
to false in the widget. All the other operations will be performed except displaying the image tag.
<?php $this->widget('ext.SAImageDisplayer', array(
'image' => 'yourImage.png',
'size' => 'thumb',
'defaultImage' => 'default.png',
'displayImage' => false,
)); ?>
image
: Name of the image to display (with the extension)size
: Name of the size to display. The size has to be declared insizes
orgroups
if the optiongroup
is useddefaultImage
: Name of the default image to display ifimage
doesn't existsizes
: Array containing all the possible sizes than can be called whengroup
is not defined. The array has to be with the following structure:
'sizes' =>array(
'nameOfTheSize' => array('width' => width, 'height' => height),
),
groups
: Array containing all the groups and the associated sizes that the widget may use. The array has to be with the following structure:
'groups' => array(
'nameOfTheGroup' => array(
'nameOfTheSize' => array('width' => width, 'height' => height),
),
),
baseDir
: The path to the dir that will contain originals and resized folders. The root of this param will bewebroot
. Default toimages
originalFolderName
: The name of the folder holding the originals images. default tooriginals
title
: Title of the image tagalt
: Alternative name of the imagestyle
: Style of the image tagid
: Id of the image tagclass
: Class of the image taggroup
: Name of the group the image belongs todisplayImage
: Whether or not we should display the image on the screen. Default to true.resizeMode
: How images should be resized by the image extension. Available options areSAImageDisplayer::NONE
,SAImageDisplayer::AUTO
,SAImageDisplayer::HEIGHT
,SAImageDisplayer::WIDTH
. Default toAUTO
.othersAttributes
: An arrayarray('attributeName' => 'value')
keeping all the additional attribute we wish to add to the image tag.
Don't hesitate to ask for help or tell me any issues you could meet while using the plugin! If you see some typo errors in this extension page please tell me, English is not my mother tongue so there might have plenty of them.
Feel free to provide some ideas of improvment and if you provide some pull request on github I'll most definitely examinate your code and add it to the widget if I think it adds something!
##Updates
- 1.1: Add the ability to display the image with its original size
- 1.2: Add the ability to not display the generated image (it will only resize the original one in the right folder)
- 1.3: Add the base url to the image path when displaying it
- 1.4: Adding "width" and "height" tags to the generated image since it's a good practice: PageSpeed best practices
- 1.5 Now Image extension can use ImageMagick or GD library to resize images. (Before it was only GD no matter what was the user configuration).
- 1.6: Add the ability to choose which resize mode to use (NONE, AUTO, WIDTH, HEIGHT), add the ability to add other attributes to the image tag.
- 1.7 Thanks to Oreolek the exceptions are now handled internally if not in debug mode.