Website Development

Canadian Payment Gateways, Merchant Accounts and other ways to get paid in Canadian dollars (CAD)

When choosing how to accept payments online in Canadian dollars you have many options to choose from. Most of these solutions can integrate with Drupal and Übercart.

We at Kafei Interactive have supported Canadian dollar gateways including PayPal, Moneris, TD Merchant Services (Beanstream) and US-dollar gateways that connect to and Skipjack. We have also assisted organizations fine-tune their servers to meet their PCI obligations.

Canadian Payment Gateways

These solutions are all ones where your website must be configured to securely accept payments online. You accept the credit card on one of your site pages so the client never leaves. A payment gateway is most useful when you are doing more than $5000 in monthly sales.

If you already have a merchant account with any of these providers you're already half way there.

  • Moneris (Royal Bank & Bank of Montreal)
  • Paymentech (Scotiabank & National Bank)
  • Global Payments (CIBC and CITI Corp.)
  • TD Merchant Services (combination of TD and First Data)
  • Desjardins


Some of these accept low risk and others accept high-risk accounts. High risk stuff includes web hosting and anything related to adult services. InternetSecure resells for Paymentech if that is what you are looking for.

Interac Online

This is a new "pay page" service that is offered with some payment gateways listed above. Basically the bank has to allow their web banking interface to be used as a pay-page. So you get redirected to your own bank or credit union to pay then kicked back to the site at the end of the payment process. No confidential data is revealed to the merchant using this system.

It takes a week or more to get your money if you use Interac Online according to one provider. They initiate a transfer from the source bank, wait two days, then hold the money a week(?! not sure why this is necessary), then two more days for the transfer. I'm sure what they probably meant to say was that it takes about a week in total.

Using Canadian Dollar Payment Services

Here is where things get interesting.

For processing less than $5000 in monthly sales. Not advisable for non-profits and some others because sometimes PayPal withholds your money, for up to 6 months! Usually it takes about two days (as with most services listed on this page).

There are no Drupal modules for Interac Email Money Transfers because people need to add you as a payee in their web banking using your email address as the "target account". Configuration varies by bank or credit union. If a client were to ask for this in Übercart I would recommend making it like a Cash/Cheque option where you acknowledge payment after.

  • PayPal - can be used as a gateway and/or pay page in Canadian dollars
  • Interac Email Money Transfer - payee must add your email address as a recipient transfers complete in about 4h!
  • Hyperwallet - allows you to transfer between any Canadian accounts

Cheques and Cash On Delivery

Sounds absurd but it is more common than you think. Many small businesses make deliveries and bring the product direct to the consumer. In these cases we often provide a cheque or a pay by cash option just in case the client needs a "live" option to pay. On our websites we produce when you choose the cheque option customers are then presented with a billing address to "complete" the sale. The transaction is marked as a pending order until you as the store owner update the sales record.

Lentil soup for when a geek needs to eat...

This week I had one of those really intense programming experiences: not one but two all-night coding marathons. When I find myself in these situations my body clock goes into it's own time zone and my diet often falls apart.

Sometimes I find myself eating at really dodgy all-night restaurant in these situations. Sometimes I don't eat all. Other times I almost die of pizza and/or coffee overdose.

What usually follows after the coding marathon where this happens? Usually getting sick from all that terrible food (or lack of food). So here is some wisdom for the masses:

Make Soup

Here is a recipe my Wordpress dev roommate and I developed over the winter. It has two tracks for most ingredients so there are usually enough foods around the house to make it happen (provided you have 1 cup of lentils). We usually just cook it in one big pot and add things until it is done.

This soup is vegan. It is a life saver if you cannot digest anything else. If you really must add meat, I highly recommend bacon: the programmers' choice in meats.

Our recipe follows. Everything in the "eat" section is optional. We have never had a bad experience with this recipe! Even better if you include all the options and use broth rather than water... but we never have all that stuff in stock.



1 cup brown lentils OR 1 cup large green lentils


2 tbsp olive oil
1 onion OR garlic, chopped/minced
1 medium red bell pepper OR tomato, chopped


1 tbsp fennel
½ tsp ground cumin OR coriander
¼ tsp. ground red pepper OR cayenne pepper


4 cups water
1 cup lentils
½ tsp salt


1 tbsp lemon!
1 tbsp balsamic vinegar
2 tbsp chopped parsley

Now get back to work, hippy!

Comparing Canadian mobile Internet offerings

This week I finally bit the bullet and purchased a high-speed internet connection in USB form so I can work outdoors with my laptop this summer. I have done much research and had many questions along the way so this article hopes to resolve some of those frequent and common questions.

Does it work on Linux?

Yes. It does. All of the "Internet Sticks" or "USB Internet keys" currently sold in Canada support Linux.

In Debian 6 the device will be detected within about a minute and will then appear in your Network Manager menu. Don't click the connection yet - you have to configure a couple things first. You should open your network connections, click the tab where your "modem" should be and select "add provider". This will ask you what country and provider you are using. Do that! It has the 'dialup' info for your carrier ready to go for you.

The other thing it will need to know is a PIN number if you are on Telus. I put that in the PIN field and the password field. I put my wireless number into the username fields as some forums recommended. Apparently does not like that field to be blank.

What is the coverage like? Which network?

All of the Canadian offerings are currently on the same network technology, HSPA+, which is a variant of GSM. Those familiar with wireless will recognize that Bell and Telus are jumping over to the GSM side of the spectrum. Because of this, I considered all operators equally.

Telus and Bell have roaming agreements with the prairie telecoms and I plan to do some traveling though that region regularly... so they win in this case. I have Rogers network access already with my cellphone but they only really have coverage in Manitoba and some parts of Alberta.

For those new to this, Rogers runs it's own network, while Telus and Bell roam with each other's networks. They all use the same technology, but there are effectively two big networks in Canada.

Fortunately, I checked in on Sasktel's LTE/HSPA+ rollout and the places I'm traveling to are already running on the "new" network Telus/Bell/Sasktel network. So from now on I should always have a connection while I'm in the country, having the new Internet stick and my existing Rogers phone to rely on.

What is the pricing like? How much data?

Even though I am a web developer I use very little amounts data each month. Seriously. My work is all done on the server, so I connect to that and all the dirty work is done there. No uploading/downloading/uploading process in my world. I also do not watch a lot of video or listen to music online.

Having monitored my laptop bandwidth for a few months I can say I use about 5gb of data on wifi, where I assume no limitations, and about 0.5gb on my wireless account if I use it a lot (full time for 10 days will do it). I plan on using about 3x more data on the new wireless connection than my old one, so 1.5gb should be about right.

All of the network operators in Canada basically offer the same plan. Due to the potential for going wildly over budget I recommend the "flexi" plan (it is roughly $5 more but automatically adjusts to the next level if you go over).

Again, all major operators have this on offer:

$35 starter rate (500mb or so)
$55-60 midrange (up to 2gb on most or 3gb on Bell)
$70ish high/fulltime (5gb)

Anything over that will cost you about $50/gig and in my case Telus is going to stop the card from functioning at the 10gb mark. Probably a good idea since that would mean an extra $250 on top of my monthly bill.

Which Card is Best?

Telus offers two cards, Bell one, and Rogers two.

The best one on Telus is the Sierra series, so sayeth the forums. Construction of the card is better?

The best one on Rogers is the MTE variety. It seems to get higher speeds.

The best one on Bell is... well who cares about Bell.

I ended up with the lower option of the two Sierra cards Telus had on offer, the Sierra 306. I chose this one for a few reasons:

  • It only required a 1 year contract
  • It supported the same network(s) as the higher end model
  • The difference between high speed and ultra high speed is irrelevant (it is just reason to use more data)
  • The pricing for the higher end model is dumber than dumb. The outright cost is $29 more than the lower one, but you pay $79 up front on contract vs. $0... why so much more? Dumb.
  • Currently the bulk of users on the Telus/Bell network are using the older network technology, so there should be no harm in choosing a mid-range card on the new network... the network has few users thus lots of bandwidth.
    • Final Thoughts / Observations

      The stick is much faster than I expected. It is amazing to use.

      As I had been warned by some friends who have used these things, the USB sticks get hot really fast. It is okay though. They are tested to run that hot.

      On a busy day my bandwidth usage is about 65-70mb. Primarily using SSH to connect to servers and a lot of page reloads while I'm developing.

Tips for working with Web Developers

Are you working on a web project right now? Have you hit the wall working with your developer? It has happened to us all, on both sides of the fence, and after 2½ years in the business I have some wisdom to share.

  1. Writing software is a creative endeavor. It is effectively like writing a book, but for a machine to read. It just needs a special language and has lots of grammar rules must be followed. Have some respect for your developer and you will get the best results.
  2. Developers cannot code when they are upset. This is important to understand. If you wrote a novel on your way to work, while stuck in traffic every day, nobody will want to read your book at the beach. Why? It would just not be that laid-back friendly book you want to read at a beach. The same goes for software. Making a dev angry doesn't help get the code flowing. Give your developer space when things flare up.
  3. If you know how to do it, you don't need a dev. Telling anyone how to do their job is generally a faux-pas in any situation but lots of clients love to do it with software. Focus on constructive feedback. Things that help everyone progress through the project.
  4. "That should be easy" Just because a piece of software or a practice you want to emulate is out there in the wild does not necessarily make it easy to setup in your environment. Talk to your developer about how long things should take and ask for alternative ideas if you need things done sooner.
  5. Focus on your goal, not the implementation. What do you want your users to do? It is better to approach a developer with an idea that they can find a way to implement. If you dictate how the implementation should happen, which modules, what type of code, etc, your project will likely take longer and cost more... unless you are in some sort of privileged position to understand how all of those elements work together (ie, if you are also a developer working with a sub-contractor).
  6. Formalize your requirements up-front. There is nothing worse for a software developer than a client who at the very last minute decides that they wanted something completely different. This sounds absurd but it happens. Get a statement of work from your developer and make sure everything you need is on it. At the start. If it isn't, do not be surprised when components are missing or add-ons get billed out differently than the rest of your project.
  7. Do not lie to your developer. This is just basic. If you lie to your developer it will eventually catch up to you. Due to the creative nature of programming breaching trust can have a catastrophic effect on your project. Respect the professionalism of your developer and you will get the same in return.

Any other suggestions? If you have some that I feel are worth publishing I'll add them to the list.

Now supporting Drupal on IRC

Yes you read that headline right. I was using IRC in the 90s and it is back in my life in 2011. Drupal maintains a number of channels on that are used for support and discussion.

I joined IRC as a way to assist others who are just beginning their Drupal adventure. These days I do not need to do as much research. If I encounter problems I just look at the code. Things have become much easier than it was in the early days.

Want to join Drupal's IRC community? Just read the rules.

If you're on freenode I am registered as user weal. Running a /whois you'll see I connect from

Drupal's Theme Registry Rebuild: turn it off!

Drupal's Zen theme starter kit includes this nifty feature to rebuild your theme each time you visit. It prevents caching so you always see your fresh new code. For a developer this is some handy candy.

Rife with warnings about performance if the settings actually appear, you should take note that if you are using Zen you need to explicitly disable this setting (yes, even if you can't see the option for it).

On one of my larger client sites I found that due to a misconfiguration in the theme-settings.php file the options for the theme were not showing up. You can normally find this caching option on your zen-based theme's configuration page.

Upon doing a find-and-replace in my theme-settings.php file and unchecking the "Rebuild theme registry on every page." option in your Zen theme things should be a lot faster on your website.

The graph above shows the impact this change had on my server. As you can see, the site in question is by far my biggest traffic driver on this host and it was wasting a LOT of database traffic (note the drop off at around 3pm, it should be pretty obvious).

Also be sure to check your "performance" settings under "site configuration" to enable css caching/compression for an added kick.

The Drupal FormAPI Rapid Development Quickstart

This article is based on a presentation I gave to help a friend who is new to FormsAPI.  It will introduce you to a few concepts using Drupal's command line tools.
For the better part of the past year I have been working with Drupal's FormAPI rather intensely.  The projects have now spanned a number of different applications.  Some interacting with the user system, some with sessions and others with the database.
FormAPI can be notoriously cryptic for developers new to Drupal but once mastered they are a dream to work with.  
Surfing online documentation was difficult for mastring this.  Much of my knowledge did not click until I read Pro Drupal Development published by Apress.
Today's Project
We need to build a simple webform using Drupal's FormsAPI. It will take an action based on the user's selection and send them to another page when complete.
It could be done with webform or CCK, but we want to do this faster than with those tools... in code!  
Our Assumptions
I prefer working at the command line, so that's all we're going to cover here.  I'm assuming you're at your shell now and that Drush is installed.
Let's Prototype Faster
Make sure you're working in a site that isn't live... your scripting could bring the site down otherwise.
Then get over to your website's filesystem and begin:
drush dl module_builder
drush pm-enable module_builder
drush mbdl
Woah! What just happened?  You just downloaded and installed the module builder and then ran it from Drush to get it to fetch all the known hooks that you can tap into with your programming.  The command "mbdl" is an extention to Drush that came with module_builder.
Before we begin coding the module we should know what hooks we want to use/modify with the Drupal framework.
drush hooks
You might want to use more or less to scroll through that list if it is too big:
drush hooks|less
If you are new to this you probably don't have a clue of what you need.  I'll give you a list of starter options in a second, but first let's see what happens when we choose just one of the hooks:
drush mb my_custom_module menu
You just asked module builder to prototype a new module called my_custom_module and to add Drupal's init hook.  Init runs on every page so if you need to do some processing on every single page this is the way to do it.
The result should quickly scroll onto your screen:
Proposed my_custom_module.module:
// $Id$

 * @file my_custom_module.module
 * TODO: Enter file description here.

 * Implementation of hook_init().

function my_custom_module_init() {
That should be enough to get you doing Drupal-style code rather than putting random PHP everywhere.  
Usually I also need Drupal's "menu" hook, it notifies the system of any pages I am creating.  It isn't necessary for what we are doing but I plan on extending the module later so I put it in anyway. I also like to include the "perm" hook and add my own permissions settings.  
We're ready to build the prototype now.
drush mb my_custom_module init menu perm --write
Note that last parameter. It creates the module folder in (probably) your sites/all/modules folder, complete with a pre-crafted .module and .info file.
I commented out menu in the my_custom_module.module file until I have a page function ready to go.  I use init for some debugging on occasion so I'm keeping that in the mix.  Permissions will be rolled out later but we already know who needs access so we put the control into the module early.  We will implement the settings function at a later date.
function my_custom_module_perm() {
  return array('manage my custom module stuff');
This adds an entry to our permissions page.  Note: we are not implementing anything that refers on it in this article.
We're ready to create a form now.
First create some functions.  As of this writing module_builder doesn't seem to have any draft FormAPI forms for us to use and the form hook has the wrong parameters (they apply to nodes, I just want a form!).
function my_custom_module_form($form_state) {
  return $form;

function my_custom_module_form_validate($form, &$form_state) {

function my_custom_module_form_submit($form, &$form_state) {
That should be enough to get us started.
Now we just need to put something into each function to make our form. I have consulted the Drupal FormAPI Reference to learn that "radios" are the type of form field I want.  That page also lists a bunch of options that apply to the "radios" type. 
Let's define the form function with a single field with two radio buttons:
function my_custom_module_form($form_state) {
  $form['choices'] = array(
    '#title' => t('Choose the item that is right for you'),
    '#type' => 'radios',
    '#options' => array('1' => 'Product 1', '2' => 'Product 2'),
    '#required' => TRUE,
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Seriously submit!',

  return $form;
That "#options" parameter contains all of the options that will make up our radio button list.  When processing, selecting "Product 1" will appear to us as simply "1" on our end to save us some typing in the processing stages.
I left the validation function blank in my rapid development project.  I usually use it with multi-page forms where I need to store data between pages.  It is also a great place to do error checking.  Is that phone number numeric?  Yeah, you'd check that here.
The submit function has a few neat tricks in my final version:
function my_custom_module_form_submit($form, &$form_state) {
  if($form_state['values']['choices'] == '1') {
    uc_cart_add_item('5713', 1, NULL, NULL, FALSE);
  if($form_state['values']['choices'] == '2') {
    uc_cart_add_item('5686', 1, NULL, NULL, FALSE);

  $form_state['redirect'] = 'cart/checkout';
You Übercart junkies will appreciate this one.  If you picked "Product 1" you will get the site's product (nid) #5713 added to your shopping cart.  It adds 1 item without any messaging.
If you pick "Product 2" you will get item #5686 added to your cart.
Those product numbers are the node ID (nid) for each product.  If you aren't sure number to use to add to your cart, go find the product on the site and click edit.  See the number in the URL?  That's the node id.
Once it's in your cart the form sends you to the checkout page by setting the form redirect.    
Last Step - Use the Form
You have to put the form somewhere.  For this demonstration I used a "page" template and changed the input format to PHP to run it.  You could also put it in a block using the PHP input filter, or alternatively just add an entry in the "menu" function we talked about earlier.
print drupal_get_form('my_custom_module_form');


Notes from Drupal Camp Victoria

I finally made it out to a real Drupal event!  Not just a local meetup... so much more than that.

The two-day educational networking event took place at North Studio - a Victoria web development firm which also does a lot of work in the computer training department.  Our schedule started with a focus on the basics: installation of Drupal, SEO techniques, a dash of Information Architecture and more.  That was all really valuable stuff, but for me it was a bit redundant.  If you've been following my threads for the past year you will probably understand what I mean.

What I Learned

The presentation on Actions, Triggers and Rules by Dave Tarc was insightful.  I have worked with Actions and Triggers on Drupal 6 and the Workflow-NG module for Drupal 5.  Rules takes over where Workflow-NG left off.  Essentially this module just lets you add some rudimentary logic to your Triggers so you can automate things on the site.  What could be better than automating things?  In my world: not much.

Learning about Panels3 was a valuable experience. I support sites using Panels3 but I haven't had the need to get much further than that.  The presenter showed us how to use the mini-panel component with the Tabs Panel Style module to produce a nice AJAX tabbed block, the kind that newspapers and magazines like to use to add contextual content to pages.  That has already worked it's way into one of my projects.

The Geo module with OpenLayers presentation blew my mind.  Want to map out things in three dimensional space?  Geo can get you there.  Want to use a map that behaves like Google's Map service but without the branding?  Geo can get you there too.  There are so many base maps to choose from it is really quite amazing at what can be done with Drupal, a custom MySQL configuration and a little know-how (PS, you may not need the MySQL customization if you rely on WKT - it does not allow you to do as much though).  This one will be my next pet project for sure.  Just too cool not to find a reason to do it

Giving Back

My take away from Drupal Camp was that people should give back to the community.  What that means in practice for me is that I should contribute documentation and code where I can. For a time I thought doing some occasional pro-bono (ie, free) work for people was another route to go... I have since moved on.  That often takes an immense amount of time and is not necessarily as valuable as supporting the Drupal community directly.

I have agreement with one of my clients to publish a module I recently upgraded from D5 to D6 and I am hoping to contribute themes in the near future.  Hopefully that will assist others with their projects.  Be sure to subscribe to my RSS feed if you want to keep up on my Drupal code and documentation efforts.  Thanks!


Managing all of your images with Drupal

Are you tired of resizing your images, saving them, uploading them, only to find out that you need to do the whole process over again because you forgot to size the images correctly?

That was editing for the web a decade ago but it doesn't have to be that way any longer.  With Drupal you can manage your images online and this tutorial will show you one way that it can be done.

This howto is based on a Surrey Drupal User's group discussion where Ryan Dempsey talked about his favourite recipe for managing images.  This howto extends that discussion with the addition of some additional "nice to have" modules.

The good news? You can do most anything you need/want to do to images with Drupal.  The bad news?  Some fringe coding might be necessary to make it totally awesome. 

Drupal can make your website fully capable of managing images in a sane and logical way so we don't have to manually resize our images ever again.

Using Core Components aka. The Old Way

Out of the box Drupal supports images by way of the core upload module.  It is not pretty, users must first upload the image by attaching it to a posting.  After the upload the user must then take the URL it creates  and paste it into the HTML code within the body or, if using a WYSIWYG editor, into an image attach dialog box (if you're looking for one, I prefer FCK).  For a web editor this process is familiar and approachable but to end users it is a nightmare.

Also consider that if you go this route your users will probably have to resize and upload their images as web-ready graphics this may not be the best method: it requires knowledge of Photoshop or the Gimp to do most of the handy work. 

At the end of this guide you will have two methods that will allow you to manage images, using a WYSIWYG editor and using a CCK field.  Our goal is to manage all of the images through a centralized interface.  If you are uploading an image using the core upload module, or a CCK ImageField your uploads are categorized in the system based on the node.  That is extremely annoying when users want to re-use imagery on the site.  Under the "upload" paradigm a user might try to re-upload the file each time.  What a hassle!

A Central Gallery

We want to have everything go into a central image gallery.  Once an image is uploaded it can be re-used with other postings.  We no longer have to worry about accidentally deleting an old posting and having our images disappear.  You can customize where users can put things, permission agains what they can access and prevent users from deleting (just in case!).  That is all really great stuff.

Keep in mind that different users are still going to have different needs.  Some need to edit in WYSIWYG editors, while in other circumstances you simply want someone to choose an image from a pre-set location.  Both of these options are possible.

The Image Management Modules

This recipe should cover everything under the sun - so long as you want to keep everything in a centralized gallery.  That is my preferred route because I know a lot of my clients travel a lot and/or wipe their laptops clean every few months.  They don't want their images on their hard drive.  They want them online.  

The idea is that once you put something into the website it should be available for use... always.  From anywhere. 

Here are the modules you will need:

  • ImageCache - To manage the resizing, cropping and other basic tasks.
  • ImageCache Actions - An expansion pack which allows you to mod the images at display time. 
  • Image Resize Filter - Make your WYSIWYG editing awesome(r) no matter which one you use
  • IMCE - A gallery to store everything
  • IMCE CCK Image - A module which allows you to select an image in a CCK field

This probably goes without saying these days, but you will probably also want:

 The Image Gallery Component - IMCE

To get a gallery users can browse through and upload their images into we turn to the IMCE module.  Enabling it will give you a new tab on your "/user" page (right after logging in).  It will also pop up the gallery whenever requested.  Users can upload any time they visit that screen if you have given them permission to do so.

When you configure the settings you will need to ensure that where your uploads are going on the server has appropriate permissions.  This can be frustrating, but keep this in mind, you will have the same issue when you get to ImageCache below. 

I highly recommend setting a maximum image size.  I would like to make a note that with some work on the CCK IMCE Imagefield module we talk about later this requirement will go away so long as you have the disk space available.

I disable resizing at this point and I do not create thumbnails at this stage either - there are better ways of doing both of those things.  Keep reading.

One note about IMCE before we get any further.  It produces a listing of images, not a thumbnail gallery as I was hoping for.  I would imagine this is possible with some clever hacking, but I'll leave that task for someone else to conquer.  It would be nice to have...

Using the images within a WYSIWYG editor

This is one of those steps that "should" be easy but in practice can take some time to configure correctly.  Since I use the FCKeditor module most of the time (and not the Wysiwyg API) this is a little more complex than I expected.  If both FCKeditor and IMCE are installed you should see the option to integrate IMCE with FCK on the IMCE settings page.  Then after doing that, you will want to go to the FCK settings page and set the default file browser to IMCE.  

If you use the Wysiwyig API, you will want to get the IMCE bridge module.  Make sure after enabling IMCE that you go into your toolbar settings and add the IMCE image attach field.  Otherwise you cannot browse the server for images (except, that sometimes you can by editing a file after drafting it... weird).

To test your configuration you will need to completely clear the cache on your desktop machine because the editor(s) often load the settings in JavaScript which is usually archived for a long while on most desktops.  If you have Firefox web developer toolbar installed I recommend clicking "miscellaneous -> clear private data -> caches".  After doing so, you should be able to click the "insert image" icon in FCK (or your favourite editor) and see a new "browse" button next to the URL field when you click it.  

If you let people insert images this way they will eventually want to resize the images.  When working within FCK Editor I think the best method is to let users use the tools most obvious... and I believe that is when the FCK image dialog box pops up.  They see the controls, they use them, and they get results.  Makes sense right?

The Image Resize Filter does the rest.  It searches the body text created by FCK (or any other another editor) to see if the user changed the image dimensions while they were editing.  If your users changed the settings it will automatically create a version of the file with those new dimensions.  What a delight.

Using the images as a CCK field

This part of the equation is still being built but it is one of the most interesting extensions of the IMCE module that I have yet to happen upon.  The IMCE Image Field CCK module allows you to insert an image selector on any existing content type. 

That will let you define places on a page where images must go.  Users can't disrupt the order of things with the WYSIWYG editor so they can get down to business blogging (or whatever it is they do).

After the user selects the image the field allows the user to see the image (which currently renders at full size - ouch) and also type in a caption.  We can turn the caption on or off when you render the images.  That setting is managed by ImageCache.

Formatting images using ImageCache

At display time you can have image presets that render.  Essentially all you need to do is set some presets in your ImageCache settings and then choose places where you want the image to display at that size.  You can specify the size for CCK fields defined in your content type pages.  If you are using views, just choose the one you want from the options provided for each image field.

Images in your preset sizes will not generate immediately.  They are generated as they are needed.  Every time thereafter it will be cached.

Slicing and Dicing the Photos

You can go a step further with image processing on Drupal.  Using ImageCache Actions you can overlay text onto the image, put custom borders on, and even watermark the images.  If you want a sequel to this blog posting that talks about ImageCache options send me an email.  It took a long time to get this posting out the door so it helps if people know it is useful.

A Quick Final Touch

While you're working with Drupal, don't forget to consider using Lightbox as a quick route to making galleries by attaching multiple images to a page.  


Want to be a Linux admin? Start here.

This collection of links originally appeared on my consulting website.  If you are a developer new to using Linux or Unix systems these guides will probably come in handy at some point.  Enjoy.