Debugging Drupal Commerce Promotions and Adjustments using Illuminate Collections (Drupal 8)
Today I found another instance where I decided to use Illuminate
Collections within my Drupal 8 code; whilst I was debugging an issue where a
Drupal Commerce promotion was incorrectly being applied to an order.
No adjustments were showing in the Drupal UI for that order, so after some
initial investigation and finding that $order->getAdjustments() was empty, I
determined that I would need to get the adjustments from each order item within
the order.
If the order were an array, this is how it would be structured in this
situation:
I started by using $order->getItems() to load the order’s items, converted
them into a Collection, and used the Collection’s pipe() method and the
dump() function provided by the Devel module to output the order items.
Now we have a Collection of order items, for each item we need to get it’s
adjustments. We can do this with map(), then call getAdjustments() on the
order item.
This would return a Collection of arrays, with each array containing it’s own
adjustments, so we can use flatten() to collapse all the adjustments into one
single-dimensional array.
There are a couple of refactors that we can do here though:
Use flatMap() to combine the flatten() and map() methods.
Use higher order messages to delegate straight to the getAdjustments()
method on the order, rather than having to create a closure and call the
method within it.
In this scenario, each order item had three adjustments - the correct promotion,
the incorrect one and the standard VAT addition. I wasn’t concerned about the
VAT adjustment for debugging, so I used filter() to remove it based on the
result of the adjustment’s getSourceId() method.
Now I have just the relevant adjustments, I want to be able to load each one to
load it and check it’s conditions. To do this, I need just the source IDs.
Again, I can use a higher order message to directly call getSourceId() on the
adjustment and return it’s value to map().
This returns a Collection containing just the relevant promotion IDs being
applied to the order that I can use for debugging.
Now just to find out why the incorrect promotion was applying!
Was this useful?
About me
I'm an Acquia-certified Drupal Triple Expert with 17 years of experience, an open-source software maintainer and Drupal core contributor, public speaker, live streamer, and host of the Beyond Blocks podcast.