=== modified file 'uc_attribute/uc_attribute.module'
--- uc_attribute/uc_attribute.module	2009-05-07 20:12:13 +0000
+++ uc_attribute/uc_attribute.module	2009-05-15 13:51:59 +0000
@@ -386,7 +386,7 @@
     $attributes = array();
     $options = _uc_cart_product_get_options($product);
     foreach ($options as $aid => $option) {
-      $attributes[$option['attribute']] = $option['name'];
+      $attributes[$option['attribute']][] = $option['name'];
     }
     $product->data['attributes'] = $attributes;
   }
@@ -435,7 +435,12 @@
 function uc_attribute_cart_item_description($item) {
   $rows = array();
   foreach (_uc_cart_product_get_options($item) as $option) {
-    $rows[] = t('@attribute: @option', array('@attribute' => $option['attribute'], '@option' => $option['name']));
+    if (!isset($rows[$option['aid']])) {
+      $rows[$option['aid']] = t('@attribute: @option', array('@attribute' => $option['attribute'], '@option' => $option['name']));
+    }
+    else {
+      $rows[$option['aid']] .= t(', @option', array('@option' => $option['name']));
+    }
   }
 
   if (count($rows)) {
@@ -546,24 +551,33 @@
   $data = $item->data;
   $node = node_load($item->nid);
 
+  $index = 0;
   if (!empty($data['attributes']) && is_array($data['attributes'])) {
-    foreach ($data['attributes'] as $aid => $oid) {
+    foreach ($data['attributes'] as $aid => $selected) {
       $attribute = $node->attributes[$aid];
       // Only discrete options can affect the price of an item.
       if ($attribute->display && count($attribute->options)) {
-        $options[$aid] = (array)$attribute->options[$oid];
-        $options[$aid]['attribute'] = _uc_attribute_get_name($attribute);
+        // There may be many selected options, or just one.
+        foreach ((array)$selected as $oid) {
+          if ($oid > 0) {
+            $options[$index] = (array)$attribute->options[$oid];
+            $options[$index]['attribute'] = _uc_attribute_get_name($attribute);
+            $index++;
+          }
+        }
       }
       else {
-        $options[$aid] = array(
+        // Handle textfield attributes.
+        $options[$index] = array(
           'attribute' => _uc_attribute_get_name($attribute),
           'oid' => 0,
-          'name' => $oid,
+          'name' => $selected,
           'cost' => 0,
           'price' => 0,
           'weight' => 0,
         );
       }
+      $index++;
     }
   }
   else {
@@ -647,10 +661,21 @@
         }
         unset($attribute->default_option);
       }
+      switch ($attribute->display) {
+        case 1:
+          $attr_type = 'select';
+          break;
+        case 2:
+          $attr_type = 'radios';
+          break;
+        case 3:
+          $attr_type = 'checkboxes';
+          break;
+      }
       $form_attributes[$attribute->aid] = array(
-        '#type' => $attribute->display == 1 ? 'select' : 'radios',
+        '#type' => $attr_type,
         '#description' => check_markup($attribute->description),
-        '#default_value' => $attribute->default_option,
+        '#default_value' => ($attr_type == "checkboxes" ? array() : $attribute->default_option),
         '#options' => $options,
         '#required' => $attribute->required,
       );
@@ -680,6 +705,7 @@
     0 => t('Text field'),
     1 => t('Select box'),
     2 => t('Radio buttons'),
+    3 => t('Checkboxes'),
   );
 }
 

=== modified file 'uc_order/uc_order.order_pane.inc'
--- uc_order/uc_order.order_pane.inc	2009-05-06 18:27:07 +0000
+++ uc_order/uc_order.order_pane.inc	2009-05-15 13:48:35 +0000
@@ -756,7 +756,7 @@
       $option_rows = array();
       if (module_exists('uc_attribute') && is_array($options)) {
         foreach ($options as $attribute => $option) {
-          $option_rows[] = t('@attribute: @option', array('@attribute' => $attribute, '@option' => $option));
+          $option_rows[] = t('@attribute: @options', array('@attribute' => $attribute, '@options' => implode(', ', (array)$option)));
         }
       }
       $data['product'] = array(
@@ -872,7 +872,7 @@
       $option_rows = array();
       if (module_exists('uc_attribute') && is_array($options)) {
         foreach ($options as $attribute => $option) {
-          $option_rows[] = t('@attribute: @option', array('@attribute' => $attribute, '@option' => $option));
+          $option_rows[] = t('@attribute: @options', array('@attribute' => $attribute, '@options' => implode(', ', (array)$option)));
         }
       }
       $data['product'] = array(

