You are here

function commerce_views_display_plugin_style_add_to_cart_form::render_grouping in Commerce Views Display 7

Group records as needed for rendering.

Overrides views_plugin_style::render_grouping

File

includes/views/plugins/commerce_views_display_plugin_style_add_to_cart_form.inc, line 237
Contains the views ui tabs style plugin.

Class

commerce_views_display_plugin_style_add_to_cart_form
Style plugin to render each item in an add to cart form

Code

function render_grouping($records, $groupings = array(), $group_rendered = NULL) {
  $sets = parent::render_grouping($records, $groupings, $group_rendered);
  if (empty($sets)) {
    return $sets;
  }

  // Extract a default quantity for the Add to Cart form line item.
  $default_quantity = $this->options['default_quantity'] <= 0 ? 1 : $this->options['default_quantity'];

  // set display path
  $line_item_display_path = NULL;
  if ($this->options['display_path']) {
    if ($this->view->display[$this->view->current_display]->display_plugin == 'page') {

      // set to page path
      $line_item_display_path = $this->view->display[$this->view->current_display]->display_options['path'];
    }
    else {

      // fallback to current url
      $line_item_display_path = current_path();
    }
  }

  // process sets
  foreach ($sets as &$set) {
    $row_product_ids = array();
    $product_ids_index_map = array();
    foreach ($set['rows'] as $index => $row) {
      if (isset($row->product_id)) {
        $row_product_ids[] = $row->product_id;
        $product_ids_index_map[$row->product_id] = $index;
      }
    }

    // /row loop
    if (empty($row_product_ids)) {
      continue;
    }

    // Load all the active products intended for sale
    $products = commerce_product_load_multiple($row_product_ids, array(
      'status' => 1,
    ));
    if (empty($products)) {
      continue;
    }

    // extract all product ids for form building
    $product_ids = array_keys($products);

    // set default product
    if (!isset($this->default_product_id) || !isset($products[$this->default_product_id])) {
      $this->default_product_id = reset($product_ids);
    }
    $default_product = $products[$this->default_product_id];
    $default_product_index = $product_ids_index_map[$default_product->product_id];

    // Build the line item we'll pass to the Add to Cart form.
    if (isset($this->default_line_item_id)) {
      $default_line_item = commerce_line_item_load($this->default_line_item_id);
      $default_line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $default_line_item);

      // Copy field instances from template to the current line item
      $line_item = commerce_product_line_item_new($default_product, $default_quantity, 0, array(), $this->options['line_item_type']);
      $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
      foreach (field_info_instances('commerce_line_item', $this->options['line_item_type']) as $field_name => $instance) {
        if (isset($default_line_item->{$field_name})) {
          $line_item->{$field_name} = $default_line_item->{$field_name};
        }
      }
    }
    else {
      $line_item = commerce_product_line_item_new($default_product, $default_quantity, 0, array(), $this->options['line_item_type']);
    }

    // initialize line item context
    if (!isset($line_item->data['context'])) {
      $line_item->data['context'] = array();
    }

    // populate context with plugin options
    $line_item->data['context'] = array(
      'product_ids' => $product_ids,
      'add_to_cart_combine' => $this->options['combine'],
      'show_single_product_attributes' => $this->options['show_single_product_attributes'],
    ) + $line_item->data['context'];

    // Add the display path to the line item's context data array if specified.
    if (isset($line_item_display_path)) {
      $line_item->data['context']['display_path'] = $line_item_display_path;
    }

    // Store the View data in the context data array as well.
    $line_item->data['context']['view'] = array(
      'view_name' => $this->view->name,
      'display_name' => $this->view->current_display,
      'human_name' => $this->view->human_name,
      'page' => $this->view->current_page,
    );

    // get form id
    $form_id = commerce_cart_add_to_cart_form_id($product_ids, $default_quantity);

    // Create a unique id
    $product_display_id_parts = array(
      'commerce_views_display',
      $this->view->name,
      $this->view->current_display,
      $form_id,
    );
    $product_display_id = drupal_html_id(implode('-', $product_display_id_parts));

    // build fields
    $field_displays = array();
    $set['fields'][$default_product_index] = array();
    if (!empty($this->view->field)) {
      $field_keys = array_keys($this->view->field);
      foreach ($field_keys as $field_id) {
        $field_handler = $this->view->field[$field_id];
        $is_field = property_exists($field_handler, 'field_info');
        $field_name = $field_handler->real_field;
        $field_displays[$field_id] = array(
          'field_id' => $field_id,
          'real_name' => $field_handler->real_field,
          'is_field' => $is_field,
          'product_display_id' => $product_display_id,
          'default_view_mode' => 'commerce_product_' . $this->options['default_view_mode'],
        );
        if ($is_field) {
          $field_name = $field_handler->definition['field_name'];
          $field_displays[$field_id]['field_name'] = $field_name;
          $field_displays[$field_id]['display'] = array(
            'type' => $field_handler->options['type'],
            'settings' => $field_handler->options['settings'],
            'label' => 'hidden',
          );
        }
        $set['fields'][$default_product_index][$field_id] = commerce_views_display_field_view_field('commerce_product', $default_product, $field_name, $field_displays[$field_id], $this
          ->get_field($default_product_index, $field_id));
      }
    }

    // Build the Add to Cart form using the prepared values.
    $cart_context = array(
      'view_mode' => 'commerce_product_' . $this->options['default_view_mode'],
      'class_prefix' => $product_display_id,
      // must be same as prefix for $field_replacement_class
      'commerce_views_display' => array(
        'field_displays' => $field_displays,
      ),
    );
    $form = drupal_get_form($form_id, $line_item, $this->options['show_quantity'], $cart_context);
    $set['add_to_cart_form'] = $form;
    $set['product_display_id'] = $product_display_id;

    // truncate set rows
    $set['rows'] = array(
      $default_product_index => $set['rows'][$default_product_index],
    );
  }

  // /set loop
  unset($set);

  //dpm($sets, '$sets');
  return $sets;
}