Chapter Three LLC

Dave Cohn's "Drupal Nation"

Josh Koenig

My friend and sometime colleague Dave Cohn (of Spot.us fame) has posted the story that was his final Masters project at the Columbia School of Journalism. Entitled Drupal Nation, it traces the early roots of Drupal in left-wing US politics via DeanSpace and CivicSpace, which is really where my engagement (and the essence of Chapter Three) comes from.

Though the piece is dated — Cohn wrote is just after Drupal 5.0 was released — it’s an interesting read for those interested in the intricate and delightfully ideosyncratic early history of Drupal’s rise within the US non-profit and political marketplaces.

Chapter Three Goes Gold

Josh Koenig

Chapter Three is an Acquia Gold PartnerIt’s with great pleasure that I announce that Chapter Three is now an Acquia Gold Partner. This is a move that makes perfect sense to us as a business, and I’d like to quickly make the case as to why.

Drupal Market Growth

Acquia’s business depends on the continued growth of the Drupal marketplace. It’s simply essential for their success, and the more people who are using Drupal, the better off we all are. Moreover, Acquia is proactively marketing and selling the platform in enterprise markets and new verticals, which is going to pay huge dividends down the road.

I believe in this because of what we experienced with a plucky little upstart organization called CivicSpace. The work that Zack, Neil, Kieran and others did back in 2004 putting together a packaged Drupal distribution and making an energetic effort to evangelize it to the world of non-profits resulted in a huge spike in interest in Drupal from that world. This persists as a cornerstone of the present-day Drupal market. I’m hopeful that Acquia will have similar success, especially as over the past four years, Drupal has grown into a much more mature platform with a much clearer value proposition vs. proprietary CMSs.

Business Development Pipeline

Following on the above, one of the reasons we wanted to jump on the Acquia partner bandwaggon is, frankly, to work with more and better clients. While we’re all capable representatives of our business and of Drupal — and we think our portfolio is pretty dang impressive already — our passion is in the work: the conception, planning, strategy, design and execution; not so much in the sales process.

While we’ve never had a shortage of business inquiries (now accepting RFPs for winter/spring 2009) it’s also true that the best and brightest prospects often require a proactive business development effort, and a lengthy courtship. We see Acquia as helping our firm in this process by laying the groundwork and making qualified introductions, letting us remain focused on our strengths.

Long-Term Support

Unlike many web development shops, our model is based around building up exciting new projects, not long-term support contracts. However, clients still often want and need longer-term Drupal support. While we’ve had good experiences addressing this by building capacity — training and limited expert-support for internal experts — the simple truth is that many of our clients would feel a heck of a lot better with a traditional tier-1 support resource. This isn’t something we can realistically provide, but we hate saying no. Enter Acquia.

The ability to offer them the piece of mind that comes from using Acquia’s commercial support gives everyone what they want: we can move on to the next big challenge with a clear conscience, our clients get world-class support for their Drupal website, and Acquia gets subscribers. That’s a win-win-win situation.

In Conclusion

We’re glad to be on board with Acquia and with the development of Drupal into a viable commercial product powerhouse. We’re already seeing benefits in the marketplace, and although the overall economic picture points towards some slowing, the internet is now an integral part of every major economy and business. This marketplace isn’t going away.

In fact, in this economic context, I think Drupal is a good bet. With budgets tightening, clients will be looking much more seriously for value. As expensive proprietary software-as-service licenses come up for renewal, we expect to see more conversions to Drupal as businesses and organizations continue making the leap away from costly/brittle proprietary systems and embracing the freedom, flexibility and bottom-line value of commercially-supported Open Source.

(Also, we chose gold because we have to stay one step ahead of our flat hat awesome friends at Zivtech)

Getting By With A Little Help From Your Friends

Josh Koenig

It’s no secret that I started my Drupal career in politics, coming up as part of a self-organizing band of web-savvy volunteers creating a little thing we called “DeanSpace” back in the summer of 2003. However, while about 1/2 of Chapter Three’s business does come from the government and non-profit sectors, we’ve done virtually no work on elections directly. It’s not that we don’t care, but because it seemed to make more sense to build our business by establishing ourselves as Drupal experts in San Francisco and Silicon Valley, ironically a much less crowded market compared to Washington DC.

Still, we’ve stayed connected, and when I met two of the founders of Music for Democracy at this summer’s Netroots Nation conference, I couldn’t help but want to get involved, given my own history with Music for America in 2004. The result of that collaboration is finally out, just in time for one of the most pivotal elections in US history:


Using Drupal and Flex, we created a viral widget which interfaces behind the scenes with the SayNow web service. Users sign up and receive a confirmation phone call with a message from the artist of their choice. On the day of the election (or any other time an artist chooses) they’ll receive another voice message reminding them to vote for Obama.

Drupal provides the glue here, creating a platform for organizing the information around the widget and tracking signups as they’re passed through to SayNow. It’s a great illustration of an emerging concept I like to call Drupal in the Cloud, which basically boils down to Drupal’s extremely API-friendly nature making it a natural hub technology for building websites which leverage external services. It’s really just an extension of Zack’s old Drupal is a Mashup Machine concept, but I think we’re starting to see ways in which the platform technology really begins to open doors in ways that “making a google map of some stuff” only hinted at.

It’s an exciting time for the internet, and as a candidate Barack Obama has a lot of great ideas about how the net can help the US (and the world) through many of the massive challenges we face. I’m happy to help use the net to give him that opportunity.

(note: the opinions expressed in this blog post are purely those of Josh Koenig, and are not necessarily reflective of Chapter Three LLC)

Columbus Day? Drupal Day!

Josh Koenig

Hot on the heels of an awesome BADCamp, we decided to take the holiday of Columbus Day and turn it into a much-needed Drupal Day! A lot got accomplished, and I for one am very happy about the results.

Drupal Dojo

My single greatest personal contribution to the community thus far hasn’t been code, but rather an idea, some video content, and six months worth of organizing. Nearly two years ago, I started the Drupal Dojo to help incoming developers wrap their heads around the open source project we all know and love. Seemed like something that was needed, and it was tons of fun and a great success, but in 2008 I haven’t been able to do nearly as much, and the group has become less active.

But now, with more and more A-list contrib modules ready to roll and a bunch of number of other factors — e.g. Acquia Drupal — on the scene, it feels like the same kind of moment for Drupal 6. I predict explosive growth in the developer community. And so, once again, I’m getting back in the game and will start producing a new set of Dojo lessons starting in November.

6.0 Releases

I also had time to clear out some issues, test some patches, and finally commit some long awaited code. The result is three new Drupal 6.0 module releases:

  • Up/Down: in the spirit of solving obvious problems, this is a solid and serviceable implementation of a plus/minus voting widget for 6.0. With initial code from Greg Hines and awesome token support by dmitrig01, it’s stable, secure and ready to pick up where good old vote_up_down left off. I really hope to turn this into a widget on par with the excellence that is fivestar.
  • Menutrails: officially out for 6.0, this brings some common-sense usability goodness to your Drupal site. Keep navigation menu items active, bread-crumbs under control, and dynamically assign your many nodes to automagically show up under the right primary nav elements.
  • Textile: still my favorite HTML shorthand. This one was easy thanks to trevorwining for the patch that made this possible.
  • OG Panels: not all the way there yet, but my patch to bring this into 6.0 made some real progress this weekend.

But Wait, There’s More!

In other exciting Drupal news, my colleague Jon Skulski got a patch to the 7.0 core marked ready to be committed. It’s really great to see people who only started seriously working with the system in the Summer getting up to the “I kick ass” threshold. Jon brings a lot of skills to the table, and with any luck we’ll be seeing more amazing things from him in the months to come.

Also, I believe we’ve recieved enough positive reviews on the Drupal for Firebug FireFox extension that it can graduate from “experimental” status, which is key for our next release. Still, if you’d like to help us out, write a review so the Mozilla folks will be more inclined to let users install the plugin without first signing up for an account and going through a scary opt-in process.

With jQuery integrated in the 0.0.5 version, we’re now able to do the kind of UI work that’s really needed to make sense of all the data we can dredge out of the system. We’re also set to make asynchronous calls for more information. Basically, we should be able to make DFF the programatic ying to the Theme Developer module’s yang. We hope to make it another invaluable part of the professional Drupal developer’s toolset.

All in all, it’s hard to hope for more from a good Drupal Day. With any luck, these will start to become a regular occurrence around here at Chapter Three!

Moblin.org Launches on Drupal 6.0 w/Menu Trails

Josh Koenig

Moblin.orgChapter Three is pleased to announce that Moblin.org, the developer community for a worldwide effort to build a better Embedded Linux platform (with the involvement of the likes of Intel), has re-launched on Drupal 6.0.

This is our first big project to get out the door on Drupal 6, and I’ve got to say it was a really great experience. Getting oriented was a bit of a challenge at first, but there are so many common-sense improvements to the Module API and Theme layers, it makes development easier than ever.

In addition to utilizing the latest releases of Organic Groups, CCK and Views, Moblin features a completely re-vamped and re-built Menu Trails module, which we’ve developed to add some usability goodness to Drupal’s default Primary/Secondary links and Breadcrumbs. Menu Trails allows individual nodes to automatically appear “under” an existing menu item based on their type, taxonomy, and now Organic Group. This is then reflected throughout the visible nav hierarchy, and now in the breadcrumbs as well:

Menutrails In Action

Look for an official 6.0 release within a few weeks, featuring all of the above, plus pathauto integration and more.

Moblin also features a number of developer-centric innovations such as shared authentication and status updates from Bugzilla, as well as project-level integration with Git for updates via RSS. These were developed on a custom basis since they’re particular to the back-end system architecture of the project, but in my opinion a huge part of the appeal of Drupal it’s power as a platform which allows for powerful custom integration to be developed rapidly, safely, and extensibly. Drupal performs very well at the center of a Web 3.0 “cloud”.

There’s sure to be more to come as the Moblin community rallies around their 2.0 launch and begins a big push over the next year. It’s quite encouraging to see this kind of synergy between Open Source projects. We at Chapter Three are definitely excited for what’s next.

HOWTO: Utilize Drupal 6-style "preprocess" theme architecture in Drupal 5

Josh Koenig

Once of the biggest advances “under the hood” in Drupal 6 is the addition of the preprocess architecture to the theme layer. This is part and parcel with the deeper embedding of template files, and together they render Drupal 6 the most flexible and powerful release yet in terms of theme and design.

For those of us who still do a fair amount of work with the 5.x branch, it’s easy to be envious of those lucky enough to have these new tools at their disposal. But resist that cardinal sin! This quick HOWTO explains how to quickly turn your theme into a node-preprocessing machine, which has great benefits in terms of elegant architecture, and also future-proofing your work for the eventual Drupal 6.0 migration.

Bulding off _phptemplate_vars()

Possibly the most powerful programmatic tool in the Drupal themer’s toolkit in 5.0 is the _phptemplate_vars() function. We’ve talked before about to use this to use different template files under different circumstances. Overall, this function is a great way to make all those minor changes that are needed so that a site can have truly top-notch appearance and user-interface.

However, once your theme gets to be very complex, this function can easily become an overloaded beast of logical branches. Each new node type or special case creating new complexity, and maintaining that as your site grows can quickly become untenable.

Fear not, though. You can also use this function to implement a simple preprocessing architecture that will help you customize the data in all your node types without creating a mass of template files, and set the table for 6.0. Here’s how:

<?php
function _phptemplate_variables($hook, $vars = array()) {
  switch (
$hook) {
    case
'node':
     
$node = $vars['node']; // handy shorthand
     
$preprocess = 'phptemplate_'. $node->type .'_node_vars';
      if (
function_exists($preprocess)) {
       
call_user_func($preprocess, $vars);
      }
      break;
    case
'page':
    

 
}
}

function
phptemplate_blog_node_vars(&$vars) {
 
// your custom preprocessing here
 
$node = $vars['node']; // handy shorthand
 
drupal_add_css($vars['directory']. '/custom_blog_style.css'); 
 
$vars['submitted'] = t('Blogged by !name on !date', array('!name' => l($node->name, 'user/'. $node->uid), '!date' => format_date($node->created, 'custom', 'm-d-Y')));
}
?>

Note that you don’t need to use phptemplate_ as the prefix here; indeed it may be advisable to use your theme_name.

What this function does is quickly check for the existence of a node-specific preprocessing function, and if it exists passes through the $vars array by reference.

In this case we detect that a blog node is being rendered, and take the opportunity to include a final custom stylesheet form our theme, as well as altering the standard $submitted var.

The possibilities here are endless, and in “enterprise theming” situations where you may be dealing with upwards of 25 (or even 100!) node types, having this kind of programatic structure in your theme is invaluable for keeping things clean, elegant and extensible.

Good luck, and happy drupal theming!

Chapter Three In The H.C.!

Josh Koenig

When we first started Chapter Three, I had just relocated to rustic Trinidad California in beautiful Humboldt County, experimenting with a different pace of life from breakneck bike-borne Brooklyn. Being out in the country gave me the focused time and low cost-of-living that were essential in bootstrapping our new business, but with Matt and Zack based in SF, we always knew that’s where the natural HQ would be.

While we’re all more than comfortable with the “virtual office” setting — and we still take advantage of that kind of freedom/flexibility to combine productive work and travel, as well as to meaningfully engage our network of partners and collaborators — there are few channels with more bandwidth than face-to-face, a fact that remains true even in the era of iChat, especially when it comes to understanding client needs. We made a decision early on to go for it, to have a real office, and opened our lovely lofty 3rd Street headquarters within the first six months.

I’ve spent quite a lot of quality time there since. It’s a great space that’s given birth to some great Drupal sites, as well as a San Francsico’s #1 Boutique Fixed-Gear Bike Manufacturer. Still, I always thought there was a lot of potential for a satellite spot up here in Humboldt (the “H.C.” as I like to call it).

There are a lot of other bright tech minds up here who prefer to make a living telecommuting and enjoying the North Coast quality of life rather than joining the fray down in Silicon Valley. Seemed like an opportunity to tap into a whole new pool of talent, maybe even prove a different kind of model.

The idea appealed to my sense of how the internet is shifting economic realities and allowing new opportunities for creative minds. In contrast to the typical model of money evaporating as citizens spend their wages at franchise chain-stores on externally-manufactured goods, which let store-managers and workers draw a paycheck, but move all profits outside the local area, here we’d be positioned to bring new jobs and new capital in from all over the world.

Well I’m proud to say that as of this week, that idea is now a reality.

HOWTO: Quick jQuery Usability Tip: Automatically Clear/Restore Useful Default Values

Josh Koenig

Just wanted to post this quick trick I’ve been using lately to automagically hide/show useful default text field values (e.g. “Search” in the search box) using jQuery and the ultra-handy Drupal.settings() object.

Here’s the short and sweet copy/pastable jQuery code:

$(document).ready(function(){
  Drupal.settings.inputDefaults = {}
  $("input:text").focus(function() {
    var element = $(this);
    Drupal.settings.inputDefaults[element.attr("id")] = element.val();
    element.val('');
  });
  $("input:text").blur(function() {
    var element = $(this);
    if (element.val() == '') {
      element.val(Drupal.settings.inputDefaults[element.attr("id")]);
    }
  });
});

Basically this quick snippit will add a blank array object (ahh, the joys of moving between js and PHP) to the Drupal.settings object — which is useful for all sorts of great javascript functionality, and is integral to Drupal 6.0’s extended AHAH features; if you don’t already know it, do your self a favor and study up — and automatically fill it with any textarea’s default values when a user clicks/tabs it into focus. This lets us clear the default value, but replace it quickly if the user moves on to another element.

As listed, you probably don’t want this on your site, as it will affect things like editing nodes (e.g. title inputs will go blank when you click on them… not what you necessarily want), but it’s easy to tune this to only hit elments within certain forms since every form in Drupal has a unique #id.

Thinking about this, I decided to tune it up and actually make an extended jQuery function for this so it could be more easily applied to speecific elements like so:

$(document).ready(function(){
  // handle hide/show for text field default values in only one form
  Drupal.settings.input_defaults = {};
  $("#specific-form input:text").clearDefaultText();
});

jQuery.fn.clearDefaultText = function() {
  return this.each(function(){
    var element = $(this);
    Drupal.settings.inputDefaults[element.attr("id")] = element.val();
    element.focus(function() {
      if (element.val() == Drupal.settings.input_defaults[element.attr("id")]) {
        element.val('');
      }
    });
    element.blur(function() {
      if (element.val() == '') {
        element.val(Drupal.settings.inputDefaults[element.attr("id")]);
      }
    });
  });
}

This is a pretty nice little plugin, I think, and it shows just how easy it can be to add nice/reusable UI functionality. Happy Drupaling, and go get ‘em jQuery!

(updated w/slight improvement to jQuery fn)
(updated again w/object style improvements from comments)

The Power of Organizing Without Organizations

Josh Koenig

I simply cannot recommend highly enough Clay Shirky’s new book, Here Comes Everybody: The Power of Organizing Without Organizations. He’s been the “smartest guy in the room” when it comes to the internets for a while now, resisting the lure of hype while still appreciated the revolutionary changes we’re all living through.

This particular passage struck me as an excellent summation of what Chapter Three is all about:

We are plainly witnessing a restructuring of the media businesses, but their suffering is not unique, it’s prophetic. All businesses are media businesses, because whatever else they do, all businesses rely on the managing of information for two audiences — employees and the world. The increase in the power of both individuals and groups, outside traditional organizational structures, is unprecedented. Many institutions we rely on today will not survive this change without significant alteration, and the more an institution or industry relies on information as its core product, the greater and more complete the change will be.

One of Shirky’s overarching points is that any specific technology is only a small part of the equation. What’s critical is that the technology is ubiquitous to the point of invisibility (as the web is rapidly becoming), and that new and helpful social practices emerge which make advantageous use of the new capabilities the technology offers.

Being a part of the Drupal community is fascinating in this respect because we are at once participating in an astounding phenomena (the peer-based production of an amazingly useful piece of software) and helping others use that tool, and the methods used to make the tool itself to pursue their objectives.

It’s a jungle out here, but I wouldn’t have it any other way.

Two New Screencasts in the Drupal Dojo

Josh Koenig

Yesterday I ran an impromptu lesson in the Drupal Dojo building on last week’s introduction of Druapl 6.0’s new theme layer enhancements, namely built-in template files and automatic preprocess_functions(). We covered a topic my colleague Matt blogged about a couple weeks ago: using template files to take control of forms, which is a great way to take your UI to the next level by making it much more designer-friendly.

Check the screencast here: Fine-tuning the UI: Theming Forms With Templates In Drupal 6.0. If you’re curious about that technique in version 5, Matt’s blog post is a good place to start.

Drupal Dojo

Also, by popular demand I made a short (6 minute) mini-lesson explaining the virtues of devel.module, again in the 6.0 context with the theme_developer tool featured prominently.

Syndicate content