You are here


This is a list of the work that I've done in the past.

iPhone Application Development

I have been doing some iPhone application development with a book that I got from The mac makes it very easy to take screen shots so I have placed the screen shots of app's I develop on flickr. Here is the flickr slideshow.

Norampac Internal File Management System

My friend Az asked me if I could do a file management system for the company he works for. Basically they needed a website that ran only on their internal intranet that allowed the users to upload and manage documents online for individuals to download and use. The users that logged in would be able to upload documents to the site and organize them in a hierarchical manner.

The hierarchical structure is built using the taxonomy module. I wrote a small module that handled the form alter for making sure the taxonomy element selected doesn't have an child terms. Also the module handled the path callbacks so that the arg sent in is checked to see if it has any child terms. If there are child terms, list those terms as link callbacks. If there aren't any child terms, send that arg to the view that lists the document.

I made some changes in the theme to be able to make the file link to the node title.

The other module they wanted was injury time. They wanted to be able to edit it themselves, so I made another module that built a custom block that handled that information. Editing that block would bring up a date field and a 'reason' field. Basically that date field recorded the day of the last injury. The days are counted from the last day there was an injury until the current day.

I had fun building this site. It wasn't very difficult, but it allowed me to turn my thoughts into drupal modules and themes. Although it wasn't the most complex module(s) that I've ever written, but it showed me that I can take the Drupal data node structure, and plan out a relatively complex site with custom and contributed modules to build something very quickly and without a lot of planning.

I did learn one thing from this experience. Views is a very very powerful module. Not that I didn't know that before, I just never had the opportunity to explore how powerful it was for my own web app.

At this point, I'd post a link on where to find this site, but since it's on an intranet, I won't be able to link directly to it. I'll post pictures so you can visualize what was done.

Friend Finder module based on Octazen Solutions Address Book Importer

The company I'm working for at the moment asked me to write a module that took advantage of Octazen Solutions Address Book Importer to find friends on their site, and invite individuals that are not on the site.

The module looked very much like the contact importer on facebook. The user could enter the email address information, or upload a CSV file from outlook or thunderbird.

The second page was a list of users that were already on their site. This list was built from a basic query to see if the email address was on the site. The adding of friends is facilitated by using the user_relationship module.

The next page is a list of users that are not on the list that could be invited. This invitation process uses the invite module. The selected users are put together in an array, and invited using drupal_execute to submit the form programmatically.

The module turned out really nicely. I used multipage forms for the 2 lists because they were pretty much the same form. The Octazen Solutions Address Book Importer works great. Buying the license got you the updates for a year. Those updates are key if the other companies (gmail, yahoo, msn, etc.) change their system, Octazen sends out an update ASAP. What I didn't like was that they don't have AIM or MSN Messenger contact importers.

Pluralism Ported to Drupal 6

After a Toronto Drupal User Group meet up discussion and presentation by walkah on the changes to Drupal's theme system for Drupal 6, I was inspired to create and share a Drupal theme for Drupal 6 with the community. I looked around and found the Pluralism template and thought it was a good candidate to create the new theme.

The icons on the template were not sufficient for the theme, so I grabbed a few icons from Lullabot. The biggest problem with this approach was that the icons were created with transparent png which IE6 can not render properly. I'll be trying to fix this in the next few weeks.

I'm not a big fan of the list of taxonomy terms on a page, so I used jQuery and fieldset tag to hold them show/hide them. This is the same technique I used for the Dreamy theme which seems to be very popular.

I also did my best to try and maintain the 3 column footer section using CSS. On the project page, I wanted to be very explicit about only using 3 columns in this section. We'll see how that goes.

Other changes that are a bit more advanced were the changes implemented in template.php. I changed how the comment links were displayed. I made these comment links display more like the ones in the original template. I also changed the icon used for RSS to be more bloggy and less drupally, and the markers for new or updated content are changed to icons. I'm trying to move away from being dependent on drupal's preprocessed styling and get away from looking very typically drupal.

I hope this theme could be as popular as garland, so I want it to work as smoothly as any core theme. I'd really appreciate some kind of feedback on what people think, and how it could be improved.

IBEW 223 Drupal Site and Theme Upgrade


The IBEW 223 website used to be very dark. The client did not like it so much so they asked the company I worked for to make it a bit brighter. I guess they mean more white (and more white space) in the actual design. The inspiration they gave us was to make the site look like the IBEW international site. Since I thought the IBEW's site looked really old and dated, I took the colour scheme and applied it to an open source theme I found at called Asterisk.

I changed the theme by removing some of the graphics, using the standard events module calendar, and using the jquery collapse and collapsible functionality to hide the category information from the user. I always thought that information was annoying and wanted to be able to hide it.

I designed it so it works in IE6, IE7, FF, and Safari. Since it was going to be the last theme I build for drupal in a while, I thought I would put some effort into this one.

Check it out.

CitizenSpeak Port to Drupal 5

The company I worked for asked me to port an old deprecated module from 4.7 to 5 because no one within the community had done so yet.

The CitizenSpeak module allows the creation of email petition campaign nodes.

Due to the large amount of changes in the Form generation in Drupal, there was quite a bit of work to be done to get it going on Drupal 5. I did test the module quite thoroughly, but as many developers know, you'll need to see it working under a heavy load before you can say for sure that it works well.

You can check it out here.

Drupal based UFCW 464A

Based on the Drupal 5 release. The design was heavily influenced by Congressman Mike Ferguson’s website which includes colour schemes, navigation, and basic format of the pages. The site uses the nice menu’s module to get the drop down menus at the top menu bar, and also for the menu at the side for directions. The design is web standards compliant, using CSS and XHTML for page construction.

The client was heavily involved in page design, information architecture, and imagery for the pages. To keep the costs down, the client did not partake in the CiviCRM module, labour news updates, and other modules that support the labour movement. This is the only basic Drupal based website I havve ever done. No fancy functionality on the back end. Not even a multi-user setup. But in the end, a very design heavy project.

Check it out.

Drupal Module to Notify Admin of Account Creation and Changes

A small and simple module that notifies the site admin (at the admin email address) that a user has registered, or that a user is changing their account information. This was necessary to let the admin of the site know when a user has registered so that they can grant certain permissions. This module solved the problem of clients complaining that they did not know when a user was registering. The previous solution was to have the admin constantly monitor the users of the site in the user management section of the admin panel. Now that many of the admins monitor their email religiously, the notify_admin module solved this problem beautifully.

Drupal Notify News Aggregator Module

I wrote a module that sends out news aggregator content based mostly on the Notify module’s basic implementation. This module uses quite a bit of hook_form_alter() to change add form fields to the admin form for the Notify module. The module uses Notify’s user maintenance functionality while the functionality of the module is actually separate from the system.

The creation of this module was based on a support request I made to the developers of Notify that asked them nicely to add news aggregator content to the notification emails. Based on their post about their priorities, they just do not get to feature requests at all. Many developers would say, "why not just write a patch and submit the patch?" I could have done that, but then I would submit that patch to the feature request queue. Since the maintainers don’t look at the feature request queue, I’d be wasting my time.

Issues I noticed was that the implementation of Notify doesn’t take into account the amount of time it takes for the message to be queued up and sent to all of the users on the site. Therefore, you end up with an issue associated with messages being sent out an interval late every day. For example, you send out a message one day at 3pm, it takes 20 seconds to send out. The next message sent out will be at 4pm the next day because that 20 second difference. I made adjustments for that and it works fine now.

Future work on this module will probably include research associated with using the new hook_mail_alter() function to inject the aggregator news into the email as it goes out from Notify. The current implementation has a separate email going out (separate from Notify) that only contains news aggregator content. I did it this way purely for efficiency. I was on a tight deadline to get this thing done and calls to the database for the news item for each email seemed not to be very efficient. Watch this post for updates on how development on this module is going. I might be able to post it on

Duplicate Prevention Module for Drupal and CiviCRM

I wrote a module that prevented duplicate record duplication in CiviCRM. The basic problem was that users who registered in on a Drupal site with CiviCRM has a decent amount of information associated with their account. If they forget their password, they are more than likely going to create a new account rather than request a new password. The module I wrote was a basic small module that prevented that from happening.

Even though users can create whatever accounts they want to create, it becomes a hassle on the back end for the administrator to remove the duplicate accounts. What the module I created does is monitors the admin-selected registration fields in a hierarchical manor to make sure an existing record in CiviCRM does not have a Drupal user associated with it. If the Drupal user exists based on the selected criteria, registration for the user will be denied, their username shows up as their potential old record, and the user is told to request a new password or contact the site admin.

The challenge is really on the configuration. The site builder or administrator needs to select a combination or registration fields that make it unique. For example, the user the admin can't just pick the first name and last name fields because there is a good possibility that users registering have the same name, or they are a junior and a senior. Another good example of a challenge is dealing with people who use a nickname as their first name; Richard could use "Rich" or "Dick", Thomas can use "Tom" or "Tommy". This was why we decided to make it hierarchical. That way there are layers of validation the registering user will go through to make sure they are who they say they are, and they don’t already exist in the system.

I wrote this module for CiviCRM 1.7, and I’m aware of the Civi-DeDuplication functionality that comes in CiviCRM 1.8. The difference between what my module does and what Civi-DeDupe does is mine prevents it on the front end, and Civi-DeDupe is more of a "clean up after the fact" solution. They can both be used at the same time for maximum duplicate prevention.