Art Institute of Chicago Collections
The Art Institute of Chicago (AIC) is one of the world's premier art museums, best-known for its collections of Impressionist, Post-Impressionist, and American paintings. In addition to housing famous paintings such as Seurat's A Sunday Afternoon on the Island of La Grande Jatte, van Gogh's Bedroom in Arles and Grant Wood's American Gothic, the Museum also has world-class collections of photography, arms and armor, ceramic figures, portrait sculptures, miniatures, and galleries of ancient Egyptian, Greek, and Roman artifacts, including the mummy of Paankhenamun.

Palantir.net has worked with AIC since 2005, when we helped them develop and implement their site redesign and CMS integration. Their existing site only showed a small selection of material from their collection; the goal of this project was to integrate the site with their backend asset management system to allow users to browse the Museum's entire collection online, as well as allow the Museum to quickly and easily create micro-sites to promote exhibitions.

Palantir worked on the AIC Collections site in collaboration with design partner Studio Blue, who provided the original design direction for the AIC Web site. Larry Garfield (Crell) and Colleen Carroll were the joint architects of the site, with Larry working as lead programmer and Colleen as lead themer. Tiffany Farriss provided strategic leadership for the project.

Remote data

The main challenge with the AIC Collections site was, of course, their large existing collection data. It was contained in a digital asset management system (DAM) called CITI. Integrating third party data without a complete import is an area where Drupal is somewhat weak right now, but there are several ways to go about it.

Art Institute of Chicago Collections
We had previously implemented lazy-node-creation for the Indianapolis Museum of Art, because we needed to leverage a lot of node-based features on artwork. For AIC, that wasn't the case. We didn't really need node functionality, so a lazy-instantiation system would have been unwanted overhead. Instead, we built a parallel system specifically for AIC's data model.

We were accessing CITI via SOAP requests, using RPC-style queries rather than methods. The return values from the queries, like SQL, are somewhat raw. So rather than process them everywhere, we built a simple object-relational mapper (ORM) framework on top of them, using the much stronger OOP support in PHP 5.

The ORM ended up being quite large, but still reasonably streamlined. There were several different types of data we had to support. They all had the same basic structure which was, fortunately, fairly simple:

Artwork: A work of art held in the DAM, such as a painting or sculpture. They may be owned by the Art Institute or on loan from another institution.

Artists: The creator(s) of a given artwork, where known.

Resources: Auxiliary pieces related to various artwork, such as PDF files or short video clips.

Categories: CITI has its own categorization system and hierarchy. Categories included different departments (such as Asian art or textiles), as well as groupings within a department (such as specific time periods or cultural regions). Artwork can be in multiple categories too, making it roughly analogous to Drupal's taxonomy system.

To reduce traffic to and from the SOAP server, we designed the system to always load multiple objects at once. Loading an object did not, itself, load any of its fields. It just created a stub object. Upon calling getField(), we could then lazy-load that field for all objects in a "set" in one request, or lazy-load multiple fields for multiple objects all in one go. The result was a very efficent system that minimized SOAP database traffic while presenting a very clean and consistent API interface. We also were able to separate off search functionality to a separate operation. This in turn allowed us to keep that a clean interface as well.

If that all sounds familiar, it should. It was the success of the Collections site that prompted our previous Musings on a Data API article. It also served as a sample use case for the Data API Design Sprint that Palantir hosted in February and was a direct ancestor of the "Model 2" proposal.

Menus

Art Institute of Chicago Collections
Pulling content in dynamically from a third party system also required some fancy footwork with the menu system. The list of museum departments and sub-categories in the left navigation menu is mostly dynamic, and is derived from CITI.

Each department is represented as a node, which references a department category in CITI. That allowed us to have Drupal-local images for each department, while the descriptive text is pulled from CITI. Every time a department node is edited, the system updates the corresponding menu item in Primary Links and checks CITI for any sub-categories that are present. Each of those gets a menu item dynamically created. It is a bit unconventional, but the limitations of the Drupal 5 menu system didn't allow for anything else. The Drupal 6 menu system would have made it even slicker, but sadly that was not an option for us.

Foreign Theming

The Art Institute's main site is actually managed through a design-time CMS called Collage. One of the main goals for the Collections site was for it to slip seamlessly into the design. To that end, we configured the system so that page templates are actually managed from Collage and pushed out during that system's deploy cycle to the Collections site's theme directory. That way, a Collage administrator can make a global change to, say, the the main site navigation template in Collage and the change will automatically propagate to the Drupal Collections site.

Form theming

The Collections site included some of the most un-Drupal-like forms that we have had to build. Fortunately Drupal's form system is flexible enough to handle it. First, we attached custom theming functions to selected parts of the form structure (frequently pieces that were repeating). We could then theme them as a group to put into, say, an unordered list or table. That page, for instance, is generated by this code:

foreach ($artworks as $artwork) {
  $artwork_ids[] = $artwork->id();
  $form_item_id = 'artwork_'. $artwork->id();
  
  $form['list'][$form_item_id] = array(
    '#theme' => 'citi_artwork_illustrated_list_form_item',
    '#tree' => TRUE,
  );
  $form['list'][$form_item_id]['artwork_id'] = array(
    '#type' => 'markup',
    '#value' => $artwork->id(),
  );
  // The various fields in the artwork just get added as normal markup elements
  // so that they are "part of" the form, but just for display.
  foreach ($artwork->fields() as $field => $value) {
    $form['list'][$form_item_id][$field] = array(
      '#type' => 'markup',
      '#value' => $value,
    );
  }
  $form['list'][$form_item_id]['checked'] = array(
    '#type' => 'checkbox',
    '#title' => t('Add to my collection'),
  );
}

Note, in particular, the '#theme' keys. These allowed us to custom theme selected parts of the form. The second trick was to break the form or parts of it out into a template file. For that we had to override our own theme function:

function phptemplate_citi_collection_artwork_form_item(Array $form) {
  foreach (element_children($form) as $element_key) {
    $vars[$element_key] = drupal_render($form[$element_key]);
  }
  return _phptemplate_callback('citi_collection_artwork_form_item', $vars) . drupal_render($form);
}

That gives us a rendered form of every sub-element in that part of the form, which can then be placed using a template file. If templating the entire form, we can easily special case out form_id and form_token so that the template author does not have to worry about them, since their placement is irrelevant.

The result is forms that don't look a thing like Drupal, but can be laid out using normal templating.

My Collections

One of the features the Art Institute requested in order to be Web 2.0-compliant was the ability for users to create their own personalized collections. My Collections allows users to flag artwork they like and build an on-site bookmark collection. Each collection can be printed off, annotated, or forwarded to friends. (Perhaps a suggested personalized tour for a date?)

For My Collections, we did use Drupal's node system. Each "collection" node references various artwork by ID and can include a user's personal comments on it. Comments are handled via a custom form field for each piece of artwork. They are displayed right on the node view page, in place of the normal page body. Rendering a form in place of the node body is actually very simple, requiring only a little work in hook_nodeapi().

Exhibitions

Art Institute of Chicago Collections
Another feature of the Collections site is integrated micro-sites for temporary exhibitions at the Art Institute. AIC wanted the ability to roll out mini-sites with a different theme for each of their major exhibits. In the past they had created each one manually, and that simply did not scale. Instead, they wanted a Drupal-integrated push-button way to throw up a new site for an exhibition using a different theme than the main site and a custom skin for each exhibition.

We considered several alternatives. Traditional multi-site was too complex. It required bugging the over-worked server admin every time a new exhibition needed to be setup. Table prefixing within a single database with multi-site would create a maintenance problem as the number of exhibitions grew, and would still require admin involvement. We also looked into Organic Groups, but unfortunately at the time we were building the site (late 2007) OG still had far too much dependence on the Groups.Drupal.org workflow. It also offered no clear way at the time to create separate skins for each group; we didn't want to force site admins to setup a whole new theme for each exhibition.

In the end, we rolled our own custom setup using Organic Groups as a model. Each exhibition is a single node, on which a large number of fire-and-forget settings are included . Each exhibition includes: a title, a "short title" for use in URL paths, a splash page body and graphics, a list of works that are included in the exhibition (which may or may not be in the Art Institute's own collection), and even a KML file for selected exhibitions to show where various artwork was created using Google Maps. A series of custom callback pages then pull out various bits of information from the exhibition to show on dedicated pages (such as the Map page or the Selected artwork page).

Remaining generic pages use a simple node-reference to the exhibition they relate to, and can be placed arbitrarily into a corresponding menu by the admin.

Each exhibition node also includes a series of simple color fields. Those fields are filled in with color hex values using the Farbtasic color wheel jQuery plugin, the same one used by Garland in Drupal core. Later, any page view that corresponds to that exhibition will create a corresponding CSS file if it doesn't exist already and queue it up just like any other CSS file. The result is that admins can skin each exhibition separately without ever touching code and without creating multiple themes. (Thanks to Dmitri Gaskin for the blog post that inspired this technique.)

Visual effects

Most of the visual effects on the site are handled through simple CSS or our old friend jQuery, using jqModal for most of the image popup effects. Much of the code pattern, if not the code, is reused from our earlier work on the Indianapolis Museum of Art.

Modules

Despite the size and scope of the Collections site, we were able to pull it off without any core modifications, save for upgrading jQuery. The bulk of the custom code involved integrating with CITI, as we were essentially using Drupal as an application framework for that portion of it.

Contrib modules

Custom modules

  • aic - Random customizations for this site
  • aicevent - Hook into the Museum's legacy event database.
  • aicexhibitions - Customizations specific to the Exhibitions micro-sites
  • aicmaps - Support for the Google Maps in Exhibitions micro-sites
  • citi - Integration with the CITI Digital Asset Management system
  • citi_forward - Glue module to wrap the Forward module around artwork pages.

Conclusions

Since its launch earlier this year, the AIC Collections site has been received with enthusiasm by both site visitors and Museum staffers. Traffic in the Collections area of the site has more than doubled, and now counts for a majority of all of the Museum site's page views. The number of Museum works displayed on the Web site went from 2,500 to over 33,000, with more being added all the time. Nearly 1,000 My Collections have been created, many by students or teachers using the feature as an educational tool.

Although it's only the first taste of Drupal for the Art Institute it probably won't be the last, and it's a great example of how Drupal can play nicely with third-party systems on both the front-end and the back-end.

Case study written by Larry Garfield, Colleen Carroll, Evan Clossin, and George DeMet.

Comments

eeyorr’s picture

Really nice site! Congratulations!

www.drupalmuseum.com
www.organicsitedesign.com

JohnForsythe’s picture

Good use of grid design, and nice color schemes, too.

I noticed you decided to use HTML 4.01 and tables. It definitely didn't hurt the final look, but I'm wondering why you chose tables instead of a more modern XHTML/CSS approach?

--
John Forsythe
Need reliable Drupal hosting?

gdemet’s picture

The new Drupalized pages in the Collections section and the exhibition micro-sites are in XHTML and use a div-based layout; the existing older pages on the site, which are not in Drupal, and which we did not touch as part of this project, still use a table-based layout.

Crell’s picture

Pretty much anything on artic.edu outside of /aic/collections is non-Drupal, and is several years old. If it was that confusing which parts are Drupal and which aren't, it means we were successful in integrating into the existing site. :-)

--
Larry Garfield
http://www.garfieldtech.com/blog
http://www.palantir.net

--
Larry Garfield
http://www.garfieldtech.com/
Thinking Functionally in PHP: https://leanpub.com/thinking-functionally-in-php

JohnForsythe’s picture

Yeah, I totally didn't notice, good work :)

--
John Forsythe
Drupal Modules - Find the module you need for your project!

Fred125’s picture

very cool site!

antiorario’s picture

Hats off!

AdrianB’s picture

Thanks for the extensive case study.

It amazes me what you can do with Drupal, when you're up at that level of knowledge (way beyond what I would be able to do or even understand :)).

Anonymous’s picture

Great write up and very crafty indeed.

Thanks for sharing!

-----------------------------------------
Joep
CompuBase, Drupal websites and design

cmoad’s picture

Great write-up. Thanks for the case studies.

- Charlie

mrbert’s picture

Larry Garfield, Colleen Carroll, Evan Clossin, and George DeMet thanks so much for the detailed write-up.I've book-marked it for reference.thanks again.

Ghana Real Estate | Voacanga Africana Seeds | http://www.voacanga-africana.com.gh/sheabutter/">Shea Butter

BioALIEN’s picture

Looks like a piece of the original old site. You pulled it off, I couldn't tell the difference at first glance! I am interested in how you approached the Artists A-Z page (http://www.artic.edu/aic/collections/artists). Is the "Artists by name" just Views.module with args? If so, how did you create the connection on the "Quick search" box?

Having seen the results of the quick search, I am guessing this handled by one of the custom modules you stated above.

Great work and thanks for sharing your insight.

---
Dee
iScene Interactive :: iScene.eu

Crell’s picture

Artists aren't nodes, and don't exist in Drupal at all. That's custom code dipping into the search API for CITI over SOAP.

Most of the templating we did on the site, however, is Views-inspired. Most things are lists, stubbed out to all-templates (form or not) in much the same pattern as Views 2 users. It's not a direct mapping, but that was the model we followed and it worked out very well.

--
Larry Garfield
http://www.garfieldtech.com/blog
http://www.palantir.net

--
Larry Garfield
http://www.garfieldtech.com/
Thinking Functionally in PHP: https://leanpub.com/thinking-functionally-in-php

Robardi56’s picture

Very interesting.
I was suprised that when clicking on "View enlargement" for any image.... the larger image load instantly. How do you achieve this ?
Is this a zoomify feature ? If yes please elaborate on the integration of zoomify with drupal.

Thanks,
Brakkar

Crell’s picture

Nope, Zoomify is a flash tool. That's done with all Javascript, specifically with jqModal. The div in which the larger image resides is pre-created in the page, and then simply displayed on click. Whether or not the browser pre-loads the file varies with the browser. The main win, though, is simply having a very fast dedicated image server for the images coming from the DAM. :-)

--
Larry Garfield
http://www.garfieldtech.com/blog
http://www.palantir.net

--
Larry Garfield
http://www.garfieldtech.com/
Thinking Functionally in PHP: https://leanpub.com/thinking-functionally-in-php

robomalo’s picture

Our main site, see my post below, uses Drupal, but I am going to integrate and replace one of our secondary sites that uses Zoomify into our Drupal site. I could have saved weeks of work if we would have used Drupal back then, but it was like the D4.6 era. Here's an example of the existing project.

Making a Zoomify/Drupal site will be relatively easy to do, but finding the time among our other projects is the problem. Anyways, once I get it done, I will post a how to. The same principals will apply from what I did in the past. I made one php include for the Flash movie, and dynamically filled in the source from the URL. This way you don't have to make a separate page for every piece of zoomable content.

In Drupal it could work something like this:

  • you would make a content type for the zoomable content; let's call it zoomify
  • write the Flash embed code in the theme file node-zoomify.tpl.php
  • use CCK in the zoomify content type to make a field for the source of the zoomable content
  • put your source files in your files directory (point the CCK field here); for our site the source files would be referenced like /files/zoomify/texas/fort_worth/1886
  • print the CCK source field in the Flash code to point the flash file at the source; looks something like this <embed value="zoomifyImagePath=<?php print $field_source[0]['value']....

This is probably the worst explanation, and I typed it out as I thought about it. I hope this get's you going!

robomalo’s picture

Our museum, the Amon Carter Museum in Fort Worth, uses Drupal. The Kimball Art Museum is across the street from us and the Impressionists show from the Art Institute of Chicago is on display there right now. Nice job on the site and the show!

farriss’s picture

We really believe Drupal is a great fit for museums. Palantir is looking to put together a summit of museums using Drupal here in Chicago in the fall (probably September). The details are still fluid, but the working plan is equal parts show-and-tell (recorded for posting?), auditing Drupal's suitability for museums (a little SWOT analysis) and visioning new possibilities and what it would take to get more museums aware of/involved in the project.

If you or anyone from other Drupal-using museums are interested please contact me.

Anonymous’s picture

Shouldn't this file
http://www.artic.edu/aic/collections/install.php
be removed for security reasons?

Same goes with
http://www.cartermuseum.org/install.php

--
\/ushi - xushi.co.uk
/\ socialprotest.com

robomalo’s picture

You know... after 3 years I should have though to remove that. I always removed the .txt files. What kind of damage can be done if you leave it, if any?

Crell’s picture

The install script detects that the site is installed and refuses to do anything else after that. So really, I don't think there is any damage to do. It easily identifies the site as Drupal, but there's at least a half-dozen other ways to tell if you know what you're looking for.

If re-hitting the install.php script could hose the site, that's a security issue in Drupal itself. If you have found such an attack vector, please notify the security team. :-)

--
Larry Garfield
http://www.garfieldtech.com/blog
http://www.palantir.net

--
Larry Garfield
http://www.garfieldtech.com/
Thinking Functionally in PHP: https://leanpub.com/thinking-functionally-in-php

hihakiem’s picture

This is very inspiring article. I'll try to apply this in my project.
Thanks.

Busana Muslim
Grosir Busana Muslim

Sree’s picture

This is a nice writeup!

-- Sree --
IRC Nick: sreeveturi

djlowkey’s picture

cvos’s picture

Kudos to the AIC for allowing the details of their website to be shared with the drupal community.

http://www.netpaths.net

Sallie Stone’s picture

That is fantastic that you can now browse the entire collection online.
Henri Matisse site owner.

LizN_ArtInstituteChicago’s picture

I'm glad you enjoyed the site. I want to point out that our online collection is not quite yet representative of the entire Art Institute collection holdings. We currently have displayed online 33,000 objects and intend to have 50,000 by October '08. The actual collection is somewhere around 200,000-250,000 works, depending on how one counts sets of architectural drawings in our design department. Every published record is vetted by the curatorial departments and our metadata standards expert before it goes online. Through this process, we certainly hope to have the whole collection covered at some point in time! Also, we are working with image licensing agencies to increase the number of image enlargements available, especially for our modern collection (including Matisse works).

We at the Art Institute are very happy with the site and enjoyed working with Palantir to make it happen. We already have two projects in the works to extend the drupal portion of our site to allow better/searchable access to collection resources such as podcasts and classroom/educational resource materials.

cheby’s picture

Thanks. Very good job.

--------
Cheboksary

jazzdox’s picture

Some of the best work I've seen in Drupal. A real inspiration.

redluk’s picture

Its always refreshing to see what people are doing with their drupal site. I can imagine and really appreciate the extensive customization work that was involved in making this project. The end result is just very sharp.

Great work and looking forward to see more from you guys.
--
www.redluk.com
www.kankanchina.cn

arvisva’s picture

Good team work.

Best of luck

mondzo’s picture

Very nice site. I am new to Drupal and I would like to know how you made the boxes for example on the frontpage and on the other pages as well. I mean boxes like Related events, Quick search, Create your own art collections etc.

Are they as separate blocks in user custom defined region?

Crell’s picture

Yep. Those are all blocks in a custom region. Most of those blocks are custom code in various forms, but they were placed through the normal block region mechanism.

--
Larry Garfield
http://www.garfieldtech.com/blog
http://www.palantir.net

--
Larry Garfield
http://www.garfieldtech.com/
Thinking Functionally in PHP: https://leanpub.com/thinking-functionally-in-php

3lite’s picture

Very beautiful! A true masterpiece!

ebranda’s picture

Congratulations on a nice project. I have a couple of questions about how you implemented the My Collections feature since I am working on a couple of projects for local (Southern California) non-profits in which we would like to have similar functionality:

1. How are comments stored? Is the comments field stored via a third Node type that encapsulates the many-to-many relationship and points to the Collection and Artwork objects via CCK Node Reference? If not, could you explain how you did it?

2. Did you write custom code to handle the form submits for My Collection (from both the Category page for adding artworks and the Collection page itself for updating comments or deleting artworks) and are you programmatically creating the Collection node and its associated Node References? Or is there a way to do this using standard Drupal forms?

I am new to Drupal although I have many years of experience developing server-side web apps. Any tips or insights into how you built this are much appreciated.

EB