[Update 9/2014 - note that as of nopCommerce 3.0, there is no longer a ProductVariant, so just delete "ProductVariant." from any expression below]
You can have shipping calculations based on the product specification attributes of items in the cart.
As an example, let's exclude a shipping method if the "Assembled" specification attribute option is applied to any item in the cart:
We have configured a Specification Attribute "Assembly" having only a single option "Assembled", and we want to hide shipping option "In-Store Pickup" if any items in the cart have the "Assembled" specification attribute option.
Here how it looks if you're using an carrier rate calculation method like Fedex. The first Option record is an "In-Store Pickup" defined in SD and will appear with $0 only if no products in the cart have "Assembled" attribute.
(We'll use a Reference as a shortcut to get the specification attributes to make it more readable):
Order | Type | Name | Expression | Rate Expression |
100 | Reference | Attributes | ProductVariant.Product.ProductSpecificationAttributes | |
200 | Option | In-Store Pickup | !Items.Any([@Attributes].Any( SpecificationAttributeOption.Name = "Assembled")) | 0 |
300 | Option | FedEx | true | Shipping.Fedex |
Here how it looks if you're using an internal rate calculation method like ByWeight, and defined a Shipping Method "In-Store Pickup" in Admin > Configuration > Shipping > Shipping Methods:
Order | Type | Name | Expression | Rate Expression | Name Expression |
100 | Reference | Attributes | ProductVariant.Product.ProductSpecificationAttributes | | |
200 | Option | Shipping By Weight | true | Shipping.ByWeight | [$Name] = "In-Store Pickup" and Items.Any([@Attributes].Any( SpecificationAttributeOption.Name = "Assembled")) ? "" : [$Name] |
When Shipping Director processes the Option record, the Name Expression is computed for each shipping method option returned by the Shipping.Weight plugin (e.g. "In-Store Pickup", "Ground", "Air", etc.).
When a plugin returns multiple shipping options, calculating a specific Name Expression to blank will suppress that option. (the ternary opertator " ? : " acts like an if-then-else)
For the SpecificationAttributeOption in the above example, if you want to use the Id rather than the Name (e.g. your Name is localized, or it it might be changing in future), then be sure to check the SQL database table [SpecificationAttributeOption] to get the correct Id:
... .Any(SpecificationAttributeOption.Id = 1) ...
If you've localized your shipping methods names (i.e. created a language resource with Resource Name = "In-Store Pickup"), then be sure to use SD's GetLocaleString() function (must be assigned to a string variable) to get the localized name for use in the expression above:
Order | Type | Name | Expression |
10 | String | In-Store Pickup Text | GetLocaleString("In-Store Pickup") |
Then in the Option record, reference the variable : ... $Name = [In-Store Pickup Text] and Items.Any(...
(P.S. If you ever need to check the Attribute rather than an AttributeOption, then use SpecificationAttributeOption.SpecificationAttribute.Name . For example, above we said we have a Specification Attribute "Assembly" having only a single option "Assembled". But it could also have had two options: "Assembled" and "Not Assembled". If we didn't care which option, but just that it had the "Assembly" Attribute, then we'd use SpecificationAttributeOption.SpecificationAttribute.Name = "Assembly".)