- About Us
- Funding Opportunities
- Keeping Up
- Just Ask Us
Drupal Administration Recipe
In the spirit of openness and sharing so common to the gift communities of the nonprofit and open source worlds, we promised to share details of how we set up our site with other nonprofits and interested parties, and here it is... finally! Sorry about the delay. You know how it goes; other priorities get in the way... and it took quite some time to lay out this extensive collection of information. We hope you find this helpful.
You can either read on for some useful back-story, or you can go directly to the detailed recipe.
Firstly, a reminder that Marie wrote an article about the history of this page and some of the thinking that led to our current design. I also wrote an article about why we picked Drupal and what lessons we learned along the way.
Our previous website was a bit of a nightmare to maintain and we knew we wanted to use better tools this time around. Firstly, we dumped the old CMS and picked Drupal (a great decision that we're still thrilled about) and secondly we made use of a number of modules designed to aid user experience and maintenance. Mostly we gave a lot of thought to the modules we used, but sometimes the choice was pragmatic and based on time-lines. All are shared here.
Below is a list of these administration modules and some pertinent notes that include some or all of the following: what each does, what I thought of each, any limitations and how we use them. We used Drupal 6 and many of the modules listed below were ported back from Drupal 7, which at the time of writing this is still not officially released.
Drupal 7 is scheduled for release on the 5th on January 2011 and if you're planning a new website for the middle of 2011 onwards then I strongly advise using Drupal 7 instead. It's looking like it's already pretty stable and is surprisingly worth considering for any new site, even now, but generally you want to give a new version about 6 months to stabilize and give time to those developers with contributed modules (like the ones below) to catch up. Best of all, if you use D7 then you will not need a whole range of the modules below because D7 either now includes them out of the box or has some other new functionality that renders them redundant. At some point (no sooner than mid 2011) we'll upgrade to D7 and I aim to blog about that process too. Drupal 7 looks incredible. I can't tell you how excited I am about the new Drupal. Anyone, anywhere building any kind of website needs to know about Drupal 7, period. Enough said.
Yes, the recipe below consists of a long list of modules, probably too long. One of the goals we set for ourselves was to be a bit of a testing ground. As much as possible we looked for existing modules that did what we need, rather than create custom code. This meant more modules, which can impact the speed of your site and also means more modules to keep up-to-date with the latest versions and/or security patches. The latter is handsomely mitigated by our use of Drush, a command line utility that makes maintaining the software a breeze. On the flip-side, many of the modules I chose continued to be developed while I used them and it was glorious to have to do almost no work (a few minutes to update the code) and to get a chunk of new functionality I could use. This is the obvious advantage to using a module over using your own code or heavily customized views.
The themes we used are also mentioned below in the theming section.
To simplify the list, I've broken it down into broad categories. Further, I've included a link to all of the project pages and the text of the link includes both the english name of each module and its Drupal project name. First, an overview of the containers:
- Developer Tools - useful site developer utilities
- General Site-Administration and Form-Handling - modules that improve the UX developers and content maintainers.
- SEO and URL Handling - modules for improving search engine optimization and URL handling.
- Image Handling - image-handling modules
- Spam Protection - keeping those pesky spammers at bay
- Modules That Drive Your Content and the Viewing Thereof - the engines that drive content and the viewing therof
- Modules Adding General Functionality - all manner of powerful functionality, like calendars, comment notification, social media tools, printable versions of content, site maps and web forms
- Efficiency - things to make you go zoom.
- Modules That Aid in Data Conversion and Inter-site Communication - getting data from there to here
- Newsletter Modules - getting the news out
- Modules Used By Other Modules - just for completeness' sake
- Custom Modules - modules we wrote for ourselves, including WYSIWYG editor customization, custom navigation, a funding finder for applicants and more.
- Theme Simplification Modules - modules that helped speed up and simplify implementation of the design of this site
- Themes - The themes we use for the site design you see and the administrative interface underneath
This section covers some modules that generally only a site developer would use.
- Administration menu (admin_menu): This module is a standard for most site administrators. It puts your administration menus in a bar across the top of your page for easy access, making for much faster site development. It also provides a configuration option to make the module fieldsets on the module administration page to be collapsed by default. I never build a site without this module.
- Devel (devel): This suite of modules provide powerful tools to assist in the development and debugging of a site. It's a must-have for themers, giving them additional insight into the construction of the pages, and it gives a ton of power to developers, from interrogating all the data in play to running snippets of code. I never build a site without this module and our themer used it extensively.
- Drush: Drush is not a module. It is a command-line utility that is a must for every technical site administrator. Drush will simplify and speed up almost everything you do with your site, from clearing caches and running cron to updating code and interacting with modules and your database. If you're not using Drush... why not?
- Environment Indicator (environment_indicator): If you're doing development right then you have your site hosted in at least 2 and preferably 3 places, namely, development (usually on a local machine), test (usually hosted in the same environment as your live site) and the actual live site. Changes are then tested locally and then on the test site before being pushed to the live site, in order to avoid unnecessary down-time and otherwise breaking your live site. On the flip side, it is then easy to accidentally work on the wrong version of the site if you're not paying enough attention, which can be really frustrating. This module puts in a configurable banner that makes it clear which version of the site you are working on. It lets you have no banner on your live site, which is the default most of us would prefer. Configuration can be held in your settings file, meaning that it does not get overridden during normal development procedures. Super useful and highly recommended.
- Security Review (security_review): This module was developed by members of the Drupal security team and is really useful for helping you make sure you have no obvious holes in your site's security, as well as notifying you of certain other things, like repeated attempts by a bot to gain access to your site.
General Site-Administration and Form-Handling
This section covers modules that improve the user interface for middle to high-end site developers and content maintainers.
- Admin (admin): While the previously mentioned Administration menu module is suited to more advanced users, most general site content maintainers prefer something simpler, nicer to look at and more intuitive. The Admin module does this by providing UI improvements to the standard Drupal admin interface and a really cool sidebar that you can show/hide. It is often used in conjunction with the Rubik theme as the admin theme.
- Vertical Tabs (vertical_tabs): You know how folks often complain about those mile-long drupal forms? This module fixes that in such an elegant way that it is going to be in Core for Drupal 7 onwards. It sucks much of the admin forms into a side-tab structure with dynamic tab names, making the forms shorter, easier to use and nicer to look at. This applies, amongst other things, to editing nodes, blocks and CCK types. Configuration options allow you to choose which form elements to include in the Vertical Tabs structure. We had a lot of mysterious problems using this module so the solution was not without its challenges. Nobody else has reported the same problems, including me and I've used this module on other sites. It does what it does pretty well, though.
- Filter Permissions (filter_perms): Too many roles and too many modules/content can make the permissions page a nightmare. This module lets you filter the permissions page by role/s and by module/Content, making it much simpler and more manageable. Really useful.
- Module Filter (module_filter): Add a bunch of modules to your site and your modules page becomes enormous and cumbersome. This filter will allow you to have an autocomplete search for your modules. As you type your module list automatically thins to only show modules that match your text. It also has an option to group your modules into tabs. Really nice to have.
- Content Management Filter (cmf): If you, like many of us, find the node list at /admin/content/node too limited, then this module will give you an out-of-the-box alternative with a lot more options. If you want more control and some additional functionality, consider using the next module.
- Views Bulk Operations (views_bulk_operations), A better, more-customizable tool than CMF, this module allows you to use Views to build the node list you would like. An add-on to VBO is Views Hacks, which will, among other things, help you bring order to the chaos that is the blocks page. This is an awesome module that really lets you take charge of your content administration lists.
- Node form columns (nodeformcols) This module lets you customize the edit forms for the administrators back-end, or any edit form, for example a blog entry or a much more complex node (e.g. our our awards). I wish it would let you set an overall default for all content types, but aside from that I don't know how I'd do without it. I'd call this module a must-have for any site where the user-friendliness of content maintenance is a priority... and that should be most sites out there.
- Wysiwyg (wysiwyg): This module is really a must-have module for most sites. It gives you a common interface to a number of WYSIWYG editors, like TinyMCE (the editor we chose), FCKeditor, jWysiwyg and others. You can install one or many of these editors. You could use one for your administrators and another for your forum guests. We decided to go with TinyMCE for all our needs. KISS and all that (Keep it Simple, Stupid). This module also helps you customize those editors easily and extensively. Having worked with a WYSIWYG editor directly, without a module like this to help me, I can tell you that this is one magnificent, time-saving chunk of code.
- Better Formats (better_formats): This module lets you add a lot more flexibility to Drupal's core input format system. It will let you specify which input formats are allowed for a content type and it will also let you set the defaults by role. Coupled with the Wysiwyg module, you can even have different WYSIWYG options by role. I can't remember having a Drupal site where I did not use this module.
- Diff (diff): This module works with the core node revisions giving you a great way to view changes to any content. It lets you see the difference between any two revisions of content in an easy-to-read side-by-side layout... and it works out of the box. No configuration options, just download it and turn it on. Your users will love this! So will you.
- Nice Menus (nice_menus): This module was used to create the menus you see in our header, both the main mouse-over menu and the jump-to menu. It was also used to build many of the internal sidebar menus, for example the one you see on our Responsive Grants page. In some cases a module like Menu block (menu_block) is a better choice, but we had some specific use-cases that made us lean to Nice Menus instead.
- Node clone (node_clone): This module lets you clone content by putting a clone option pretty much anywhere you normally have an edit option. It is really as simple as giving you the ability to make a copy of any piece of content that you have. It's really invaluable at times, particularly when wanting to create similar pieces of content. I never build a site without this module.
- Scheduler (scheduler): This module lets you create content that is unpublished and that gets published at a future date and time that you specify. It also lets you unpublish content at a future date and time that you specify. Most content maintainers (e.g. bloggers) find this module to be invaluable and its the kind of thing that is included in core on simpler content management systems.
SEO and URL Handling
This section covers modules that help you improve and/or track your search engine optimization and URL handling.
- Global Redirect (globalredirect) This module is an SEO must-have and it is also really easy to set up and works pretty damned well with just the default configuration options. It removes redundant URLs and the illusion of duplicate content that they create, and these are nearly unavoidable with Drupal, especially if you are using the Pathauto module (which you should be) and clean URLs (which you should be). Instead, it has all redundant URLs redirect to a canonical alias for the page path. This pairs nicely with Path Redirect, which redirects users from old page aliases to the current canonical alias. I'll never again build a site without this module.
- Google Analytics (google_analytics): Most of us depend pretty heavily on some or other site analytics tool that tells us more about who's visiting our site, how many of them there are, which pages are most popular, and so on. It our case we use Google's free Analytics service. This module allows you to drop the Google Analytics snippet into every page of your site, which will then allow you to track and later use all the great free analytics data that Google Analytics provides.
- Nodewords (nodewords): This module allows you to both manually and automatically add meta tags to Drupal pages, which may help obtain better search engine positioning.
- Page Title (page_title): This module gives you granular control over the page title, which can greatly enhance your websites SEO.
- Pathauto (pathauto): This module is one of those "must have" modules that every site should use. I believe it came third in the recent Packt Publishing survey of the most popular Drupal modules and it currently has around two hundred thousand sites using it. It automatically builds you a meaningful URL from the title of the content. For example, you can see that this page has the url of "http://www.mmt.org/blog/drupal-administration-recipe" instead of the more generic Drupal URL of "http://www.mmt.org/node/16703". The "/blog" part was added automatically, based on rules I set up, and the "/drupal-administration-recipe" part was built from the title of this blog entry.
- Path Redirect (path_redirect): This module allows you to specify a redirect from one path to another path or to an external URL.
- XML sitemap (xmlsitemap): While the Site map (site_map) module mentioned elsewhere on this page creates a nice human-readable site map, this module helps search engines to more intelligently crawl your website and keep their results up to date. The site map created by the module can be automatically submitted to most major search engines.
This section covers a suite of image-handling modules that we use as a combined recipe for controlling most images on this site. Together they made image handling much easier allowing us to do things like automatically create several different sized versions of an image as needed for different scenarios, e.g. sidebars versus the main content areas versus thumbnails for lists. Also to automatically create a resized image on the fly when a user manually resizes an image, for example while editing a blog entry. So whereas on some sites a user might upload several huge images and resize them to something small, the reality is the full huge images are usually loaded and then resized using HTML, which is a concern for bandwidth and efficiency. Not so on our site. If a user resizes an image then a new smaller image is automagically created (end replaced as many times as they redo this) and the result is smaller images and better efficiency and load-times.
- ImageAPI (imageapi): This module is used by other image modules in this section.
- ImageCache (imagecache): This module is a must-have on any site with images. It helps you create presets for images and automate much of your image handling.
- Image Resize Filter (image_resize_filter) A fantastic module to aid in adding images to nodes, like blogs. Helps by also controlling the file size of the images automatically. Fantastic module.
- Insert (insert): This module makes inserting images and links to files into text areas or WYSIWYGs much easier and keeps them better organized.
- Lightbox2 (lightbox2) This module allows you to overlay images and videos on the current page in a super user-friendly and pretty way. It integrates well with other modules, like CCK and Views. For an example check out our gallery page and click on any image. I love this module.
This section covers modules that help keep those dastardly spammers from reaching you through your contact forms or email addresses, or your site visitors through comments and forums. They also help keep spam bots from gaining access to your site by creating "fake" user ids. These suit our needs, but if you have more of a community site you might want to look into some of the more powerful community moderation modules. A possible addendum to these modules could be this Drupal snippet I wrote and shared that produces a report on SPAM attackers based on CAPTCHA blocking. I've found it pretty useful.
- CAPTCHA (captcha): There are a lot of ways to protect your site from spammers and CAPTCHA is probably still the best of them. This module will let you add a CAPTCHA challenge to almost every form on your site, including user registration, comments, web forms and more. It also gives you some control over when challenges appear, for example you can make anonymous users supply CAPTCHA before posting a comment, but can allow logged-on users to skip the CAPTCHA. I don't know how you do without this module on a modern website.
- CAPTCHA Pack (captcha_pack): This module contains several lightweight and more user-friendly CAPTCHA types for use with the above CAPTCHA module. At one point we were using one of these options to provide site visitors with a list of philanthropy and nonprofit related words and have them tell you, for example, the third one. Strictly speaking we no longer use this module as we were getting too many spammer-bot break-ins, so we now use the reCAPTCHA module (see below) instead.
- reCAPTCHA (recaptcha): This module lets you use the free and popular Google-affiliated reCAPTCHA web service to improve the CAPTCHA system. So far this (along with Spamicide below) has proved extremely effective and currently keeps out more than 98% of the spam attempts on our site.
- Mollom (mollom): EDIT! We added this module in August 2012 because the spam bots were starting to beat reCAPTCHA with alarming regularity and the underlying modules were not getting updated any longer. We had initially planned to use Mollom instead of the above three modules, but their upper limit for their free service was too restrictive. Since then Mollom's upper limit changed from 100 blocked spam attempts to 100 successful comment posts, making them a viable option for us, so now we are transitioning from the above three captcha modules to Mollom. It is a service from Drupal's founder and is free for smaller sites and nonprofits, but there is a cost for sites with more traffic. It is also more of an intelligent service in that it only asks for a CAPTCHA response if it thinks the content typed in is spam, meaning most real people posting real comments will never see a CAPTCHA challenge and therefore making it far more user-friendly than reCAPTCHA. It also uses community sharing and other tracking to automatically block known spammers and tosses in an additional honeypot to boot. So far we're thrilled with the results and saw an immediate improvement, but are waiting for the next intensive burst of non-spam commenting before making the final switch.
- Spamicide (spamicide): This module compliments the CAPTCHA module in a clever way by using a honeypot, i.e. by adding a field that only spam bots see (hidden from humans by CSS) and that the bots want to fill. Then it blocks any form submissions where that field is filled in. I noticed an immediate improvement after adding this module to my arsenal and it blocked more spam attempts than reCAPTCHA. Plus I love the elegant simplicity of it.
- Comment Closer (commentcloser): EDIT! We added this module in March 2012 because the spam bots were getting smarter. To limit what they could do we decided to close all commenting on blog posts older than 3 months. This module lets you do just that (done automatically by cron at intervals you choose, assuming you're running cron regularly) and will let you set different timelines for different content types. For example, if we wanted to we could also have set Forums to 9 months and stories to always have commenting. You can also turn on an option that tells visitors either that the entry is closed to comments or when the comments will be closing. This had an instant impact on the volume of comment spam we received, which was already quite low because of the above modules... but we have a very low threshold for spam. Super easy to install and use.
Modules That Drive Your Content and the Viewing Thereof
This section covers modules that are used by almost every Drupal site, namely CCK and Views. In broad terms CCK allows you to build complex content types that can then get added to your site (or edited/deleted, plus simple viewing of the data) and Views helps you put them on display by building really flexible reports and lists. Our staff page and our gallery page are both examples of CCK used with Views. Each shows content created using CCK, a staff content type and a gallery content type. CCK gives you powerful forms which allowed us to easily populate our site with staff member info, and gallery images and their blurbs. Clicking on any of the staff members or the link beneath any of the gallery images takes you to a simple CCK view of that information. Complimenting this, we used Views to create the lists you see on both pages, but also most of the blocks in the sidebars of those pages. In fact most of the sidebar blocks on this site were created using views, be they lists of the latest few blog entries or a simple teaser of the latest newsletter. Some of those blocks are context sensitive, showing content that is related to the current content in focus. This is some of the most incredible open source or closed source software I've seen. Fantastic stuff. Don't be shy. Play with these 2 modules, learn them well and you will be able to accomplish 80% of most site's needs without loading another content module.
Both CCK and Views are utterly brilliant modules and Drupal would simply not be Drupal without them. This section covers them and some of the modules that add functionality to them. It also covers the Panels module, another fantastic module. Panels gives you great power and flexibility in designing and building page layouts.
- Content Construction Kit (cck): This module is mostly referred to as CCK and is explained above and in greater detail on their project page. In a recent Packt Publishing survey CCK was voted the 2nd most popular Drupal module and is used by at least a quarter of a million Drupal websites. Much of CCK will be in core from Drupal 7 onwards... and it's about time!
- Views (views): This module is explained above and in greater detail on their project page. In a recent Packt Publishing survey Views was voted the most popular Drupal module and is used by well over a quarter of a million Drupal websites. It can handle almost everything CCK throws at it... and more. When you get to know it better it becomes more about the few things it can't do than about what it can do. By far the module most used to produce this site and some of its niftier aspects.
- Email Field (email): Not all fields are equal and email addresses require their own validation and processing rules. This module extends CCK in order to cater for email addresses. If you hold email addresses as content then you need this module.
- Embedded Media Field (emfield): This module extends CCK to allow it to have fields that hold embedded media content, like videos, images, audio clips and more. A quite remarkable module really. Super powerful and it really works with a whole range of media providers, like YouTube, Flickr, Hulu, Facebook, NPR, etc. Our videos page is a great example of this module in action. All the videos you see there are actually stored on YouTube and only appear to be a part of this site.
- FileField (filefield): This module extends CCK to allow it to have fields that hold pointers to files that you upload (from a user perspective, they hold files). Most images, PDF files and other documents you see on this page were uploaded using this field.
- FileField Sources (filefield_sources): This module beefs up the FileField module by allowing you to select new or existing files through additional means, including reusing files via an auto-complete text field and transferring files from other servers.
- ImageField (imagefield): This module extends the FileField module in order to provide fields with image-specific functionality. If you hold images as content then you need this module.
- Link (link): Not all fields are equal and URLs require their own validation and processing rules. This module extends CCK in order to cater for URLs, including functionality that allows you to have a separate URL and title. If you hold URLs as content then you need this module.
- Panels (panels): This module helps you create multiple customized page layouts. It is filled with powerful tools that cover everything from a drag and drop content manager to the ability to cache data. This is a magnificent module of use to most sites that can give a lot of design control to developers and site maintainers... even to advanced content maintainers. Almost every splash page, including our front page and our Apply, Learn and Connect pages, was created using Panels. We were able to create these pages in such a way that swapping from a 2 column to a 3 column layout is relatively trivial. I think everyone should at least play with panels. Chances are you'll use it often.
- Views Accordion (views_accordion): This module extends Views in order to allow content to be displayed in nice accordions, like the one on our Responsive Grants page (click on a bar to show or hide its content). It's one option for making long pages of content far more readable.
Modules Adding General Functionality.
This section covers all manner of modules that add to the site's functionality in a host of different ways.
- 404 Blocks (blocks404): This module helps improve the default "page not found" page by keeping the site design and structure intact. As an aside, Drupal makes it really easy for you to customize the 403 (you have no access to this content) and 404 (this page does not exist) pages and it is advisable to always do so.
- Calendar (calendar): This module extends Views and Date API to provide the kind of calendar functionality you see on our own Calendar page. It's no match for Google Calendar, not remotely, nor is it meant to be as very few of us need that level of calendar. For very little upfront work you get a pretty decent little calendar of events.
- Comment Notify (comment_notify): At the bottom of this page is the comment form where you can add your comments to this blog entry. You also see a checkbox titled, "Notify me when new comments are posted" that you can check if you want to stay a part of the conversation and be notified of any followup comments. This module provides that functionality and the associated "unsubscribe" functionality.
- Comment Mail (commentmail): This module sends an email to administrators notifying them whenever a new comment has been posted to the site. This is very useful for ensuring that we engage in conversations and also in rapid response to the rare spammer that breaks through our defenses. Links in the email allow for quick approval, editing, deletion, and even for banning the poster's IP address. This one is so useful to us in combatting spam that I almost included it in the spam section.
- Contact Forms (contact_forms): This module expands Drupal's default handling of contact forms and allows for the creation of distinct contact forms for individual emails, even external emails, rather than having to select a category.
- Content Profile (content_profile): Drupal gives you basic user profiles for everyone who registers a user account on your website. There are a number of ways to extend these profiles, but the one that suited us the most at the time was this one. Essentially it lets you create a standard CCK content type, and then attach it to your user page. This let us create our extended staff and trustee profiles and then to include them in views. You can see my own 2010 staff profile for an example of a full profile that integrates with the base Drupal profile and our staff page for an example of a view using it. This module did a lot for us and we could not have done without it, but I do wish the integration with the default Drupal profile was less... clunky. Fortunately, in Drupal 7 CCK will be integrated into user profiles in core.
- Context (context): This module is right up there as one of my favorite modules. You might have noticed that our website is divided into three primary sections, namely Apply, Learn and Connect, and that each section has its own color scheme. Context really simplified this process for us. It also gave us new and far more flexible ways to handle sidebar blocks. Every Drupal developer should try this module. It is so awesome that many site developers even use it to replace Panels! Play with it. You won't be sorry.
- Custom Breadcrumbs (custom_breadcrumbs): The complexity and volume of content on our site often meant that we sometimes overwhelmed Drupal's default breadcrumbs and we wanted to override them at times. This module allowed us to to just that. It's really useful if breadcrumbs matter to you, and we wanted to keep them because our site has a goal of making all content as easy to find as possible.
- Date (date): This module provides both a flexible date/time field and a Date API that other modules can use. See the Calendar module above for most of our usage of this module.
- Frequently Asked Questions (faq): It is entirely possible to create your own FAQ page using CCK and Views. This module gives you all that out of the box and more, including a standardized "best-practices" approach with some decent show/hide functionality and some great drag-and-drop sorting functionality to really simplify FAQ handling. I was also happy to see the functionality grow while I used the module, meaning that simply by taking a few minutes to upgrade the code, I received many hours of FAQ enhancements for free. Don't you just love open source? See our FAQ page for an example and know that this tool makes it extremely simply to edit, delete or reorder any of those questions and/or question buckets.
- FeedAPI (feedapi): We use this module to pull in RSS feeds from other websites so that we can hold that content here and not be subject to the vagaries of those sites' up-time and/or response time which can in turn affect your own site's response times and appearance. See our Twitter page for an example. However, this module has been replaced by the Feeds (feeds) module and going forward you should use Feeds instead of FeedAPI. Making this change to mmt.org is on my to-do list, but it is a low priority. If it ain't broke, don't fix it, and all that.
- Feed Element Mapper (feedapi_mapper): This module extends FeedAPI that lets you take more control of the RSS feed and the interpretation of its data. As with FeedAPI above, it needs to be replaced by the Feeds module.
- Printer, e-mail and PDF versions (print): This module adds the Print and Send to friend options you see at the bottom of this blog entry. It can also give you a "send to PDF" button. It's quite configurable and really useful and seems to get quite a lot of use on our site.
- Quick Tabs (quicktabs): This module gives you a tabbed structure for organizing content. At one point we were quite keen on this approach, but it didn't entirely work out for us and we used different approaches, but we do have a couple of remnants. You can see an example on our staff page (one tab for Before images and one for After images) and a quite different example is the Popular Content sidebar block you can see on our Jump-To page.
- Search config (search_config): This module gives you a measurable amount of control over the Drupal site search and what content and taxonomy you want people to be able to search or not search. This is an area I very much want to revisit... one day... when extra time magically appears.
- Service links (service_links): This module creates the buttons at the bottom of this blog that allow people to share a given blog entry (and other selected content) with friends on their favorite social media sites. It actually caters for a much larger list of slink-sharing sites, but we decided to go with a more limited selection. There are other modules out there that provide similar functionality and it's an area of so much growth that it's always a good idea to revisit all the options.
- Site map (site_map): This module produces a configurable site map, complete with RSS feeds. You can see our site map for an example. This is another one of those modules that I end up using on every site I make. You get so much for so little effort.
- Tagadelic (tagadelic): Tag clouds are not as popular as they used to be and some people feel their day is done and that they are now quite passé. Others love tag clouds and they do still have their uses. We make some limited use of tag clouds on this site and this module is what produces them. You can see an example in the sidebar of this very page and another in the sidebar of our blog feed.
- Webform (webform): This fantastic, highly-configurable, super-powerful module can build you any kind of web form you need. We have used web forms to accept job applications and we use the now for accepting initial emergency grant requests and for all of our contact forms. This is another module that I usually include in every site I build. Invaluable, quality module.
This section covers modules that help speed up your site. This does not include things you can do to spruce up your sever-side efficiency, like installing APC to speed up your PHP. It should also be noted that our needs are modest. People with more hardcore needs often turn to modules like Boost (boost), which provides static page caching for Drupal, enabling a very significant performance and scalability boost for sites that receive mostly anonymous traffic. There are also quite a few other performance and scalability modules out there for you to consider and this article on Drupal caching, speed and performance is well worth reading.
- Block Cache Alter (blockcache_alter): This module gives you much finer grained control over the caching of your site's blocks, letting you determine a range of options on a block by block basis, for everything from not cacheing the block through cacheing the block once per user all the way to caching the block once for everyone.
- Memcache API and Integration (memcache): This module provides integration and overview for Drupal to work with either one of the two PECL memcache packages: memcache PECL package or memcached PECL package.
Modules That Aid in Data Conversion and Inter-site Communication
This section covers modules that we used to convert data over from our old Movable Type site and that we use on an ongoing basis to import updated award information to this site from GrantIS, our grant application system. Angela Byron, the Drupal 7 core maintainer, wrote a great tutorial on how to use these modules that is well worth checking out. This is not the only option out there and it is well worth looking at other approaches, for example the Deployment (deploy) module. A good resource is this article comparing a host of import and export modules and another article covering contributed modules for migration, deployment, backup, and import.
And how did this suite of modules work for us? Marvelous. Did a bang-up job and still gets used on a monthly basis for updating the latest awards. After doing the initial setup, I get the monthly import done by dropping the data to be imported into a table in this site's database and then use Drush to execute the shell-script command drush migrate-import 6 --feedback="120 seconds. That simple.
- Migrate (migrate): This module provides a flexible framework for migrating content into Drupal from other sources. Quite simply, it's bloody fantastic. It works well with Drush and makes great use of the other modules in this section.
- Migrate Extras (migrate_extras): This module extends the Migrate module to allow better integration with many of the non-core Drupal modules.
- Schema (schema): This module allows modules to declare their database tables in a structured array (similar to the Form API) and provides API functions for creating, dropping, and changing tables, columns, keys, and indexes. It is used by Table Wizard (below).
- Table Wizard (tw): This module facilitates dealing with database tables, allows you to access any of them through Views, define relationships, analysis and so on, as well as providing an API. Table Wizard is another module that has since been deprecated in favor of a newer shinier module, namely the Data module. Making this change to mmt.org is on my to-do list, but it is a low priority. another case of, if it ain't broke, don't fix it.
Modules Used By Other Modules
This section covers modules that mostly factor in to the usability and functionality of other modules, mentioned here mostly for the sake of completeness as you can use them when developing your own modules too.
- Advanced help (advanced_help): This module allows module developers to store their help outside the module system in HTML files.
- Chaos tool suite (ctools): This module is primarily a set of APIs and tools to improve the developer experience.
- jQuery UI (jquery_ui): This module provides a wrapper around the jQuery UI effects library that lets module developers add nice effects to their code. In fact this module became such a mainstay that it is included in core for Drupal 7.
- Token (token): This module provides a central API for modules to use tokens and expose their own token values.
This section covers modules that we wrote for our own specific needs. As I mentioned earlier, we really tried to use contributed modules as much as possible in order to show what could be done with Drupal with very little customization. All of these modules are very simple. Internally I made them all part of the same Drupal package. If you would like to know more about any of them, then feel free to contact me, or better still, add a comment below so that others can also benefit from the answers.
- Author Info and Feeds: This module builds a block in the second sidebar (right) that shows buttons linking to related information for the author of whatever blog entry is in focus. Currently this is a link to the author's blog and a link to the RSS feed for their blog. You can see an example at the top of the right-hand sidebar of this blog entry.
- Custom Theme: On the night before we launched this site we discovered that some tweaks to the way we did user permissions had resulted in the default administration form being inaccessible to non-staff users of our site, resulting in a forum edit form that was without any styles (essentially text only) and did not function correctly. The themer and I quickly churned off a module that would allow us to override the administration theme for some content types and roles (non staff-members), showing them the default MMT theme (the design you see before you now) when editing. Administrators see the spiffy internal administration theme we set up for them... and a whole lot of additional functionality. Users not logged in are unaffected.
- Navigation Tab Display: This module builds the custom tabbed header for the three main focus areas (Apply, Learn and Connect) that you see at the top of every page except the front page, and marks the active tab. Our design was slightly unconventional and this module allowed us to place the tabs where we wanted them, to build them in a way that was most useful and to give us maximum control over their appearance.
- Program SubMenu Display: This module sets up a customized sub menu for the right sidebar on our program splash pages that programatically builds the links to a range of related content pages, like FAQS, what we look for, related stories and past grants. You can see our Responsive Grants page for an example. The module determines which URLs to add to the menu based on the program type in focus.
- Program Finder: This module provides a distinct rules-based piece of functionality that will help an applicant decide which (if any) of our grant programs is right for them, by guiding them through a step-by-step series of questions that lead either to more questions or to a suggested program. It makes use of some simple jQuery show/hide functionality and is sadly full of hard-coded logic. It is on my to-do list to make this a more customizable module and it would likely be a great module to contribute back to the community. One day... If you're interested you can try the tool out for yourself.
- WYSIWYG Heading Buttons: Pretty much exactly as it sounds, this module adds heading buttons to the TinyMCE WYSIWYG editor to allow users to wrap highlighted text in HTML heading tags (H1, H2, H3 and H4) at the click of a button. This seems like the kind of thing others might find useful, so the code for this module is available on Pastie, if you'd like to see it.
Theme Simplification Modules
This section covers modules that aided the themer who did our site design and all of the custom theme code.
- Block Class (block_class): This module lets designers escape some potentially very tricky CSS by allowing administrators to add classes to any block through the block's admin interface.
- CSS Injector (css_injector): This module allows administrators to inject CSS into the page output based on configurable rules. It allows non-themers to bypass the theme, but in our case it occasionally allowed us to bypass a quirk of the theme.
- Equal Heights jQuery (equalheights): This modules implements a jQuery Equal Heights plugin that can equalize the height of the elements of the specified class. We use this on almost every splash page, including our front page and our Apply, Learn and Connect pages, to ensure that the blocks in the main content area have the same eight.
- PNG Fix (pngfix): This module includes a jQuery PNG Fix to correctly handle PNG transparency in Windows Internet Explorer 5.5 and 6. Yeah, we went there.
This section covers the Drupal themes that we used. On the admin end we used a simple admin-friendly theme that works well with our admin module choices and the theme you are seeing now is a custom theme created for us, but as an extension to another Drupal theme. We're extremely happy with both as we've ended up with a CMS that does not look like "just another CMS design" and a back-end that is super-sweet and user-friendly.
- MMT: This is a custom theme built for us by Theresa at Pridemore Design. It uses the Drupal contributed theme Tendu as a base.
- Rubik (rubik): This theme is built using the Tao theme (see below) as it's base. It is a clean admin theme designed for use with the awesome admin module. It features a set of icons for admin pages provided by Drupal core and aggressive styling to reduce visual noise wherever possible. I totally love it and so does everyone who has ever seen and/or used our back-end admin interface.
- Tao (tao): This theme is a base theme for Drupal that is all about going with the flow. It is the base theme for the Rubik theme, our admin theme of choice.
- Tendu (tendu): This theme is a Wireframe BiDi Theme for Developers. It is based on the Zen theme, which was voted the most popular Drupal theme in a recent Packt Publishing survey, and with good reason. Zen is a great option for most sites.
This section contains a few useful links for those of you considering Drupal 7.
- Drupal 6 contributed modules that are in Drupal 7 core - a super useful list
- Acquia's presentation on Drupal 7 - The Top 40 Core Modules and What They Mean for You - pertinent to the modules listed here and to understanding Drupal 7.
- The Drupal 7 home page - a fairly elaborate Drupal release page that is loaded with useful information.
- Acquia's Drupal 7 page - Drupal's founder's company always has good Drupal information and this page is useful, with little gems like this video on Making Drupal 7 Simple to Use for Everyone
It's a wrap! I hope you found that useful in some way! Please leave a comment below if you have any questions, comments or suggestions.
Commenting on this Blog entry is closed.