Fix invalid price field id
Created by: ahed-compucorp
Overview
This PR fixed the issue when adding more than one line item at a time on CiviCRM 5.35.1 .
Before
After
Technical Details
This extension will create price field for each new line item inside the foreach
loop.
foreach ($lineItemParams as $key => $lineItem) {
if ($lineItem['price_field_value_id'] == 'new') {
list($lineItem['price_field_id'], $lineItem['price_field_value_id']) = CRM_Lineitemedit_Util::createPriceFieldByContributionID($entityID);
}
...
$newLineItem[] = civicrm_api3('LineItem', 'create', $newLineItemParams)['id'];
}
When creating the line item CiviCRM internally will validate each price field and one of the validation steps is fetching the potential values/options to check against - see utils.php#L2276.
$options = civicrm_api($entity, 'getoptions', $options_lookup_params);
CiviCRM will cache getoptions
result in PseudoConstant.php#L278
\Civi::$statics[__CLASS__][$cacheKey] = $output;
Everything is fine for one line item creating but when we create two items or more in one go, the price fields ids was cached in the first iteration during the creating of the first line item and CiviCRM will throw error when creating the second line item because the price field is invalid.
To overcome this issue, I moved the creation of line items outside of the foreach
loop. That way the main foreach
loop will prepare the params and create the required price fields and then will create the line items in the new foreach
loop.