From d4c323bbc6da68b5db6362dc86f31f99e2ec08bd Mon Sep 17 00:00:00 2001
From: Maciej Zgadzaj <maciej.zgadzaj@gmail.com>
Date: Mon, 10 Dec 2012 05:51:28 -0500
Subject: [PATCH] Issue #1861170 by maciej.zgadzaj: Option to specify a default product from multiple referenced products

---
 .../commerce_product_reference.api.php             |   22 ++++++++++++++++++++
 .../commerce_product_reference.module              |   21 ++++++++++++++++++-
 2 files changed, 42 insertions(+), 1 deletions(-)
 create mode 100644 modules/product_reference/commerce_product_reference.api.php

diff --git a/modules/product_reference/commerce_product_reference.api.php b/modules/product_reference/commerce_product_reference.api.php
new file mode 100644
index 0000000..0a9c159
--- /dev/null
+++ b/modules/product_reference/commerce_product_reference.api.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * This file contains no working PHP code; it exists to provide additional
+ * documentation for doxygen as well as to document hooks in the standard
+ * Drupal manner.
+ */
+
+/**
+ * Allows modules to alter the default product used by Product reference fields.
+ *
+ * By default Product reference fields use the first product from all products
+ * referenced by such field as a default one. This hook allows you to change
+ * this behavior and set any other of available $products as a default one
+ * by changing its $default_product_delta value.
+ *
+ * @see commerce_product_reference_default_product()
+ */
+function hook_commerce_product_reference_default_product_alter(&$default_product_delta, $products) {
+  $default_product_delta = 2;
+}
diff --git a/modules/product_reference/commerce_product_reference.module b/modules/product_reference/commerce_product_reference.module
index 62cb8b8..c949624 100644
--- a/modules/product_reference/commerce_product_reference.module
+++ b/modules/product_reference/commerce_product_reference.module
@@ -322,7 +322,7 @@ function commerce_product_reference_entity_view($entity, $entity_type, $view_mod
         $product = $wrapper->{$field_name}->value();
       }
       else {
-        $product = $wrapper->{$field_name}->get(0)->value();
+        $product = commerce_product_reference_default_product($wrapper, $field_name);
 
         // If the product is disabled, attempt to find one that is active and
         // use that as the default product instead.
@@ -1390,6 +1390,25 @@ function commerce_product_reference_preprocess_entity(&$variables) {
 }
 
 /**
+ * Returns the default product for the wrapped entity and product reference
+ * field, providing option for other modules to alter its value.
+ *
+ * @param $wrapper
+ *   EntityMetadataWrapper of the entity referencing a product.
+ * @param $field_name
+ *   The name of the product reference field being processed.
+ *
+ * @return
+ *   The fully loaded product.
+ */
+function commerce_product_reference_default_product($wrapper, $field_name) {
+  $default_product_delta = 0;
+  drupal_alter('commerce_product_reference_default_product', $default_product_delta, $wrapper->{$field_name}->value());
+
+  return $wrapper->{$field_name}->get($default_product_delta)->value();
+}
+
+/**
  * Exception thrown when the referenced product display formatter goes into a
  * potentially infinite loop.
  */
-- 
1.7.2.5

