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;
}