Remove unused paymentInstrumentID from forms and fix regression #17589
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
As identified by https://lab.civicrm.org/extensions/smartdebit/-/issues/2 there is a core regression around the paymentInstrumentID using the default instead of the payment processor.
As pointed out by @eileenmcnaughton (#17510) we should be using the payment processor
paymentInstrumentID
. Prior to 5.21 (when propertyBag was introduced) we were because of a bug insetPaymentInstrumentID()
which ignored the incoming parameter. That was fixed with propertyBag which meant that we started using the default paymentInstrumentID (incorrectly in most cases).Going through the code I identified that in most cases we were getting a default and assigning it to the form (even supporting
payment_processor_id
as a URL parameter) but then ignoring it when submitting the form. The only time we do want it to work is when recording a payment without a payment processor - and that is the only time the instrument select element actually appears on the form and the value is available during postProcess.Before
Default paymentInstrumentID used when it shouldn't be.
After
Cleaned up setting of
paymentInstrumentID
and not overriding the payment processor anymore.Technical Details
buildPaymentForm()
is only relevant if we have a payment processor. So we should never pass a paymentInstrumentID.$form->paymentInstrumentID
is read but never set. So we can remove it throughout.Comments