Dahon, headquartered in Los Angeles, California, is a globally renowned folding bike manufacturer. The company has offices in the US, Taiwan, and China, and sells its unique range of folding bicycles and accessories in over 30 countries worldwide. Dahon recently relaunched its online presence with a beautiful new website developed by Philadelphia based Drupal shop, Zivtech. The following is a run-down of how Zivtech developed the site to meet Dahon's usability and functionality requirements.
The Challenge
Prior to relaunching in Drupal, Dahon's online presence was represented by a main static English language site, surrounded by a collection of disparate multilingual child sites used to market and sell the company's products globally. The design of the main site was beautiful, but none of the essential content was connected or reusable, making it difficult for staff to update content, and for users to navigate the site.
Being a folding bike company, one of the main functions of the site was to feature individual bikes. Each bike had connected with it a unique set of accessories, components, news, reviews, etc., that needed to be added or updated individually by staff members. This proved to be problematic and inflexible, and often resulted in sync issues between the various content types, a problem further exacerbated by the company's continually expanding product range. It soon became apparent that the update burden was just too great for a company of this size, and that a dynamic solution was needed to bring everything together, while increasing the efficiency of content management and delivery.
Site Requirements
The site required the following elements:
- A warranty form
- A theme to match the current site
- A migration of their architecture from static pages into Drupal
- A custom workflow for publishing new bikes
- An architecture that allowed for the creation of separate bikes, accessories, news, and components, and tied these elements together through bike nodes, search, and taxonomy
- Multilingual capabilities with default languages for selected countries
- The maintenance of Dahon's #1 Google ranking for bicycle-related search terms
- A country switcher that allowed visitors to select a localized product site
- An Internationalized Dealer locator
- Custom Apache SOLR search
- A Highly customized bike menu
- The general Drupal goodies (RSS, blog, taxonomy, capacity for easily updated functionality, turn on desired functionality when ready)
- Hosting w/ solution for serving 1.5 gb worth of static files (manuals as well as media)
Problems and Solutions
Multiple Domains and Mulitple Languages
Dahon has distributors located in numerous locations across the globe. The company originally relied on static files for its website which meant there was no efficient way to translate and update content, or give country specific information. Adding to this problem, Dahon had to create a different site for each country that it operated in even though in the majority of cases, they were selling the same products in each of these countries. Managing all of these different sites in different languages was proving to be extremely inefficient. Therefore, one of the goals of the new site was to bring these disparate sites together into a unified user interface, allowing Dahon to provide the same products with translations and country specific information.

Enter the Domain Access and i18n suite of modules. These modules, with proper configuration and some custom work, allowed Dahon to have one central site from which content could be shared to numerous different country sites in different languages. Further adding to this functionality, the Translation Overview Module provides a table listing the site's nodes and shows what's been translated into each language. This supplied Dahon with an overview of their multilingual content, allowing them to streamline their workflow and efficiently assign translation tasks to translators. On the development side of things, the Localization Client Module, which allows for “just in time” translation, gave a nice on-screen UI for translations during development.
Global Dealer Locator
Dahon has an extensive list of dealers worldwide and so required an efficient dealer locator system that would allow users to search for bike dealers according to the country they were in. The system needed to be flexible enough to cope with the ongoing addition of new dealers, and accurate enough to locate dealers within a mile of the user's location.
To fulfill this requirement, we built a custom module that allows users to search for local dealers by ZIP code, proximity, and country. For the initial launch of the site, this was only a one-way lookup for users. However, we built the module so that in the next phases of development, dealers will be able to register with the site and update information themselves. The module was built using many of the basic Drupal hooks such as node_api, menu_alter, form_alter, and some of the views api functions, which will allow us to implement dealer registration in the future without a major overhaul of the module.

Complex Bike Content Type
The complexity of the Bike content type was partially due to it totaling to 112 CCK fields. Things were further complicated by the fact that each bike featured on the site is accompanied by an array of feature, spec, accessory, support and review information, all of which is interconnected and easily accessible by the user. These fields needed to connect to other parts of the system, and needed to be translatable and tied to a workflow and approval process.
Faceted Search System
Due to the complexity of the bike content type and the vast amount of different features and specifications associated with each bike, Dahon required a faceted search system that would allow users to drill into search results based on their specific requirements. Unfortunately, Drupal's default search engine wasn't capable of providing this kind of functionality, and so we implemented Apache Solr Search, a highly scalable open source search platform. Solr offers full-text and faceted search, hit highlighting, dynamic clustering, database integration, and rich document handling - all the goodies that we needed for the Dahon site. To integrate this with Drupal, we used the Apache Solr Module and ran our own Solr instance on the server.
Solr provides site users with the ability to drill into search results to find highly specified information. For example, a search on the site for the term 'bike' will bring up a general list of everything related to the term. The user is also presented with a number of categories (or facets) related to bikes; i.e., components, accessories, blog posts etc. Users can then "drill down" by applying specific constraints to the search results until the desired items are found.
Custom Workflows
One of the great things about Drupal's flexibility is that it allows us to build workflows that closely reflect the internal workflows of our clients. This means that teams do not have to undergo a significant learning curve or alter their internal workflow in order to start adding content to their website. This simplicity was of particular importance to Dahon as a global company with a culturally and linguistically diverse group of employees.

Dahon needed a full-featured custom workflow to allow for content to be created and edited in a streamlined process. To build this, we used the Workflow and Scheduler modules. A key feature of the workflow is the ability to send out notifications to the appropriate roles when content moves between the content approval stages. For example, when new content is added by an Editor and is marked for translation, the workflow system will send out a notification to a Translator informing them that the content has been marked for their attention. After making the appropriate changes, the Translator then reassigns the content back to the Editor for review. All revisions are saved and made available to the editor so that if he/she is not happy with the changes, they can roll back to a previous version of the content. If everything is satisfactory, the Editor can publish the content immediately, or schedule for it to be published on a specific date. The Diff module added a nice UI for viewing edits to content.
SEO
Dahon holds the top Google search ranking for folding bike related search terms, something we obviously wanted to keep in mind while building the Drupal version of their website. As most people who have used Drupal know, it is excellent at SEO, even out of the box. So much so in fact that if all you did was setup a default install with clean urls and began writing relevant content, Drupal would get you indexed by all the major search engines with the high possibility of favorable rankings. For the Dahon project, we added to Drupal's Google juice by adding the Page Title module and by updating the XML sitemap module (with the help of Dave Reid), to get separate XML sitemaps for each domain. The Page Title module gave us granular control over individual page titles, allowing us to structure and optimize them for better SERP rankings. The XML Site Map added a structured map of the site that helps search engines to crawl the website and keep their results up to date.
Theming

Dahon already had a great design in place for their site and so the bulk of the theming work for us was translating this into a Drupal compatible theme. We used zen as our starter theme and built from there. Note worthy features are as follows:
- The folding bicycle section of the site uses Views Accordion to display the various categories of bikes. Clicking on the category title expands the accordion to display the bikes within that section. We used Beauty Tips (maintained by Zivtech developer Matthew Klein) in conjunction with this to display a larger image of the bike and a summary of its specifications when users hover over a bike of interest.

- Individual bike pages required some attention in terms of how we were going to lay things out so that users could quickly access the information they needed. Each bike has a Features, Specs, Accessories, Support and Reviews section tied to it, and we wanted users to be able to access this information without having to leave the page. We achieved this by implementing Quick Tabs which allowed us to place these sections in blocks of tabbed content, allowing users to click through the sections as they viewed the bike.

- As Dahon bikes are folding bikes, we felt that it was important for the user to be able to see the bike in its folded state. We therefore added a "See It Folded" section to each bike node. This section uses a combination of images and jQuery to display the bike in its folded and unfolded states. When a user hovers over the bike image, jQuery hides one image and displays the other, giving surprisingly good results. This is a great little feature that adds a nice finishing touch to bike nodes.

- The Manuals and Guides section of the site allows users to search for PDF manuals and guides relating to specific bikes and components. The whole section was set up using views. For the search component, we used exposed filters for node type, node title and taxonomy term. this allows users to narrow down their search by adjusting each filter accordingly. The results are displayed using the view table format with results separated into 4 columns - Products, Manual, Guide, and Year. All style tweaks were made using CSS.
Working with Zivtech
At Zivtech, we use a Rapid Prototyping development model when developing sites for our clients. This model allows our clients to supply us with feedback throughout the development process so that appropriate adjustments can be made during development, rather than after. To assist us with this process, we developed the Unfuddle Feedback Module which provides our clients with a feedback link on every page of the development site. The Unfuddle Feedback module is linked to our Unfuddle ticketing system, supplying clients with a way to create work tickets as they browse through their site. Ultimately, this process ensures that we are all on the same page throughout site development.
The Unfuddle Feedback module, combined with access to the dev site, allowed Dahon to provide continuous feedback throughout the development process, increasing Client/Dev communication resulting in:
- A decrease in development time and overall development costs.
- More control over priorities and outcomes.
- The ability to make small adjustments along the way rather than trying to solve problems at the end of development.
- Transparency - Dahon got to monitor how their budget was being used throughout the development process and could make adjustments accordingly.
Contributed Module Highlights
- Apache Solr - integrates Drupal with the Apache Solr Search Platform.
- Content Construction Kit (CCK) - creation of content types.
- Embedded Media Field - create fields for node content types that can be used to display video, image, and audio files from third party providers.
- Context - manages contextual conditions and reactions for different portions of the site.
- Beauty Tips - Provides Jquery based ballon-help style tooltips for any page element.
- Date - flexible date/time field type for CCK. Includes Date API - available to be used by other modules.
- Domain Access - suite of modules providing tools for running a group of affiliated sites from one Drupal installation and a single shared database.
- Image Cache - creates presets for image processing.
- Location - allows admins to collect addresses, geocode them, and associate locations with Drupal nodes and users.
- Menu Attributes - allows additional menu attributes such as id, name, class, style, and rel, to be specified.
- Meta Tags - allows meta tags to be set for each Drupal page.
- Internationalization - extends core multilingual features to make the site fully multilingual.
- Node Queue - allows administrators to collect nodes in an arbitrarily ordered group.
- Better Formats - adds more flexibility to Drupal's core input format system.
- Diff - shows differences between node revisions.
- Invisimail - provides a content filter to hide email addresses from spam-bots.
- Thickbox - wrapper for the Thickbox jQuery plugin.
- Google Analytics - Integrates Drupal with Google Analytics.
- Taxonomy Image - allows site administrators to associate images with taxonomy terms.
- Views - a smart query builder that, given enough information, can build the proper query, execute it, and display the results.
- Workflow - allows the creation and assignment of arbitrary workflows to Drupal node types.
- XML Sitemap - creates a sitemap that conforms to the sitemaps.org specification, helping search engines to more intelligently crawl a website and keep their results up to date.

Comments
How do you do your translations?
Do you use your own translators? Did you consider a service like http://icanlocalize.com (with the Drupal module here http://drupal.org/project/icanlocalize)?
my Drupal book | Twitter | Senior Drupal Advisor, Acquia | Advisor ICanLocalize
Awesome site. Really quite
Awesome site. Really quite impressive functionality - with things that I've not previously seen in drupal sites.
One question: How did you achieve the tabed interface on the main bike pages like this one:
http://dahon.com/bikes/2010/tournado
IE, the Features/Specs/Accessories/Support/Reviews tabs
great work!
Regarding the tabs, It looks
Regarding the tabs, It looks like they used quick tabs (http://drupal.org/project/quicktabs)
Eric
Exactly
Yes, we had lots of cck fields for the bike content type, and we made views to represent groups of these fields, then used quicktabs to display the views onto the bike listing. The only thing really custom in there is the CCK formatter for the specs which are nodereferences.
--Zivtech--
How to correctly display each bike with its related info?
How did you get your QuickTabs to correctly locate the related information (Specs, etc...) for each Bike?
I've tried creating Views to create blocks to group data together so I can have my tabs. I then added a QuickTabs block to my product view with the Context module. BUT, I'm getting ALL related data (from each block) instead of just the data from the product I want.
Join a legion of Nerds in the Minneapolis Area: http://nerdery.com/
SO HERE YOU GO: Go to views
SO HERE YOU GO:
Go to views admin------->add argument------>Node:Nid----------->Provide Default Argument (find it in the bullet options) ---------->Default Argument Type : Node ID From URL
just place the view in a block where you want and when in the node view it will display
im usually a good guy,plz dont ban me
Really very clean & nice work!
Congrts Zivtech,
This is really a nice work! Keep it up! Thats what we need from drupal shops/providers .. awesome solutions for clients, their businesses & sharing back the part with drupal community here.
See ya
Natasha Cole,
Drupal Point LLC.
http://drupalpoint.com - Drupal Specialists.
well done
It makes me want to purchase one of the bikes, which is obviously the point!
Very good site. Two things: I
Very good site.
Two things:
I could not find the price or price range of each product
It would look more professional to have its own Dahon flash player instead of youtube and its own Forum instead of Invisionboard.
Bikes have no online prices
The bikes are sold via international dealers.
--Zivtech--
Second the forum
The forum doesn't look that big or complex... You could have used Drupal and had it integrated.
Michelle
-----
Shell Multimedia - My sporadically updated mostly Drupal blog.
Agreed
That's on the horizon to do in a later phase. Things mostly just get complex when it comes to existing users and migrating their credentials.
--Zivtech--
Best tool for the job
It would look more professional to have its own Dahon flash player instead of youtube
My guess is they decided to concentrate on the main business of the site -- that of selling bikes -- and they didn't want to get involved with the storage requirements necessary for delivering of Flash video, so they let the people of YouTube handle that. That way, instead of reinventing the wheel, they could focus on their strong point.
YouTube = free traffic
YouTube not only saves you bandwidth, it brings you free traffic in the form of random YouTube surfers. And your videos will show up in the search results on Google. And you get really nice video analytics, which isn't even possible with most host-it-yourself solutions.
For most sites, it's a mistake to use anything else.
--
John Forsythe
Need Drupal hosting? You should read my review.
Drupal Modules - Search, rate, explore. Over 2200 module reviews!
Exactly!
Yes, that's it exactly.
Menu design is nice
I like very much Menu design and graphics. Very nice design. Site performance is very good (this site is hosted on dedicated server). I want to learn a lot from this drupal based website.
Nihonsei.
Great site!
Great work and awesome documentation - really helps to brainstorm new sites and ideas for future developments.
I'm curious why you wrote your own locator module and didn't use the location module in combination with gmaps, views, etc. as you can do postal code and proximity searches?
Thanks,
Pete
Toronto Website Developer
Dahon makes awesome bikes!
Dahon makes awesome bikes! It is cool to know they are using Drupal.
Beautiful site
I'm a big bicycling enthusiast, and have spent a fair amount of time browsing bicycle manufacturer sites. Most of them are terrible, flash-based and low on actual content. It's nice to see a really well done bike site, for a change.
The technology section is great, and I especially like that it has manuals for every component linked on the bike pages.
--
John Forsythe
Need Drupal hosting? You should read my review.
Drupal Modules - Search, rate, explore. Over 2200 module reviews!
Admin interface
Thanks for the case study! I'd be really interested to see how you handled the admin side of things, particularly for complex CCK-heavy node forms like the Bike content type. That's something I've often struggled with when defining more than a dozen or so CCK fields for a type. Did you implement something like Vertical Tabs?
We did use Vertical Tabs and
We did use Vertical Tabs and broke things up into groups. It took less than an hour to setup and made for an elegant and intuitive UI. On the admin end we spent more time on the workflow, domain, and translation elements as detailed above.
Aaron Couch
work: http://zivtech.com
play: http://aaroncouch.info
revolution: http://mediamobilizing.org
check this out:
check this out: http://drupal.org/project/nodeformcols
im usually a good guy,plz dont ban me
Beauty Tips Themeing
I notice for the Beauty Tips you are loading a custom node template based on using "js" at the end of the url. How is this accomplished?Thanks for the write-up and I am with the above commenter, it makes me want to buy one of these bikes. You are going to pay your fees back to the company by posting this on d.o.
Edit: Answered my own question (as usually) with a little google. http://drupal.org/node/223440
Unfortunately this doesn't
Unfortunately this doesn't seem to be working at the moment, at least in FF on the Mac. Going to http://dahon.com/node/633/js (by clicking on one of the bike icons on /folding-bicycles) loads a new page with just the picture of the bike and some unthemed buttons. Otherwise, it looks like a great site.
amazing
amazing site for awesome bike
Me again! I can't seem to
Me again!
I can't seem to figure out how you're putting the tabs in the bike info pages with quicktabs.
I guess you make a View, put that view into a Quicktab, and load the Quicktab in the content area via an php argument on the blockpage somehow?
Thanks!
multisite config
very nice design.
Just a quick question/remark: I guess you are running a multisite with single code base. However did you choose to put all your images under sites/default on purpose? I'm currently struggling with multisites folder configuration and I'm about to put each site files under its respective site folder...
Awesome
It really does look awesome, this is one of my favs! Thanks for sharing.
Mariquecalcus
Online Calendar - Online Reminder
great write up, great bikes
Thanks, this is a great write up. My Dahon was stolen at the end of last year, and I really miss it. A friend lent me a street racing bike until I can afford to replace it. The racer might be fast, but it's not as much fun as the Dahon! They're great bikes, that must have been an interesting site to work on!
Drupal Developer
Looks like the javascript is
Looks like the javascript is currently not loading, or is that just me? (I don't have any blockers or anything enabled)
Kudos to Dahon for a
Kudos to Dahon for a beautiful Drupal site! I have a Dahon myself and love it. I'm so glad to see two of my favorite brands working together!
...
Very good writeup guys, nice design and theme also, really beautiful.
I have one small gripe (pet gripe) and thats the lack of skip navigation - you have an "skip to navigation" link in there hidden with display: none; which is basically doing nothing, how about proper and accessible "skip to main content" link up the top and not hidden with display: none; but rather hide it with an accessible method (like position: absolute).
And thanks for the unfuddle module contribution, looks like a really useful service.
Adaptivetheme - now with Responsive Panels! | Premium Drupal Themes | CTR!
Ask me in IRC #drupal-adaptivetheme
Awesome job
I am astonished you did this without panels. Any reason for not using it?
I'm well familiar with the Dahon site from before the makeover... the site update was done so smoothly I did not even notice the change, other than noticing some new improvements. Good job in maintaining the look and feel. I too am working on a project with massive CCK types (well, 50 fields anyways). A lot of people don't immediately get the fact that you can use Content Types as databases themselves, holding tons of content you will never display.
FYI - I bought a Dahon Jack D7 last year. I can tell you folks, this is an AWESOME commuter and trail (not mountain!) bike. It goes everywhere, and I've even run over broken street glass and the tires held up. It folds up and fits in the trunk of a 1996 Toyota Corolla, with room for my backpack and a 12-pack of beer.
If I were to do it again though, I'd maybe step down to a 20" wheeled model for convenience, and go for the 24 speed because very steep hills do cause me to get off the bike and push (to be fair, that's as much MY fault as it is for the bike not having a really low gear). It's awesome not having a bike rack, and being able to store your bike in the car trunk.
Now what I'm really excited about is...
That you'll be doing a Site Showcase presentation of this site at the upcoming DrupalCampNYC8!!
Lucky us!
Quick Update on SEO
We just analyzed the site traffic for Dahon.com since the launch, and traffic has almost tripled over the past five months! It just goes to show you: the most important SEO you can have is a well thought out architecture featuring granular inter-connected content.
Zivtech: Illuminating Technology - Drupal experts in Philadelphia | New York City | Madison, WI
I wish blogspot would let us
I wish blogspot would let us have real seo 301 redirect already so i can start with drupal on my favorite and first blog i ever made. Im afraid ill loose all the seo benefits if i do a simple redirect.
Napkin Rings | Napkin Folding
Hello webmaster can I use
Hello webmaster can I use some of the information from this post if I provide a link back to your site?
Another bike company using Drupal
http://www.sram.com/
Cheers Dan
How'd you create your term
How'd you create your term pages? I assume each of your technology descriptions is a taxonomy term. But if so, how did you turn them into pages?
For example: http://www.dahon.com/technology/lattice-forged-hinge
I've tried every combination of Taxonomy Image sub-modules, Views, Page displays, and the like ... and I cannot get the term image to display.
Join a legion of Nerds in the Minneapolis Area: http://nerdery.com/
Looks to me like those are
Looks to me like those are nodes
If they are, cool. I am a
If they are, cool. I am a little more convinced they are taxonomy terms that have been formatted via a Page/Panel.
I finally figured out that I had a submodule of CTools turned off.
I was just looking for a simple way to create short, descriptive pages about my taxonomy terms, while displaying their images.
The solution was this:
Phase 1:
Phase 2:
Provide Default Argument:
Taxonomy Term ID from URL
Validator:
Taxonomy term
Phase 3:
Enjoy!
my other question is how they managed to link the pages together correctly? My taxonomy links (based on views) always wind up being: "term/80" or "term/environmental protection". Notice I can't figure out how to control spaces (or for that matter convert whitespace into dashes) on view links.
Join a legion of Nerds in the Minneapolis Area: http://nerdery.com/
I was just basing them being
I was just basing them being nodes off the source code being output. Looks like a simple node to me. "node-type-component"
<div id="content-area">
<div class="node node-type-component" id="node-109"><div class="node-inner">
<div class="meta">
<div class="terms terms-inline"> in <ul class="links inline"><li class="taxonomy_term_168 first"><a title="" rel="tag" href="/category/technology/technology/frame-technology">Frame Technology</a></li>
<li class="taxonomy_term_169 last"><a title="" rel="tag" href="/category/technology/technology">Technology</a></li>
</ul></div>
</div>
<div class="content">
<div class="field field-type-text field-field-part-bike">
<div class="field-items">
<div class="field-item odd">
Frame </div>
</div>
</div>
<div class="field field-type-text field-field-year">
<div class="field-items">
<div class="field-item odd">
2004 </div>
</div>
</div>
<div class="field field-type-filefield field-field-image">
<div class="field-items">
<div class="field-item odd">
<img width="375" height="300" class="imagecache imagecache-component_node imagecache-default imagecache-component_node_default" title="" alt="" src="http://static.dahon.com//sites/default/files/imagecache/component_node/images/component/0/2004/lattice_hinge.png"> </div>
</div>
</div>
<p>The hinge is the most critical part of any folding bicycle frame. The Lattice Forged hinge was developed after two years of design, testing, and FEA analysis. Cold-forged for strength and CNC machined to minimize weight. Details include a stainless steel hinge pin and brass washers for long-term durability in the harshest riding conditions.</p>
</div></div> <!-- /node-inner, /node -->
</div>
Guess I was still wrong. I
Guess I was still wrong.
I mis-interpreted their use of taxonomy.
The components fall into the same taxonomy vocabularies as the bike content-type. I incorrectly assumed the components themselves were linked to the product pages (not even sure how I got that idea). Therefore, the links at the top of each product point to the "nodes by taxonomy term" view, and thus pulls up the components related to the shared taxonomy---not the bike itself.
Join a legion of Nerds in the Minneapolis Area: http://nerdery.com/
Custom code required for domain access and i18n?
Could you give some more info on the custom work required with domain access and i18n?
"Enter the Domain Access and i18n suite of modules. These modules, with proper configuration and some custom work, allowed Dahon to have one central site from which content could be shared to numerous different country sites in different languages"
I'm about to build a site that needs something similar, 4 country sites, some with multiple languages. It looks like domain access and i18n will do most of what I need. Just wondering if you had any issues integrating these modules?
Thanks!
Warranty
How did you do your warranty forms? Just after some tips as I am having to build a warranty registration form for a client now.
There are only 10 types of people in this world. Those who understand binary and those who don't.