DrupalEasy Quicktips are short, focused posts intended to accomplish a very specific goal. Quicktips are exclusively available first via our @drupaleasy Twitter account.

A Better Drupal API Documentation Site

The brainiacs over at Lullabot recently unveiled api.lullabot.com, their version of Drupal.org's API documentation site. While on the outset, it seems similar, there are some nice features of the Lullabot site that make it very worthwhile to use.

First and foremost, in addition to documentation for Drupal core, they also added the documentation for a large number of popular Drupal modules, including Views, CCK, and Ubercart.

Submitting Disabled Fields

The "disabled" attribute for form fields is a great little user interface helper that you can use to help protect data from accidental changes. It locks down an HTML input form element so that it can be viewed, but not be changed. This is handy when displaying a form to a user where you need an extra layer of protection for the data.

What happens when the user goes to submit a form with disabled elements? The value of the disabled elements are not passed back to the browser - this can quickly turn into a data validation and/or submission issue.

Your Best Friend When Theming Views

Views 2 for Drupal 6 was quite the upgrade for those of us who were comfortable with the original version. It was pretty much a stellar upgrade in all aspects, but it requires a bit of knowledge and commitment to reach the point where you feel comfortable and confident with it.

In my opinion, one aspect of Views 2 that doesn't get the attention it deserves is the fantastic template-based way that it handles theming. You can theme virtually any aspect of a views result by overriding any number of template file.

Module Development: Settings Variables in settings.php Using $conf

Sometimes you need to set some global variables in Drupal that aren't used by just a single module, but rather a set of modules. You can take advantage of the $conf array in your site's settings.php file to set these variables that your various modules can then access them using the "variable_get()" method.

For example, I have a client that pulls in some data from an external SQL Server database to their Drupal site. Data is pulled in by a variety of custom modules and they wanted to have a single, secure place to set the database connection information.

Module Development: Adding Form Fields via AJAX/AHAH

Adding form fields to a Drupal form dynamically is not the most straight-forward task. You'll see this occasionally on a Drupal form (poll module jumps to mind) when there is an "add another" button that (seemingly) simply adds another set of input elements to the form. The big sticking point in setting this functionality up is doing it in a way that keeps FormAPI's security intact. Fortunately, there's some tips to get you mentally started.

Module Development: Understanding Wildcard Loader Arguments

When writing a module from scratch (or trying to deconstruct one to figure out how it works), it might save you some time to be aware of "wildcard loader arguments" when using hook_menu(). These wildcard arguments are automatically linked with "_load()" functions that allow the module developer to load data into the argument anytime the menu item is called.

Here's a quick example of what I'm talking about. Look at this snippet from the Quicktabs module's quicktabs_menu() function:

Simple and exact image cropping

We all know imagecache is a great module to grab images of any size that are in your site's files/ directory, but sometimes it's hard to get every image to be the right size without black borders on the sides or top. The trick is to know the proper "order of operations".

Here's a fast recipe for square thumbnails that will work with landscape or portrait picture orientations:
Scale - width: 85, height: , upscale: No
Crop - width: 85, height: 85, xoffset: , yoffset: top
Scale And Crop - width: 25, height: 25

Why filter_xss() is a Friend to Module Developers

When writing custom modules, few functions are as useful as filter_xss(). In a nutshell, this function protects your web site from both malicious HTML and unwanted tags.

The function takes some text and, in effect, "cleans" it based on some very simple rules. First and foremost, it makes sure any HTML elements, tags, and attributes are well-formed. It also removes any non-standard characters and constructs that can trick browsers. Finally, it can remove any HTML tags depending on an argument passed to the function.

Print, Email, PDF That Page!

So often clients ask me for the ability to add an "email this page" or "print this page" option to their web site. Luckily, the print module does both these things - and more.

The module is a snap to set up and even offers the capability to print any web page as a PDF (using an external, free, open-source library). It has loads of options that allow you to tweak the position and language of the links and provides several theme functions that can be overridden so you can match the links to your site's theme.

Hide That Field!

So you have a content type that you created with CCK that has more than a few fields. In some cases, you don't want all of the fields to show up when viewing the full node - luckily, there's an easy way to hide individual fields without resorting to theming tricks or PHP code.

Simply go to the content type's "edit" page (assuming you're logged in as an appropriate administrative user) and click on the "Display fields" tab. From here you can hide or exclude individual fields from view in both teasers and full nodes.