Skip to content

Commit 5640fef

Browse files
committed
Ignore selected attributes that are not of type list from finding an associated attribute combination
1 parent dc3b617 commit 5640fef

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ public virtual void ClearCachedAttributeValues()
180180
}
181181

182182
public virtual Multimap<int, string> DeserializeProductVariantAttributes(string attributesXml)
183+
{
184+
return DeserializeAttributesXml(attributesXml, null);
185+
}
186+
187+
private Multimap<int, string> DeserializeAttributesXml(string attributesXml, int[] includeAttributesIds = null)
183188
{
184189
var attrs = new Multimap<int, string>();
185190
if (String.IsNullOrEmpty(attributesXml))
@@ -195,7 +200,8 @@ public virtual Multimap<int, string> DeserializeProductVariantAttributes(string
195200
string sid = node1.Attribute("ID").Value;
196201
if (sid.HasValue())
197202
{
198-
if (int.TryParse(sid, out var id))
203+
if (int.TryParse(sid, out var id) &&
204+
(includeAttributesIds == null || includeAttributesIds.Contains(id)))
199205
{
200206
// ProductVariantAttributeValue/Value
201207
foreach (var node2 in node1.Descendants("Value"))
@@ -326,6 +332,11 @@ public virtual bool AreProductAttributesEqual(string attributeXml1, string attri
326332
var attributes1 = DeserializeProductVariantAttributes(attributeXml1);
327333
var attributes2 = DeserializeProductVariantAttributes(attributeXml2);
328334

335+
return AreProductAttributesEqual(attributes1, attributes2);
336+
}
337+
338+
private bool AreProductAttributesEqual(Multimap<int, string> attributes1, Multimap<int, string> attributes2)
339+
{
329340
if (attributes1.Count != attributes2.Count)
330341
return false;
331342

@@ -383,9 +394,14 @@ public virtual ProductVariantAttributeCombination FindProductVariantAttributeCom
383394
if (combinations.Count == 0)
384395
return null;
385396

397+
var listTypeValues = ParseProductVariantAttributeValues(attributesXml);
398+
var listTypeAttributesIds = listTypeValues.Select(x => x.ProductVariantAttributeId).ToArray();
399+
var listTypeAttributesMap = DeserializeAttributesXml(attributesXml, listTypeAttributesIds);
400+
386401
foreach (var combination in combinations)
387402
{
388-
bool attributesEqual = AreProductAttributesEqual(combination.AttributesXml, attributesXml);
403+
var combinationAttributesMap = DeserializeProductVariantAttributes(combination.AttributesXml);
404+
bool attributesEqual = AreProductAttributesEqual(combinationAttributesMap, listTypeAttributesMap);
389405
if (attributesEqual)
390406
return _productAttributeService.GetProductVariantAttributeCombinationById(combination.Id);
391407
}

0 commit comments

Comments
 (0)