My first ever Fuse blog post will focus on the Context module developed by the DC based Development Seed. With 29577 reported installs of the module, Context is quickly climbing the module ranks. It’s already part of our base install for all sites we work on here at Fuse.
Simply put, Context lets you determine specific reactions on a set of conditions. On every page load, it checks to see if any active contexts have conditions that have been fulfilled, and if so, it performs the reaction. To show you how it works I will give you an example of what can be achieved with Context. In this example we want to create an active menu trail for content tagged with a specific taxonomy term. That taxonomy term will be your condition and the reaction is the desired active menu trail. Here are the steps to take to make this work:
1. Install Context:
As of today, the latest version of context is 7.x-3.x, which is not that different from the version 6.x-3.0. I will be working with Drupal 7 version since we’re using D7 for all our new builds at Fuse. Install Context the usual way just don’t forget CTools, as it is a dependent module. In Drupal 6.x environment you will also need the jQuery UI module which provides you with an admin interface for some extra features. (D7 has the jQuery included within core)
2. Add a new context:
Under Structure > Context you’ll get a list of all the contexts you’ve created and a search bar. You should be looking at an empty list after installing the module.
On top you can +Add or +import. Lets add a new context for now (we’ll get to importing a bit later.) Adding a new context will prompt you for Name, Tag a description. The “Tag” field will be used to group contexts on the context listing page.
3. Set your conditions:
This is where you will set the various conditions for your context. As mentioned above, conditions are checked on page load, and if the condition is met, the configured reactions are performed. Context comes built in with quite a few default conditions that will probably, for the most part, fulfill your needs. However Context is fully extendible and there are already modules out there that provide new and exciting conditions and reactions. This extendibility is discussed further at the end of this post. For now, we’ll just go over the default conditions:
Context: The condition is met, if another context’s conditions are met. Perfect for recycling your already set context, if there are currently active contexts that you would like to base your new context on, the context option would be perfect for it. I hardly ever duplicate the exact same condition set between two or more contexts, but there is the odd time when I like to use a context I have already set and fine tune it (ie. create another condition on top of it).
Menu: Allows you to select any number of menu items. The condition is met when any of the selected menu items belong to the current active menu trail.
Node Type: Select from a list of node types. The condition is met when viewing a node page (or using the add/edit form — optional) of one of the selected content types.
Taxonomy: Your condition is met if the current node being viewed is referring to a particular taxonomy term. Don’t confuse this condition withTaxonomy term.
Path: Allows you to supply a list of paths. The condition is met when any of one or more paths match the supplied paths.
Site-wide Context: The condition is met at all times.
Taxonomy term: Will set the context when viewing the taxonomy term’s page (not a node that is referring to that taxonomy term).
User Role: The condition is met if the current user has one of the selected role(s).
User Page: Lets you choose from a list of ‘User’ pages. (i.e. User profile, User account form, Registration form). Condition is met when viewing the selected pages.
Views: This option will list all active views and their specific generated pages. This allows you to trigger your context for any pages that a particular view is active on.
4. Set your reaction:
Blocks: The blocks reaction is probably my most used reaction of all. It allows you to place any block in any region when the condition is met. This provides a much more flexible way to add blocks to the page than the blocks administration page (admin/structure/block) since you can use more than just the path as the criteria for when a block should be visible or not.
By drag and drop sort method vs. weight select sort method:
Breadcrumb: Set the breadcrumb trail to a particular menu item.
Menu: Set the Menu Active class
Theme Page: Override the section title and the section subtitle of the page. This will also override your $section_title and $section_subtitle variables within your page.tpl.php.
Theme html: Add an additional html body class to the page
5. Import / Export:
You can easily export an Context by clicking on “Export” (under Operations) on the Context listing page.
Having the Admin menu module installed, there is the handy context editor window for testing and editing contexts. Active contexts are easily detected and can be modified on the fly by adding conditions, blocks (drag and drop) and theme variables.
- Write Descriptive Descriptions! It sounds redundant, but the better your description is, the easier it will be to figure out which context is outputting “that block” in “that region” on “that page”.
- Use Tags Wisely! Tagging can be very useful since the contexts on the context listing page get grouped by tag. If you group your contexts intuitively using tags, you’ll spend less time finding your contexts and more time trying to figure out if we’re ever going to get multigroups back.
8. Extending Context using the API
As mentioned above, Context comes with an API to extend it’s functionality by adding custom conditions and reactions. An example of one of these modules is Background Images (built by Fuse’s own Chris Eastwood). It provides a new reaction that can change the background image of any css-selectable element on the page. While this tutorial will not delve into how to use the API to extend context (perhaps in another tutorial down the road?), I thought it was worth mentioning in case you need a condition or reaction that isn’t built-in. You know how it often goes with Drupal, if it’s not built-in, there may just be a module for that!