drupal planet

If you don't use Navigate you could be missing out on some rather nice tools for rapidly setting up a site and helping clients and site users get comfortable in Drupal. Navigate is all about customizing the navigation experience to easily find menu items and content if you don't know where they are, and quickly build a set of personal menus to areas of a Drupal site that you use the most.

I use Navigate every day and it saves my bacon. 

The problem

The problem we're trying to solve here is that Drupal's navigation is deep and complex. Menus in menus in menus, and it takes a while to figure out how to find what you need. Navigate brings together a set of tools in an reasonably un-intrusive package that helps you get around. I'll take you through the features and how to set it up below.

Getting started

First, download the Navigate module and install the associated modules you see below:

Once installed, here's what you'll see in the top left corner of the screen:

Something's hiding there. Click it and it will expand to show you this:

This is Navigate. Navigate is a box that contains widgets. You can hide Navigate by clicking the steering wheel icon one more time. Above, you can see it has two widgets, one called Search and one called Favorites.

Let's play with these for a minute. Test out search by typing user in the search box and pressing enter. Navigate will search content and the menu to find any matches to your search and load them via AJAX. You'll see something like this:

One nice thing about Navigate is that it retains state. That means that if you click on a link, the same search results will display on the next page.

If you click the little cog wheel highlighted above, you'll see some settings for this widget:

TIP: I use the search widget to find menu items added by newly installed modules when I don't know where they are.

Here you can set the widget to search for content (the Full option uses Drupal's search engine), the menu and / or users. You can even set which types of content to search.

Why would you want to do this instead of searching everything? Well, Navigate lets you have as many widgets as you want, and you may want to keep one search result set open from page to page while using the other one to search around. You also might want to have a search widget for the menu, and another for content. Let me demonstrate.

Click the big cog wheel to display Navigate's settings:

This opens up some new options. I'll walk through this bit by bit. You should see something like this:

Here are the new areas that displayed, marked so we can reference them later

Our first goal here is to add a widget. To do so, all we need to do is click on an item in the "Add widgets" section. We want to add a new search widget, so we'll click the search item.

This will add a new search widget below the others, so you'll see something like this:

Now we have two search widgets we can set individually to search for particular things. One problem, though. They're both called Search. No biggie, we can change the title of each of them by double-clicking the title, typing the new title, and pressing enter:

Here's what they look like re-titled:

Now, it might make more sense to have the two search widgets next to each other, so grab the Search users title  to move the widget and drop it below the Search content widget.

Using the favorites widget

Now let's explore the Favorites widget. The idea of the favorites widget is to create bookmarks to commonly visited places. When you are on a page, you can add the page to your favorites by typing a name for the page and clicking the Add button.


Once you have a number of favorites, you can re-order them by dragging and dropping. You can delete items by clicking on the X that displays when hovering over an item. You can't see it because we're just using screenshots, but everything is done via AJAX and saved behind the scenes, so this is very quick process.

For complex shortcuts, I'll add a divider just by entering a series of dashes as a favorite:

Just like any other widget, you can have multiple favorite widgets and rename them as you'd like.

If you create a set of shortcuts that you'd like to use for another site, there's good news! Click the settings cog wheel for the widget, and you'll see an import / export form. Click the Export button to generate the data you can use to import into another site's widget:

Using the menu widget

Okay, let's explore another widget. The Menu widget provides a collapsible tree of any menu, and just like the search, it has a saved state so that you don't lose your place between pages. Let's see what that looks like.

Just like we did above, click the settings cog wheel to open up Navigate's settings, then click the menu item:

A new widget will appear below the others with a simple form to let you pick the menu to display:

Select the menu (I picked the Administer menu) and click the Load button. What displays will look something like this:

Every + sign denotes an expandable menu. Click it to expand or collapse a menu. Here's what happened when I clicked the one next to Reports:

Simple enough. I typically add a menu widget for the Create content menu when I start working on a site.

One of the big challenges of Drupal is teaching clients how to use it. There's just a lot to wrap your mind around. And often, there is more than one kind of person using the site, so the ability to have a customize set of navigation tools for each individual or role is useful.

With Navigate, you can set defaults for roles, or modify an individual user's widget set. Let me walk you through how to create a default set for a role.

Setting default widgets for a role

Let's take the widget set we've just created and set it for the default widget set for new administrative users. First, click the cog wheel to display the settings, then click the "Set" link next to the role you want to assign the widget set to:

Once you do this, when a user of that role logs in for the first time, if they don't have their own widget set already they'll get the default. Once you've set the defaults, some of the gray-ed out options become available:

Load - loads the widget set as your current widget set so you can modify it
Unset - Unsets the defaults for the role
Set all users - This will set the defaults for all users of that role, even if they have a widget set already.

Setting defaults for a single user

In the "Search name / UID" box, start typing a username or UID. Once you've typed something in, the gray-ed out options become available:

This works the same as the role. You can either set the user's widgets to be what you see on your current widget set, or you can load theirs to modify them.

One tricky thing here is that when we load a widget set, it replaces our current one. So, we need a way to export and import a widget set to save our settings while we work on the widget sets for other users.

Exporting and importing widget sets

In the settings pane, you'll see a couple of boxes like what you see below. When you click the "Export widget set" button, the textarea will be populated with the code you would need to paste into the "Import widget set" box in order to import.

You can use this tool to create a number of widget sets to use across multiple sites. In Navigate, everything is portable.

A few special features

Keyboard shortcuts

You can enable keyboard shortcuts to easily use Navigate. Click the "KEY" link at the bottom of the widget set to enable it (it will be white and non-italic when enabled):

CTL+SHIFT+N - Toggles Navigate visibility
CTL+SHIFT+S - Moves the cursor to the last search widget for rapid searching


Double-click the Navigate title to hide all inputs and just show links (to free up some space):


Hovering over virtually anything in Navigate will give you some helpful information. For example, hovering over the Navigate title displays this:

Hovering over a link in a favorites widget displays this:

You can also click the HELP link at the bottom of Navigate to display the help page:

That's it, enjoy!

OCR-ed content: 
Navigate Search SONIC Con ten! matches Masquerade as Menu matches: My account Webform Themes Input formats Languages Ughtbox2 Performance an anonym. Content AN as Search users Search -cl- Favorites Add NBL Favorites My account Add IT My ACCOUNT Navigate Menu Parent Item: Primary links Load rtKS Prima Navigate Enabled Name Version Description Adds framework for supplying navigation tools to Drupal Navigate 6.x-1.0-beta5 Required by: Navigate Custom (enabled), Navigate Favorites (enabled). Navigate Menu (enabled), Navigate Search (enabled) Na Navigate widget for adding custom html Curtom 6.x-1.0-betaSphpcode. Depends on: Navigate (enabled) Navigate Q-beta5s fevorites widget to the Navigate module Favorites Depends on: Navigate (enabled) Adds Navigate widget for displaying menu mZ Depends on: Navigate 'enabled) el rf Navigate krtf-,r Adds search widget to the Navigate module Search Depends on: Navigate (enabled) 6.X-1.0- betaS Adds itml Navigate 6.X-1.0- betaS php code. Custom 6.x- 1.0- betaS Adds TO Navigate 6.X-1.0- beta5tree. Menu Navigate ft FI- ODESSA Navigate6.x-1.0-beta5Required -betaSphp Favorites6*1-"6'35"'15 faV°riteS ICI 6.x- 06 les CE -06 TIE BX-I -06 LEE II;. fs. cs- 5.x-l .ot 3t -06 6.x- per ed i3\ igate Navigate Add widgets custom Favorites LSMenu earch Menu MERCREDI Il> Favorites Add Views Administer content Blocks Users Modules Menu Taxonomy HELP KEV My account ax NO M/Qccoun! .11 Search Soared Favorites Search Soared HELP KEY Add HELP NL tjCfcearch Menu -Content management L-Slte building USte configuration LOtepiaysurie LlfRJeer management L-Reports Lip-Rules L-Advanced help l+FSlle l+FSlte Display suite Ep-UBer REPORTS l+FRules Help Content Site SHE User Rules Advanced 1*11 ill AWOL authenticated Set Load Unset Set all users Brt fcl— fill ill administrator Load Unset Set all users load all user administrator SET LOAD Unset Set Sail 1 1 nil5 nil5 Defaults authenticated contrlbuto administrator Search name UID Bet Set Load Unset Set all users Unset Set all users Unset Set all users Set user Widget set import export LUM Set Load all SetaB adml all SetaB oad .oad Set user oad ir). Navigate ft JI Navigate Add widgets custom Favorites LSMenu Search Search Favorites HELP KEY Defaults authenticated user Load Unset Set all users Search name Ui contrl butow Set Load Unset Set all users administrator Load Unset Set all users Load Set user Widget set import export Export widget set Import wldgot sot UID iwuser Add mber for KNOW RAYON hlnn DRIBBLE name/UlD ■bid get user SET 5etall CONTRIBUTORS Set all BESET all Menu HELP PENH all /UID PLAN Navigate ft Search Favorites HELP KEY Search Add Search Favorites J|f hris Shattuck Load Set user Set user My account Views Administer content WINDMILLS ■ill Languages Llghtbox2 Performance Search content: Quick Full Search menu: Menu Search users: Users Content type. li None Blog Feed Module Story Tweet All Search content: QUICK menu: users: search Webform to Search content Favorites Search users HELP KEY Search Add Soared content Favorites Ui ers HELP users Navigate ft Add custom LSMenu Search Elelete Add HELP KEY Defaults administrator Widget set import export Export widgot set import widget set arch WIDGETS administrator Load Unset Load Set use Menu HELP Load Unset be Set use Set default widgets Add widgets widget Import export widgets of arch of LMB dim Widget set import export array array MODULE 'navigate. SEARCH TYPE 'navigate search', Weight* ->1J, Export widget set Import wldgot sot 'navlgate.searcfi' Skyping ME through Evernote Type' 'nav qatejusintf, me ri uport VMdgct stl Menu r+HContent management -l+HStte building -Bp-Site configuration Bp-Display suite Bp-User management -□-Reports URecent log entries L-Spam logs L-Top 'access denied' errors L-Top PAGE not found' errors L-Status report t+HRules -Advanced help Help l+HSite l+HSile l|l-RepoHs Top Top I-Help Content Sue Display User Reports SPAM Status Rules »5>r- IMPART YWIS TWILL LIMIT IVP CBD Favorites My account Views Administer content Blocks Users Modules Menus Taxonomy My account juser/27|l| |Views|user /27|2||B!ccks|user /27|S||Administef coment|user/27| 41 Users user /27|7||Menus]user 071111 lvAnAnyfliUflr Export Import HELP KEY Add 27\1) nintster DDI USER lEfWlUEEr 27|l||VieH5|u9efl Ddjl£S|Lfiiy My account fl TO

I kept banging my head against this one because the PHP function array_merge() will act strangely if all of the keys in an associate array are integers. So doing the following DOES NOT WORK:

'#options' => array_merge(array('' => ''), drupal_map_assoc(range(1, 100))),

But, doing the following DOES:

'#options' => array('' => '') + drupal_map_assoc(range(1, 100)),

Another solution that works, but is not as concise:

'#options' => drupal_map_assoc(array_merge(array('' => ''), range(1, 100)));

Whenever it's time to add a module to the drupal.org contrib repository, I flounder a bit. Here's a little documentation on the steps I took when recently adding the Evernote module.

From the command line...

First, you need to login using your CVS account username (replace cvs_username below):

export CVSROOT=:pserver:cvs_username@cvs.drupal.org:/cvs/drupal-contrib

cvs login

Next, check out the drupal contrib repository. From the command line, do:

cvs checkout -l contributions/modules

Copy the module folder over to the modules/ directory and add it with the following commands:

cvs add example

cvs add example/*

Commit it with the following:

cvs commit -m "Super helpful commit message here"

Create a project on drupal.org: http://drupal.org/node/add/project-project. As Boris points out below, some people like to do this before adding the project to CVS. I prefer doing it this way so that when any 'new project' alerts go out on RSS, there's something for people to download and play with right away.

To create a development branch, cd to the module directory

cvscalvar tag -b DRUPAL-6--1

To create an official release, cd to the module directory

cvs tag DRUPAL-6--1-0-BETA1

To update your current checkout to use the development version:

cvs update -dP -r DRUPAL-6--1

Now, you need to add any releases to the module project page by clicking the "Add new release" link on the project page.

In order to get the development release showing on the project page, you need to click on the "Administer releases" link (see image above). Then, check the "Show snapshot release" checkbox (see below)

Useful links:

OCR-ed content: 
Downloads Version e.x-l.O-betal Downloads Download (19.16 kb) Date 2010- View all releases Add new release Administer releases Resources Development Read documentation View pending patches E3 documentation Down loads 6.x- 1.0- beta LOL 10- DOWNLOADS (15. 6.x Major version Current Release Supported Show snapshot release 6.x-1.0-betal Recommended major version: None Advanced options 6.8- 1.0-betal Beta

// $Id:$


  • Introduction
  • Installation
  • Usage


Creator: ChrisShattuck <http://drupal.org/user/166383>

The original idea behind the Evernote module was to integrate the pulling of content from Evernote for rapid blogging purposes. My hope is to further abstract out some of the tools used to do this so that the module can be used as an API for open-ended integration with Evernote.

This module will do the following:

  • Establish a connection with an Evernote account
  • Allow an administrator to set up a 'feed' that will perform a one-way sync from Evernote to Drupal based on multiple criteria. For example, you can set up a feed to pull content with a particular tag.
  • Allow 2-way syncing of 'tags' as taxonomy terms
  • Downloading images and other resources from Evernote notes into image or file fields
  • And a bunch more


See http://drupal.org/getting-started/install-contrib for instructions on how to install or update Drupal modules.

You will also need to add the Evernote API library to Drupal. Right now the API isn't quite set up for web applications like this, so you'll need to do some finagling. You can use the instructions below to build the library yourself, or you can go to this URL to read about how to download a ZIP file with this already done: http://chrisshattuck.com/blog/instructions-setting-evernote-library-evernote-drupal-module

  1. Download the Evernote API (labeled "Evernote API") - http://www.evernote.com/about/developer/api/
    2. Expand the zip
    3. Copy the folder /sample/php/EDAMWebTest/lib/HTTP to /lib/php
    4. Copy the folder /sample/php/EDAMWebTest/lib/OAuth to /lib/php
  2. Next we need a few PEAR libraries that might not be installed on your server, so...
  3. Download the HTTP_Request PEAR script and add to /lib/php/HTTP - http://pear.php.net/package/HTTP_Request/
  4. Download the Net_URL PEAR script and add to /lib/php/HTTP - http://pear.php.net/package/Net_URL/
  5. Download the Net_Socket PEAR script and add to /lib/php/HTTP -http://pear.php.net/package/Net_Socket/
  6. Rename the folder /lib/php to evernoteand move it to your /sites/all/libraries/folder


  1. Go to /admin/build/module and click the 'create a new account' link
  2. If you don't mind saving your Evernote username and password on the server, fill in the username and password at the bottom of the form. To receive a temporary authentication from Evernote, fill in the widget.
  3. Once the account as been added, you can click on 'Add feed' next to the account to create a feed.
  4. Fill out the form to create the criteria for the feed. When cron runs, it will import any new matches and update any changed notes.

Below are instructions for putting together a PHP-based API library for Evernote, particularly for the Evernote Drupal module. I've attached a ZIP file to this post (see the bottom) which can be used temporarily until the brilliant Evernote folks have the time to compile a distribution.

If you use the ZIP file included below the following instructions (evernote-api.zip), just unzip it and add it to your /sites/all/libraries folder. To put it together yourself, use the following instructions.

  1. Download the file here (labeled "Evernote API) 
  2. Expand the zip
  3. Copy the folder /sample/php/EDAMWebTest/lib/HTTP to /lib/php
  4. Copy the folder /sample/php/EDAMWebTest/lib/OAuth to /lib/php
  5. Next we need a few PEAR libraries that might not be installed on your server, so...
  6. Download the HTTP_Request PEAR script and add to /lib/php/HTTP
  7. Download the Net_URL PEAR script and add to /lib/php/HTTP
  8. Download the Net_Socket PEAR script and add to /lib/php/HTTP
  9. Rename the folder /lib/php to evernote and move it to your /sites/all/libraries/folder

The problem

Often I come to a crossroads where I can either experience a moment or capture it. This is a difficult decision. Do I take a picture, or do I watch with my own eyes? Do I think unrestrained, or do I write it down? Do the benefits of having the memento or reminder outweigh being a little more in the moment? 

That question is tough enough. But then the time spent out of the moment is compounded when sharing the moment with others. Downloading images from the camera, uploading them to Flickr, tweeting about it or updating your Facebook status. It takes time, and it's hard to measure the payoff. Are these artifacts that we're sacrificing a little slice of our lives for really worth it?

I'm pretty sure good to share, particularly with the right motive. If it took no time at all, the effort can only land on the side of good to convey interesting experiences or ideas to others. We can add to the global consciousness and do our part in the push towards greater things. But the reason I don't blog, and I don't tweet, and I don't FB these days is because the cost is too steep. I have specific work-oriented goals I'm shooting for, I have a son I'd love to spend a lot more time with, and another one on the way. I have a yard to mow and a body to keep from languishing. I feel like I'll have time to share someday, but usually it's not now. Or, when I share it can only be for very specific reasons that match up with other goals too.

I've been steadily working towards solving the first problem of capturing. A service called Evernote (you may have heard of it) plays a huge part. Of all the data-capturing applications I've worked with, Evernote streamlines the capturing process. It has a global hotkey (at least for Mac), so I can use it even if it's not open. All I need my mind to do is think that hotkey, and in a second (or a couple if the app has to open) I'm capturing. It syncs up with my iPod Touch so I can capture on the road.

In order to enrich my ability to capture other media, I recently purchased a mobile phone with audio and video capturing abilities. I can e-mail these to my Evernote account. This streamlines the capturing process so it feels like the cost is about as low as it can get without having embedded photo sensors in your forehead. No transferring of media, it just syncs up on its own.

This wasn't enough for me. I also wanted to tackle the problem of the lowering the overhead of sharing to the point where it felt like it was no longer a matter of if I had the time, but rather if the information was worthy of sharing.

One issue I have with sharing information is the multiplicity of channels. How can I expect that someone will monitor my Flickr, Twitter, Facebook, Blip, Digg and Delicious accounts, plus several of my own media channels. And even though there is some integration between these services, as far as I know there's not a single application that provides a centralized method of distributing media, so managing the distribution of the data I want to share requires hooking into multiple interfaces. Even if there was a unified interface, there's then two places to manage that data - your local copy and the copy on the channel, and I feel like it should be possible to reduce this to one. Change it locally, and it changes on the service as well.

The issue of centralizing the consumption of your media can be solved by pulling in all the data to a centralized feed - like a blog. It can aggregate your tweets, your videos, your blog posts, and anything else. But, there's still the problem of getting that data into the blog in the first place, and managing it once it's there.

The solution

So, I started putting a couple of pieces together. Evernote provides a method of embedding files of various types inside the notes, and it syncs them with a remote server. I remembered reading that Evernote also had an API, so I started looking into it to see if there might be a way to sync up a web site with Evernote. If so, then I could feasibly create a post locally and have it automatically appear in my blog. If I could centralize my media into Evernote and use it as a blog broadcasting tool, then I would have a solution to multiple problems: 1) Having only one interface for distributing multiple types of media, solving the multiple channels issue 2) Since I capture ideas and information in Evernote anyway, sharing it wouldn't add any overhead at all. 3) If I could broadcast out to multiple channels, I could get a lot of leverage for the data I capture, making it more likely that I would want to capture it in the first place - a useful feedback loop.

The idea really excited me, and as I started digging into the Evernote API, I realized it was totally possible. It's times like these that I'm really happy to be a developer.

I'll be posting more about the solution I came up with, but the idea is to use a Drupal site as a hub which polls Evernote for new notes that meet particular criteria (i.e. they have a particular tag) and adds them as nodes (pages) to the site. Any updates that are made in Evernote are automatically pushed to the site. I built a Drupal module (which will be available soon) that manages this process, and allows two types of tagging - the traditional type which organizes the nodes (i.e. family, recipes, etc) and the second which can be used as triggers for other activity. On this site, for example, I can add a tag called *tweetand Drupal will automatically tweet the node with a shortened URL. If I add a *fb tag, then the twitter post will be sent to Facebook as well.

So just to be clear, here's the workflow:

  1. I create a note in Evernote
  2. I give it the tags *tweet and *fb

That's all. The note is broadcasted to my blog, to Twitter and Facebook. You don't even have to save your note in Evernote, it saves it in the background. If there are any media files attached, it automatically saves them to the appropriate place in Drupal. If that media changes in Evernote, it will be updated in Drupal.

You'll have to excuse me, but I think this is pretty bad ass.

One other issue I wanted to solve was the issue of inter-linking between notes. Evernote is suspiciously wiki-ish, but there's no way to link between notes. What this Drupal module will do is post back a new note with a list of the pages that have been published through the module - with links - so you can copy and paste the links in other notes. Because Evernote has awesome search, it's easy to find the link if you know even a single word.

Oh, and one more piece of awesomeness? Evernote OCRs images on their server, and this module will capture the OCR-ed text and pull it back into Drupal to add to your pages in a variety of ways. Images become searchable! Damn!

The upshot is that I now have a tool that makes it amazingly natural to share information. Of the things that I think are worthy of capturing for my own benefit, there's a handful that I can see being useful to others. To share it, I only have to add a tag.

More to come about this, as well as a release of the Drupal Evernote module. 

Below is a video of a talk I gave this year at DrupalCamp Colorado that summarized some of the important lessons I've learned after 7 years of freelancing. I do talk about the logistical details like pricing and saving money on taxes, but my big focus is on how to build a vision for the life that we work so hard for. The talk initiated some great conversations afterwards, thanks for everyone who took me aside to share.

I was asked to speak at this year's Career Day at our local high school, and thought it would be an awesome opportunity to skew the vision of young minds towards the possibilities that a work life in web design / development can offer. I did a similar talk a couple years ago at the last career day, and realized that in order to keep these guys from drifting off I had to make a concerted effort to break the third wall.

So, I put together this presentation that basically converts the room into a web development firm and introduces the multiple roles you can take on, all the while building out a spec for a popular web site clone (MySpace was the choice each time). I was really impressed with the kids' willingness to participate, and heard it went over pretty well.

Why you would watch this

I'm posting this video just in case folks out there are called upon to give similar presentations to one of the toughest audiences out there - the significantly-younger-than-you kind. The structure I used is low tech, brings the kids in for approachable tasks, and assigns roles to them based on what skills they see in themselves. I figured that if I could get them to connect what they consider their assets to a job title, it would have a greater chance of sticking in their minds, and when they get to the point of genuinely considering careers, they have at least a starting point. But, who knows, it was at least fun and allowed me to test out some ideas on how to make a presentation more compelling for a younger audience.

Stuff that worked well:

  • I started by asking for a volunteer to videotape the presentation. This insured that at least one student was going to be involved the whole time, and they were indeed the ones that asked the most questions. Plus, it also established a level of trust and broke that third wall immediately.
  • I asked the students what they were good at, and assigned them positions based on that. The idea was to give them a feeling like their positive qualities could have an impact on the roles they play down the road.
  • I gave them name tags and spoke to or about them when describing the position, making it less abstract. Also, if they kept the name tags on, I thought other kids might ask them about it and they'd have to articulate at least something that they learned during the talk.
  • I kept it low-tech, using just a white board. Doing this meant less technical overhead, and maybe making the whole idea more approachable, that you didn't need fancy tools to get a lot of the work done.
  • I practiced maybe 4 or 5 times while jogging to make sure I could fit everything into a half hour. I had to cut a bunch of stuff and really streamline the process to get this to work.

I'm chairing the "Providing Professional Drupal Services" track for Drupalcon San Francisco in April and am looking for interesting sessions and speakers to help seed the Drupalcon sessions list. We already have some great folks on board. Sessions will be opened up for public submissions soon and the earlier your session gets added, the longer people have to vote on them.

So, if you're interested, ping me with your session idea. If you're looking for ideas, I've put together of potential subject matter for my track here, as well as a Drupalcon Talk Idea Generator to get your juices flowing.

Disclaimer and clarification: I posted this with the goal of connecting with people who are thinking about or have already prepared sessions for the track I'm chairing. I'm not in charge of fielding all Drupalcon session proposals and I won't be the one that decides which sessions ultimately get chosen, but I should be able to help folks with the submission process.

Skip to video and slides

A couple weeks ago I put out a blog to garner feedback on why Drupal kicks serious a**, and a big thanks to everyone who responded. I integrated a number of the comments with my own personal experience with Drupal and presented my talk last week to a diverse group of 20 or so web tech people in the local Boise Idaho area. Judging from the audience participation, I think the presentation went really well. I recorded the talk (from two different camera angles, no less!) and am posting the video and slides for folks that are curious about what they missed, or who are interested in giving a similar talk themselves.

I did a little research before hand about how Drupal compares to popular CMSes like Joomla, Plone, Wordpress, ExpressionEngine, and SharePoint. The talk was also directed in many ways to audience members who have rolled their own CMS, because that was my experience coming into Drupal and I found that Drupal solved many of the problems I was attempting to solve myself, but in much more elegant ways.

Drupal kicking butt - Video and slideshow

The format of the talk was "10 ways Drupal (might) kick your CMS's a**", and here are the 10 things about Drupal that stand out to me as particularly steller:

#1 - The Drupal Community

The community is a big part of what keeps me involved in Drupal at the level I am. I helped found and participate in a local Drupal users group, which provides important face-to-face time with other people using the Drupal, and keeps us all abreast of important news in the project. I also talk about regional conferences and Drupalcon, IRC, and leadership in the community.

#2 - Central Module Repository

Drupal keeps all of its modules in one place, unlike many other CMSes. This has many benefits, and has helped to keep significant licensing problems to be an issue in the community. Also, a standard module release process allows both developers and administrators to have a clear path forward with module upgrades and choosing the correct module version for the Drupal version they use

#3 - Drupal is a Framework

For developers, Drupal does a lot of heavy lifting and really lets you get plugged virtually anywhere in the platform. The module structure encourages good coding practices and good organization.

#4 - Drupal is Mature

Drupal has been actively developed for 8 years, and lots of big web sites are using it, like the White House, The Onion, Fast Company, BMG Records, NASA, Warner Brothers and Yahoo Research. Even if you don't understand the nuances of security and scalability, you can point to hear examples of how Drupal must provide a solid framework for both.

#5 - Flexible Data Structures

Drupal allows you to create flexible content, much like Access or Filemaker, and even creates full CRUD (Add, edit, view and delete forms) on the fly. So, storing custom content is easy, and doesn't require any programming or touching the database. (video includes demo)

#6 - Flexible Content Feed Output

Once you have content, you have many options for how you want to output the data. You can pass content filters via the URL or even expose filters to users so they can narrow down content based on whatever criteria you specify. The ability to generate these lists of data via configuration without touching queries or code can be a powerful administrative tool.

#7 - Flexible Path Aliasing

In Drupal, you can specify how you want a path to look based on virtually any information in your content, including title, date, or custom fields. Drupal can handle redirecting duplicate URLs (also called aliases) to a single URL with a 301 redirect to prevent a duplicate content filter in search engines.

#8 - Multi-Language Support

Including another language is trivial, and you can even override content within the same language. There's community infrastructure to support translators even if they don't know how to use, install or develop in Drupal.

#9 - Making Forms is a Breeze

Creating forms in Drupal is as easy as creating content types, and can be done without any programming. If you do need to program a form, however, there is a powerful API which will allow you to generate a secure, robust form in just a couple of steps. There is also a nice utility for generating module configuration forms.

#10 - A Bunch of Other Stuff

Including distributions for intranets and social aggregation, cross-database compatibility, an active usability team, hierarchical taxonomy, a powerful theme layer and AJAX framework.

Post-presentation discussion

During and after the presentation, there were a lot of great questions and discussion about topics like:

  • How does Drupal store content types?
  • Can Drupal work with obscure databases like BDB?
  • How do you create a wiki in Drupal?
  • How much does Drupal break from one version to the next?
  • How difficult is the upgrade process from one Drupal version to the next?
  • How much of this stuff is handled by core Drupal, and how much by contributed modules?
  • What versions of MySQL and PHP are the different Drupal versions compatible with?
  • How many people non-developers use Drupal?
  • Discussion on ecommerce solutions for Drupal

Syndicate content