Previously in this blog Exclude Shipping Methods by Specification Attribute we discussed checking a Product Specification Attribute. The scenario was that if a product required assembly, that it could not be picked up in the store.
In this blog, we'll look at how to examine a Product Attribute. (Product Attributes are actually Product Variant Attributes). For example, let's say our "Assembled" attribute is something the customer chooses at the time of adding an item to a cart; they can choose a value of "Yes", or "No". NopCommerce stores customer attribute choices in the shopping cart item's AttributeXml field. However, we don't have to parse the XML - this field is a string, and we can just look for the correct <Value> tag in the string using the Contains() function. Here's what a typical AttributeXml looks like for a product variant having only a single attribute (I've added spacing and linefeeds for readability):
<Attributes>
<ProductVariantAttribute ID="1">
<ProductVariantAttributeValue><Value>1</Value></ProductVariantAttributeValue>
</ProductVariantAttribute>
</Attributes>
It's that <ProductVariantAttributeValue><Value>1</Value> we are looking for - that number "1" in the value tag is the unique Id of the attribute value in the database table (just <Value>1</Value> would be enough, but I'll also include the parent tag to make it clear)
We'll use the same scenatio we did last time - Always offer Fedex, and only offer In-Store pickup if item does NOT require assembly (the leading "!" is the NOT operator). Here we go...
Order | Type | Name | Expression | Rate Expression |
100 | String | Assembled Yes Tag | "<ProductVariantAttributeValue><Value>1</Value>" |
|
200 | Option | In-Store Pickup | !Items.Any( AttributesXml.Contains([Assembled Yes Tag])) | 0 |
300 | Option | FedEx | true | Shipping.Fedex |
Yep, that's it! You will, however, have to find the correct Value Id. To do that, either check in the database - e.g:
-- Products (Variants) and their Attribute/Valuesor, you can use Shipping Director to just dump out the AttributeXml to examine. Set up this record:
Add new 'Shipping Director' record | |
Order | 0 |
Active | checked |
Type | ErrorExit |
Name | AttributesXml |
Expression | true |
Description Expression | Items.First().AttributesXml |
Then, put an item with desired selection in the cart and Estimate Shipping.