You are here

function uc_product_kit_uc_cart_display in Ubercart 7.3

Same name and namespace in other branches
  1. 8.4 uc_product_kit/uc_product_kit.module \uc_product_kit_uc_cart_display()

Implements hook_uc_cart_display().

Displays either the kit as a whole, or each individual product based on the store configuration. Each product in the cart that was added by uc_product_kit was also given a unique kit id in order to help prevent collisions. The side effect is that identical product kits are listed separately if added separately. The customer may still change the quantity of kits like other products.

Parameters

$item: An item in the shopping cart.

Return value

A form element array to be processed by uc_cart_view_form().

File

uc_product_kit/uc_product_kit.module, line 1062
The product kit module for Ubercart.

Code

function uc_product_kit_uc_cart_display($item) {
  static $elements = array();
  static $products;
  $unique_id = $item->data['unique_id'];
  $kit = node_load($item->data['kit_id']);
  if ($kit->mutable == UC_PRODUCT_KIT_MUTABLE) {
    return uc_product_uc_cart_display($item);
  }
  else {
    if (!isset($products[$unique_id])) {

      // Initialize table row.
      $kit_qty = $item->qty / $kit->products[$item->nid]->qty;
      $element = array();
      $element['nid'] = array(
        '#type' => 'value',
        '#value' => $kit->nid,
      );
      $element['module'] = array(
        '#type' => 'value',
        '#value' => 'uc_product_kit',
      );
      $element['remove'] = array(
        '#type' => 'submit',
        '#value' => t('Remove'),
      );
      $element['title'] = array(
        '#markup' => l($kit->title, 'node/' . $kit->nid),
      );
      $element['qty'] = array(
        '#type' => 'uc_quantity',
        '#title' => t('Quantity'),
        '#title_display' => 'invisible',
        '#default_value' => $kit_qty,
      );
      $element['description'] = array(
        '#markup' => '',
      );
      $element['#total'] = 0;
      $element['#suffixes'] = array();
      $element['#extra'] = array();
      $element['#entity'] = $kit;

      // Override the entity associated with this
      // render-array to be the kit itself.
      $elements[$unique_id] = $element;
    }

    // Add product specific information.
    $extra = uc_product_get_description($item);
    if ($kit->mutable == UC_PRODUCT_KIT_UNMUTABLE_WITH_LIST) {
      $elements[$unique_id]['#extra'][] = array(
        'data' => theme('uc_product_kit_list_item', array(
          'product' => $item,
        )) . $extra,
        'class' => array(
          'kit-component-cart-desc',
        ),
      );
    }

    // Build the kit item product variant.
    if (!isset($item->type)) {
      $node = node_load($item->nid);
      $item->type = $node->type;
    }
    $build = node_view($item);
    $elements[$unique_id]['#total'] += $build['display_price']['#value'] * $item->qty;
    $elements[$unique_id]['#suffixes'] += $build['display_price']['#suffixes'];
    $elements[$unique_id]['data'][$item->nid] = $item;
    $products[$unique_id][] = $item->nid;

    // Check if all products in this kit have been accounted for.
    $done = TRUE;
    foreach ($kit->products as $product) {
      if (!in_array($product->nid, $products[$unique_id])) {
        $done = FALSE;
        break;
      }
    }
    if ($done) {
      drupal_add_css(drupal_get_path('module', 'uc_product_kit') . '/uc_product_kit.css');
      $elements[$unique_id]['data'] = array(
        '#type' => 'value',
        '#value' => serialize($elements[$unique_id]['data']),
      );
      if ($kit->mutable == UC_PRODUCT_KIT_UNMUTABLE_WITH_LIST) {
        $elements[$unique_id]['description']['#markup'] .= theme('item_list', array(
          'items' => $elements[$unique_id]['#extra'],
          'attributes' => array(
            'class' => array(
              'product-description',
            ),
          ),
        ));
      }
      $element = $elements[$unique_id];
      unset($products[$unique_id]);
      unset($elements[$unique_id]);
      return $element;
    }
  }
  return array();
}