Drupal on LiteracyEvangelism.org
I have been working as the IT manager of Literacy & Evangelism International for almost 7 years. The opportunity to work with the organization has provided valuable learning experiences, and those experiences have included web development projects for the last several years.

The first database-driven version of
literacyevangelism.org was a custom PHP/MySQL application. It was quite limited, but provided basic administration functionality for a few primary content items on the site.
We switched to
ExpressionEngine in 2007. While
Drupal was evaluated at the time, it seemed rather complex. ExpressionEngine was easy to use and provided a simple mechanism for site theming.
ExpressionEngine was easy to use and provided a simple mechanism for site theming. We eventually needed more than ExpressionEngine provides, and the Drupal community has produced many more modules than the ExpressionEngine community. Although ExpressionEngine is an excellent content management system for many (
particularly for web designers), Drupal has a larger pool of modules and better supports large projects.
Performance is also an issue with ExpressionEngine. As I was developing the new version of
literacyevangelism.org, I discovered that ExpressionEngine stores all of its data in a single table (at least in version 1.6.x). Individual columns are used for each custom field, and every content item contains an empty record for the custom fields not specifically used by it. This results in a tremendous amount of database waste. Many custom fields are used for the content types stored on
literacyevangelism.org, and the ExpressionEngine weblog data table eventually held more than 100 columns.

Because of these and other considerations, I began constructing a new, Drupal-based version of
literacyevangelism.org in October 2009. It was deployed this week.
Drupal's
content construction kit (CCK) enables the creation of custom data types and fields. Its data types are stored in individual tables, providing for a simplified and maintainable database.
A number of custom content types are currently in use on
literacyevangelism.org. Not all of them are available to unauthenticated users, but these are some of the types:
- Blog (for linking to an LEI blog)
- Contact - Organization (for handling primer contacts)
- Contact - Person (for handling primer contacts)
- FAQ entry (for frequently asked questions)
- Investment Opportunity (for investment projects)
- Job (for opportunities to join the organization)
- Learning Opportunity (for something a contact can learn)
- Newsletter (for posting the quarterly newsletters)
- Primer (the primary product produced by the organization; 214 are currently in the database)
- Primer Task (a task relating to a particular primer; for internal use)
- Request (something a visitor to the site can request from the organization)
- Training Event (a specific training event on literacy topics)
- Webform (a content type for creating forms, such as the contact form)
The site currently uses 9 views:
-
Blogs: displays a list of Blog content items.
-
Invest: displays a list of current Investment Opportunity items.
-
Join: displays a list of current Job items.
-
Learn: displays a list of current Learning Opportunity items.
-
FAQ: displays a list of current FAQ entry items.
-
Newsletters: displays a list of current Newsletter items.
-
Primers: displays a list of current Primer items.
-
Request: displays a list of current Request items.
-
Training Events: displays a list of current Training Event items.
The
Custom Breadcrumbs module enables a consistent site hierarchy to be used to facilitate simplified navigation within sections.
The
Pathauto module enables a consistent URL path hierarchy to be used without having to manually create it. The custom paths are specific to the content types. Since
every content type in Drupal is ultimately a node in, the Node path settings are of particular significance:
Investment Opportunity paths: opportunities/invest/[title-raw]
Job paths: opportunities/join/[title-raw]
Learning Opportunity paths: opportunities/learn/[title-raw]
Primer paths: opportunities/request/[title-raw]
Training Event paths: resources/training/[title-raw]
As public site content is expanded, more URL aliases will be used. While the
Content Translation module is enabled, language-neutral paths are currently used, as a multi-lingual site is only an internal development at this point.
Blocks
The following block regions are defined for the custom Drupal theme: Global Navigation, Local Navigation, Home Page - Spotlight, Home Page - Header, Content Area (Before Content), and Content Area (After Content).
The
contact page is a
Webform item; the additional information above the form is provided by a block displayed immediately before the node content.
The
Local Navigation block displays a navigation menu specific to the section of the site currently in use.
The
Global Navigation block remains consistent for all pages on the site and displays only the global navigation menu.
The
Request a Workshop page uses a block to display an associated webform after the node content.
Theming
I used a custom PHPTemplate theme for the site. The guide found in
Front End Drupal was immensely helpful, and I used the
Drupal 6 Theme Guide on many occasions. The
Theme developer module was helpful for identifying template files being used to generate site output. I regularly used the listing of
page.tpl.php variables available in Drupal 6.
While I was able to re-use most of the HTML from the previous site revision, I modified some of the CSS stylesheets to reflect the Drupal-generated markup (particularly with regard to some classes and divs).
I was surprised to see how little theming work was required for this initial Drupal implementation. I am using the following custom files in my template:
- block.tpl.php
- node.tpl.php
- page.tpl.php
- --views-view--Primers.tpl.php
In retrospect, it is obvious that it would have been more complex and would have required more time to have used a starter theme (such as
Zen). Front End Drupal provides a good introduction to Drupal theming, and it is possible to obtain all of the necessary information for files and variables from the Drupal site and the Theme developer module.
Development Environment
I used a virtual host with
MAMP Pro on a
Mac OS X system for development of the site. MAMP Pro provides an excellent self-contained
Apache/
MySQL/
PHP implementation for the Mac. My text editor for all custom coding was
Textmate. I used
Quicksilver and Finder to navigate and manipulate folders.
Deployment
The site is running from a
Grid-Service account hosted with
MediaTemple. The deployment was smooth, but most of the content items became unpublished during the process. This caused the appearance of a broken site, but once I discovered the issue (during a demonstration the morning after I uploaded the site!) and tried several other solutions, the simple remedy of re-publishing the faulty content items from the Drupal administrative interface became obvious.
Future Plans
One of the primary reasons for switching to Drupal was to be able to implement planned additions to the site.
While it would be unwise to publish launch dates for additional features, here are some the primary ones we are pursuing:
- integrated shopping cart and donation processing engine (probably Ubercart)
- multi-lingual site (at least English and Spanish)
- comprehensive central resource for managing all primer information (both internally and externally, with access controls)
Lessons for the future
- Verify that everything works when using the user credentials of the end user before giving a demonstration.
- Deploy the site more than 9 hours before the demo (particularly if those hours are between midnight and 9:00am).
- Verify that Drupal nodes are published before troubleshooting access permissions for them.
- Do not try to anticipate all possible uses for site content; that only delays projects.
- Avoid manipulating core files; use custom themes/modules instead of hacks.
Based on my experience with this project, I plan to use Drupal for several upcoming projects and highly recommend investing the time required to understand Drupal.
Lullabot has some excellent material, useful books have been written, and the Drupal documentation is extensive. The best way to learn to use Drupal, however, is to experiment with the system.
Modules
Access Control:
-
Content Access
Administration:
-
Administration menu
CCK:
- Content
- Content Copy
- Content Permissions
- Content Templates
- Fieldgroup
-
FileField
-
ImageField
- Node Reference
- Number
- Option Widgets
- Text
- User Reference
Core - optional:
- Comment
- Content Translation
- Database logging
- Help
- Locale
- Menu
- Path
- PHP filter
- Profile
- Search
- Tracker
- Trigger
- Update status
Custom Breadcrumbs:
- Custom Breadcrumbs
- Custom Breadcrumbs for Paths
- Custom Breadcrumbs for Views
Date/Time:
- Date
- Date popup
- Date Timezone
Development:
- Devel
- Theme developer
ImageCache:
-
ImageAPI
- ImageAPI GD2
- ImageCache
Mobile:
Mobile Tools
Other:
- Advanced help
- Global redirect
- Nice Menus
- Path redirect
- Pathauto
- Read More Link
- Token
- Webform
Statistics:
-
Google Analytics
Views:
- Views
- Views Custom Field
- Views UI
Not all of these modules are being actively used in a way that would be apparent to site visitors.
Do you have any questions or comments about this? Please let me know!