This review follows on from my previous article, which outlined the criteria I applied to many of the main open source CMSs to determine their suitability for a developer. Drupal is an excellent, lightweight, flexible system which can be used in a variety of contexts, and is one of the open source CMSs I would recommend without hesitation.
Homepage: http://www.drupal.org/
Version evaluated: 4.5.0
License: GPL
Platform: PHP + MySQL/PostgreSQL; it has no exotic dependencies and will run on standard ISP web space
Commercial support: several companies provide Drupal site building, but all of the ones I found are based in mainland Europe, the USA and Canada (see http://drupal.org/services for details) - none in the UK I could find
Example sites:
I have done extensive testing of this system, and am impressed by its flexibility, code quality (generally), and modular design. All of these factors make it eminently suitable for customisation by an IT shop. Unlike Mambo, it is easy to hack the templates, layout, menus and navigation of a Drupal site; unlike Plone, writing an extension (module) for Drupal is simple, providing you know PHP. (Mambo and Plone will be covered in later articles.)
Drupal's origins are as a tool for building community sites, and as a result it has many features to support such sites. It would make a good choice for a blogging or news site, though it is also capable of supporting a standard website.
Drupal comes with a standard set of "modules" which provide core functionality. However, because Drupal is very stripped down, some functionality I would consider core to a useful website is not included (e.g. fine-grained access control).
Below are some feature highlights included in a standard installation:
Standard web pages and articles: users can edit and publish standard HTML pages using a web browser
Simple workflow tools for content publication: for example, can require that new pages pass through a review before going live
RSS feed aggregator: can pull in RSS (not Atom) feeds and present them as a set of HTML pages
Blog + blog API: can integrate with external blogging tools
RSS feed: a feed of the items on the front page is provided by default
Archive old content: old material can be presented via a calendar interface
Book: collaborative environment which allows a set of pages to be strung together as an online book; could be used for manuals of teaching materials
Comments: each content item can present an area where users can append comments
Threaded discussion forum
Polls: users can post their opinion on a selected topic, and the system will aggregate the responses
Content taxonomy: different classes of content can have their own vocabularies associated with them; classification of new content can be enforced, so that any new item must have at least one term from the vocabulary associated with it
Throttle: this can be used to turn off data-driven parts of the site when the site is congested
Logging: important events and errors are viewable through an online log
Cache: dynamic content can be cached to ease the load on the database
Search engine: this provides a search across site content, but I have found it unreliable
Upgrade tools to migrate from one Drupal version to the next
Additional modules are available from the Drupal website. They are very easy to install: usually, a folder is copied into the modules folder of the Drupal install and that's it; occasionally, the database will need to be modified using a script supplied with the module. Once installed, modules can be activated and deactivated through the administrator interface.
Some of the more useful modules are summarised below.
PDFView: convert content to PDF format (use the CVS version, which produces better output)
Typecat: display content by category
Filestore: upload files to system
Spam: detect spam content and comments (download the CVS version, which is stable but has better features)
Flexinode: create custom content types (e.g. you could have a "Club" type which let you store details about clubs, their meeting times and dates, and meeting location)
Node_privacy_byrole: gives fine-grained control over permissions
HTMLArea: WYSIWYG editing of content
Atom: add Atom feed URL to page header
URLFilter: automatically filter URLs and email addresses in content items, converting them into links
Webform: build interactive forms (e.g. feedback or contact forms) via the Drupal administrator interface
One caveat: the code in some of the add-on modules is scrappy (depending on who wrote them). You may find that you need to tweak the code in places. However, I've found the code in the core Drupal modules to be generally of good quality.
By default, Drupal comes with four themes which are simple and functional, based on XHTML and CSS. None would win a design competition, but they would be OK for a small company website.
Drupal's template "language" is very simple, based on HTML with a few custom tags. They are also declarative, containing no logic, which makes them very easy to follow and modify. A template is entirely contained within a single folder, and can consist of as few as two files; again, this makes it easy to modify and create your own templates.
One issue is that Drupal does not provide very fine-grained control over how text is formatted. For example, some sections of text (like the text describing who submitted a content item) are generated as a formatted string, e.g. "Submitted by elliot on Mon, 2005-01-03 18:56". If you wanted to change this to something like "Submitted by elliot @ Mon, 2005-01-03 18:56" (replacing "on" with the "@" symbol), you would have to edit the Drupal core code. (N.B. you can change how dates are formatted through the administrator interface.)
Having said this, it is possible to replace the entire templating engine with your own, giving finer control over how content is rendered.
Other parts of the look and feel aside from the template can be edited directly through the web interface, including:
Menus
New menus can be created; the default menus can be edited or removed; and menu
items can be added, deleted or moved in any menu.
Side bars
It is possible to have no side bars, or side bars on one or both sides.
Blocks
These are the chunks of HTML making up the side bars which provide site
navigation. Many Drupal modules provide a chunk which can be inserted into a side
bar: for example, the book module provides a block which shows the books
available as links.
The Drupal code base is easy to understand, making it ideal for customisation. It incorporates several useful tools to make writing your own modules easier, e.g. SQL functions for executing queries against the Drupal database and code for escaping HTML characters correctly.
Drupal modules also have the potential to tie deeply into the core, as Drupal provides many "hooks" for attaching new code. Drupal calls these hooks at several points during the rendering of a page, and checks activated modules for code which apply at each step. For example, these are some of the places where a module could affect page rendering:
When the header or footer of a page is rendered, a module can insert its own HTML
When a user submits a new content item, the content can be filtered or validated before it is saved to the database
When the administrator menu is displayed, the module can have its own configuration screens made available
Additionally, the design of the core code is modular with the intention of making it extensible, meaning you can ignore it and write to its API instead of worrying about its internals.
On the down-side, the documentation explaining how to write modules is a bit lacking. The documentation which is available can be found on the main Drupal site; API documentation is available from http://drupaldocs.org/.
Related articles: