Fix regression where submitting back office contribution with a price set selected...
authorEileen McNaughton <emcnaughton@wikimedia.org>
Thu, 14 Dec 2023 09:33:36 +0000 (22:33 +1300)
committerEileen McNaughton <emcnaughton@wikimedia.org>
Thu, 14 Dec 2023 09:33:36 +0000 (22:33 +1300)
CRM/Contribute/Form/Contribution.php
CRM/Core/Form.php
CRM/Price/BAO/PriceSet.php

index 8a343718bb9003c59ce72177237c0139417c38ee..739caae2019ed525ce4aa7cdbaa619d0d57c0ce0 100644 (file)
@@ -611,16 +611,9 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
       ($this->_priceSetId || !empty($_POST['price_set_id']))
     ) {
       $buildPriceSet = TRUE;
-      $getOnlyPriceSetElements = TRUE;
-      if (!$this->_priceSetId) {
-        $this->_priceSetId = $_POST['price_set_id'];
-        $getOnlyPriceSetElements = FALSE;
-      }
-
       $this->buildPriceSet();
-
-      // get only price set form elements.
-      if ($getOnlyPriceSetElements) {
+      if (!$this->isSubmitted()) {
+        // This is being called in overload mode to render the price set.
         return;
       }
     }
@@ -2402,13 +2395,19 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
   /**
    * Get the price set ID.
    *
-   * Note that the function currently returns NULL if not submitted
-   * but will over time be fixed to always return an ID.
+   * @api Supported for external use.
    *
    * @return int|null
    */
-  protected function getPriceSetID() {
-    return $this->getSubmittedValue('price_set_id') ?: CRM_Utils_Request::retrieve('priceSetId', 'Integer');
+  public function getPriceSetID(): ?int {
+    $priceSetID = $this->getSubmittedValue('price_set_id') ?: CRM_Utils_Request::retrieve('priceSetId', 'Integer');
+    // Ideally we would use $this->isFormBuilt() here to know when to access the _POST
+    // array directly. However, the parent sets isBuilt before, building the form,
+    // rather than after.
+    if (!$priceSetID && !empty($this->getSubmitValue('price_set_id'))) {
+      return (int) $this->getSubmitValue('price_set_id');
+    }
+    return $priceSetID ?? NULL;
   }
 
   /**
index 039b008649d6722181c18f939b4cfeba3f590b93..6dae88f22eac973e1ef3e1011e6d3b035070cd6a 100644 (file)
@@ -712,6 +712,8 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    * buildQuickForm.
    */
   public function buildForm() {
+    // @todo - move this to the end of the function - then it can be checked
+    // ie $this->isBuilt() to determine whether variables are not yet in getSubmittedValues()
     $this->_formBuilt = TRUE;
 
     $this->preProcess();
index 22eec5611046f2813b7f2f3b92ee2205ce9c1807..d27474c74d44b2c273dff7dfa1a0600592f3b1c7 100644 (file)
@@ -678,7 +678,7 @@ WHERE  id = %1";
       [$params, $lineItem] = self::getLine($params, $lineItem, $priceSetID, $field, $id);
     }
     $order = new CRM_Financial_BAO_Order();
-    $order->setLineItems($lineItem);
+    $order->setLineItems((array) $lineItem);
     $params['amount_level'] = $order->getAmountLevel();
     $params['amount'] = $order->getTotalAmount();
     $params['tax_amount'] = $order->getTotalTaxAmount();