Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steveosoule/991568bd1eeb76f5b6614dd63c7d3605 to your computer and use it in GitHub Desktop.
Save steveosoule/991568bd1eeb76f5b6614dd63c7d3605 to your computer and use it in GitHub Desktop.
Miva - Basket Item SKU & variant_id Fix
<mvt:comment>
| ------------------------------------------------
| Basket Item SKU & variant_id Fix
| ------------------------------------------------
|
| ## Description:
|
| Update the sNN_BasketItems sku & variant_id fields when they are missing
| This is normally only needed when an item has been added from a:
| 1. Wishlist?
| 2. Upsell
|
| ## Instructions:
|
| 1. Install the [miva-sql-component module](https://github.com/ghassani/miva-sql-component)
| 2. Assign the `sql` item to the OSEL page
| 3. Create a ReadyTheme Content Section (code: `fix-missing-basket-item-variant-data`) with this as the content
| 4. Place the `fix-missing-basket-item-variant-data` RT CS on the OSEL page
| 5. Optionally, modify the `item:new_sku` logic down-below so that the basket:item:sku is set to the proper variant code or sku
|
| ------------------------------------------------
</mvt:comment>
<mvt:foreach iterator="item" array="basket:items">
<mvt:assign name="l.settings:item:options_count" value="miva_array_elements( l.settings:item:options )" />
<mvt:comment>
We only need to update items that don't have a sku
We only need to update items with options
</mvt:comment>
<mvt:if expr="l.settings:item:sku OR l.settings:item:options_count EQ 0">
<mvt:foreachcontinue />
</mvt:if>
<mvt:comment>
Load Variant ID based on the items options
</mvt:comment>
<mvt:do file="g.Module_Library_Utilities" name="l.result" value="OrderItem_DetermineVariant_WithOptions(l.settings:item, l.settings:item:options, l.settings:item:options_count, l.settings:item:loaded:product, l.settings:item:loaded:variant_id)" />
<mvt:comment>
With the Variant ID, load the Variant Parts
</mvt:comment>
<mvt:if expr="l.settings:item:loaded:variant_id">
<mvt:do file="g.Module_Library_DB" name="l.result" value="ProductList_Load_Variant(l.settings:item:loaded:product:id, l.settings:item:loaded:variant_id, l.settings:item:loaded:variant_parts)" />
</mvt:if>
<mvt:comment>
1. Update the Line Item's Variant ID
2. Update the Line Items' SKU
3. Update Basket Items' variables to be what they should be
4. Update the basket:groups too
</mvt:comment>
<mvt:if expr="l.settings:item:loaded:variant_id AND NOT l.settings:item:variant_id">
<mvt:comment>
1. Update the Line Item's Variant ID
</mvt:comment>
<mvt:assign name="l.settings:query:query" value="'UPDATE ' $ g.Store_Table_Prefix $ 'BasketItems SET variant_id = ? WHERE line_id = ?'" />
<mvt:assign name="l.settings:query:bind_parameters[1]" value="l.settings:item:loaded:variant_id" />
<mvt:assign name="l.settings:query:bind_parameters[2]" value="l.settings:item:line_id" />
<mvt:item name="sql" param="l.settings:query"/>
<mvt:comment>
2. Update the Line Items' SKU
NOTE: You may need to change the logic for what the sku is set to based on the store's needs/settings
</mvt:comment>
<mvt:if expr="miva_array_elements( l.settings:item:loaded:variant_parts ) EQ 1">
<mvt:if expr="l.settings:item:loaded:variant_parts[1]:sku">
<mvt:assign name="l.settings:item:new_sku" value="l.settings:item:loaded:variant_parts[1]:sku" />
<mvt:else>
<mvt:assign name="l.settings:item:new_sku" value="l.settings:item:loaded:variant_parts[1]:code" />
</mvt:if>
<mvt:assign name="l.settings:query:query" value="'UPDATE ' $ g.Store_Table_Prefix $ 'BasketItems SET sku = ? WHERE line_id = ?'" />
<mvt:assign name="l.settings:query:bind_parameters[1]" value="l.settings:item:new_sku" />
<mvt:assign name="l.settings:query:bind_parameters[2]" value="l.settings:item:line_id" />
<mvt:item name="sql" param="l.settings:query"/>
</mvt:if>
<mvt:comment>
3. Update Basket Items' variables to be what they should be
</mvt:comment>
<mvt:assign name="l.settings:item:variant_id" value="l.settings:item:loaded:variant_id" />
<mvt:assign name="l.settings:item:parts" value="l.settings:item:loaded:variant_parts" />
<mvt:if expr="l.settings:item:new_sku">
<mvt:assign name="l.settings:item:sku" value="l.settings:item:new_sku" />
</mvt:if>
<mvt:comment>
4. Update the basket:groups too
TODO: change this to miva_array_filter_ref?
</mvt:comment>
<mvt:foreach iterator="group" array="basket:groups">
<mvt:if expr="POS2 NE POS1">
<mvt:foreachcontinue />
</mvt:if>
<mvt:assign name="l.settings:group:sku" value="l.settings:item:sku" />
<mvt:assign name="l.settings:group:variant_id" value="l.settings:item:variant_id" />
<mvt:assign name="l.settings:group:parts" value="l.settings:item:parts" />
</mvt:foreach>
</mvt:if>
</mvt:foreach>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment