11using System ;
2- using System . Linq ;
32using System . Collections . Generic ;
43using System . Diagnostics ;
4+ using System . Linq ;
5+ using System . Web ;
56using System . Xml ;
6- using SmartStore . Core . Domain . Catalog ;
7- using SmartStore . Collections ;
87using Newtonsoft . Json ;
9- using System . Web ;
8+ using SmartStore . Collections ;
9+ using SmartStore . Core . Domain . Catalog ;
1010
1111namespace SmartStore . Services . Catalog
1212{
@@ -104,33 +104,9 @@ public virtual Multimap<int, string> DeserializeProductVariantAttributes(string
104104 /// <returns>Selected product variant attributes</returns>
105105 public virtual IList < ProductVariantAttribute > ParseProductVariantAttributes ( string attributes )
106106 {
107- var pvaCollection = new List < ProductVariantAttribute > ( ) ;
108-
109- // codehint: sm-edit
110107 var ids = ParseProductVariantAttributeIds ( attributes ) ;
111- return this . ParseProductVariantAttributes ( ids . ToList ( ) ) . ToList ( ) ;
112- }
113-
114- public virtual IEnumerable < ProductVariantAttribute > ParseProductVariantAttributes ( ICollection < int > ids )
115- {
116108
117- if ( ids != null )
118- {
119- if ( ids . Count == 1 )
120- {
121- var pva = _productAttributeService . GetProductVariantAttributeById ( ids . ElementAt ( 0 ) ) ;
122- if ( pva != null )
123- {
124- return new ProductVariantAttribute [ ] { pva } ;
125- }
126- }
127- else
128- {
129- return _productAttributeService . GetProductVariantAttributesByIds ( ids . ToArray ( ) ) . ToList ( ) ;
130- }
131- }
132-
133- return Enumerable . Empty < ProductVariantAttribute > ( ) ;
109+ return _productAttributeService . GetProductVariantAttributesByIds ( ids ) ;
134110 }
135111
136112 /// <summary>
@@ -143,17 +119,20 @@ public virtual IEnumerable<ProductVariantAttributeValue> ParseProductVariantAttr
143119 var pvaValues = Enumerable . Empty < ProductVariantAttributeValue > ( ) ;
144120
145121 var attrs = DeserializeProductVariantAttributes ( attributes ) ;
146- var pvaCollection = ParseProductVariantAttributes ( attrs . Keys ) ;
122+ var pvaCollection = _productAttributeService . GetProductVariantAttributesByIds ( attrs . Keys ) ;
147123
148124 foreach ( var pva in pvaCollection )
149125 {
150126 if ( ! pva . ShouldHaveValues ( ) )
151127 continue ;
152128
153- var pvaValuesStr = attrs [ pva . Id ] ; //ParseValues(attributes, pva.Id);
154- var ids = from id in pvaValuesStr
155- where id . HasValue ( )
156- select id . ToInt ( ) ;
129+ var pvaValuesStr = attrs [ pva . Id ] ;
130+
131+ var ids =
132+ from id in pvaValuesStr
133+ where id . HasValue ( )
134+ select id . ToInt ( ) ;
135+
157136 var values = _productAttributeService . GetProductVariantAttributeValuesByIds ( ids . ToArray ( ) ) ;
158137
159138 pvaValues = pvaValues . Concat ( values ) ;
@@ -218,82 +197,72 @@ public virtual string AddProductAttribute(string attributes, ProductVariantAttri
218197 return pva . AddProductAttribute ( attributes , value ) ;
219198 }
220199
221- /// <summary>
222- /// Are attributes equal
223- /// </summary>
224- /// <param name="attributes1">The attributes of the first product</param>
225- /// <param name="attributes2">The attributes of the second product</param>
226- /// <returns>Result</returns>
227- public virtual bool AreProductAttributesEqual ( string attributes1 , string attributes2 )
200+ public virtual bool AreProductAttributesEqual ( string attributeXml1 , string attributeXml2 , IEnumerable < ProductVariantAttribute > attributes = null )
228201 {
229- var attrs1 = DeserializeProductVariantAttributes ( attributes1 ) ;
230- var attrs2 = DeserializeProductVariantAttributes ( attributes2 ) ;
202+ if ( attributeXml1 . IsCaseInsensitiveEqual ( attributeXml2 ) )
203+ return true ;
231204
232- if ( attrs1 . Count == attrs2 . Count )
233- {
234- var pva1Collection = ParseProductVariantAttributes ( attrs2 . Keys ) ;
235- var pva2Collection = ParseProductVariantAttributes ( attrs1 . Keys ) ;
236- foreach ( var pva1 in pva1Collection )
237- {
238- foreach ( var pva2 in pva2Collection )
239- {
240- if ( pva1 . Id == pva2 . Id )
241- {
242- var pvaValues1Str = attrs2 [ pva1 . Id ] ; // ParseValues(attributes2, pva1.Id);
243- var pvaValues2Str = attrs1 [ pva2 . Id ] ; // ParseValues(attributes1, pva2.Id);
244- if ( pvaValues1Str . Count == pvaValues2Str . Count )
245- {
246- foreach ( string str1 in pvaValues1Str )
247- {
248- bool hasAttribute = pvaValues2Str . Any ( x => x . IsCaseInsensitiveEqual ( str1 ) ) ;
249- if ( ! hasAttribute )
250- {
251- return false ;
252- }
253- }
254- }
255- else
256- {
257- return false ;
258- }
259- }
260- }
261- }
262- }
263- else
264- {
265- return false ;
266- }
205+ var attributes1 = DeserializeProductVariantAttributes ( attributeXml1 ) ;
206+ var attributes2 = DeserializeProductVariantAttributes ( attributeXml2 ) ;
207+
208+ if ( attributes1 . Count != attributes2 . Count )
209+ return false ;
210+
211+ IEnumerable < ProductVariantAttribute > pvaCollection1 = null ;
212+ IEnumerable < ProductVariantAttribute > pvaCollection2 = null ;
213+
214+ pvaCollection1 = _productAttributeService . GetProductVariantAttributesByIds ( attributes2 . Keys , attributes ) ;
215+
216+ if ( attributes2 . Keys . SequenceEqual ( attributes1 . Keys ) ) // often the case
217+ pvaCollection2 = pvaCollection1 ;
218+ else
219+ pvaCollection2 = _productAttributeService . GetProductVariantAttributesByIds ( attributes1 . Keys , attributes ) ;
220+
221+ foreach ( var pva1 in pvaCollection1 )
222+ {
223+ foreach ( var pva2 in pvaCollection2 )
224+ {
225+ if ( pva1 . Id == pva2 . Id )
226+ {
227+ var pvaValues1 = attributes2 [ pva1 . Id ] ;
228+ var pvaValues2 = attributes1 [ pva2 . Id ] ;
229+
230+ if ( pvaValues1 . Count != pvaValues2 . Count )
231+ return false ;
232+
233+ foreach ( string value1 in pvaValues1 )
234+ {
235+ string str1 = value1 . TrimSafe ( ) ;
236+
237+ if ( ! pvaValues2 . Any ( x => x . TrimSafe ( ) . IsCaseInsensitiveEqual ( str1 ) ) )
238+ return false ;
239+ }
240+ }
241+ }
242+ }
267243
268244 return true ;
269245 }
270246
271- /// <summary>
272- /// Finds a product variant attribute combination by attributes stored in XML
273- /// </summary>
274- /// <param name="product">Product</param>
275- /// <param name="attributesXml">Attributes in XML format</param>
276- /// <returns>Found product variant attribute combination</returns>
277- public virtual ProductVariantAttributeCombination FindProductVariantAttributeCombination ( Product product , string attributesXml )
247+ public virtual ProductVariantAttributeCombination FindProductVariantAttributeCombination ( Product product , string attributesXml , IEnumerable < ProductVariantAttribute > attributes = null )
278248 {
279249 if ( product == null )
280250 throw new ArgumentNullException ( "product" ) ;
281251
282- return FindProductVariantAttributeCombination ( product . Id , attributesXml ) ;
252+ return FindProductVariantAttributeCombination ( product . Id , attributesXml , attributes ) ;
283253 }
284254
285- public virtual ProductVariantAttributeCombination FindProductVariantAttributeCombination ( int productId , string attributesXml )
255+ public virtual ProductVariantAttributeCombination FindProductVariantAttributeCombination ( int productId , string attributesXml , IEnumerable < ProductVariantAttribute > attributes = null )
286256 {
287257 if ( attributesXml . HasValue ( ) )
288258 {
289- //existing combinations
290259 var combinations = _productAttributeService . GetAllProductVariantAttributeCombinations ( productId ) ;
291260 if ( combinations . Count == 0 )
292261 return null ;
293262
294263 foreach ( var combination in combinations )
295264 {
296- bool attributesEqual = AreProductAttributesEqual ( combination . AttributesXml , attributesXml ) ;
265+ bool attributesEqual = AreProductAttributesEqual ( combination . AttributesXml , attributesXml , attributes ) ;
297266 if ( attributesEqual )
298267 return combination ;
299268 }
0 commit comments