allow setting of price set value via url for online membership pages
authorKurund Jalmi <kurund@yahoo.com>
Fri, 17 Jul 2015 10:50:22 +0000 (16:20 +0530)
committerKurund Jalmi <kurund@yahoo.com>
Fri, 17 Jul 2015 10:50:22 +0000 (16:20 +0530)
CRM/Price/BAO/PriceSet.php

index e79e9bdad5e386ba7eef95d8abae63188ce65dec..c7acad678b2789cf6e5e7c9ff747b42abaf4d42d 100644 (file)
@@ -1041,12 +1041,28 @@ WHERE  id = %1";
 
     foreach ($form->_priceSet['fields'] as $key => $val) {
       foreach ($val['options'] as $keys => $values) {
-        if ($values['is_default']) {
+        // build price field index which is passed via URL
+        // url format will be appended by "&price_5=11"
+        $priceFieldName = 'price_' . $values['price_field_id'];
+        $priceFieldValue = self::getPriceFieldValueFromURL($form, $priceFieldName);
+        if (!empty($priceFieldValue)) {
           if ($val['html_type'] == 'CheckBox') {
-            $defaults["price_{$key}"][$keys] = 1;
+            $defaults[$priceFieldName][$priceFieldValue] = 1;
           }
           else {
-            $defaults["price_{$key}"] = $keys;
+            $defaults[$priceFieldName] = $priceFieldValue;
+          }
+
+          // break here to prevent overwriting of default due to 'is_default'
+          // option configuration. The value sent via URL get's higher priority.
+          break;
+        }
+        elseif ($values['is_default']) {
+          if ($val['html_type'] == 'CheckBox') {
+            $defaults[$priceFieldName][$keys] = 1;
+          }
+          else {
+            $defaults[$priceFieldName] = $keys;
           }
         }
       }
@@ -1054,6 +1070,21 @@ WHERE  id = %1";
     return $defaults;
   }
 
+  /**
+   * Get the value of price field if passed via url
+   *
+   * @param CRM_Core_Form $form
+   * @param string $priceFieldName
+   *
+   * @return mixed $priceFieldValue
+   */
+  public static function getPriceFieldValueFromURL(&$form, $priceFieldName) {
+    $priceFieldValue = CRM_Utils_Request::retrieve($priceFieldName, 'String', $form, FALSE, NULL, 'GET');
+    if (!empty($priceFieldValue)) {
+      return $priceFieldValue;
+    }
+  }
+
   /**
    * Supports event create function by setting up required price sets, not tested but expect
    * it will work for contribution page