Example #1
0
        public ActionResult Translate(string culture, ProductModel model, string @return)
        {
            var product     = CurrentInstance.Database.Repository <Product>().Find(model.Id);
            var productType = product.ProductType;
            var controls    = FormControls.Controls().ToList();

            var translations = new List <PropertyTranslation>();

            translations.Add(new PropertyTranslation("Name", product.Name, model.Name));

            foreach (var definition in productType.CustomFieldDefinitions)
            {
                var field   = model.CustomFields.FirstOrDefault(c => c.FieldName == definition.Name);
                var control = controls.Find(c => c.Name == definition.ControlType);

                if (!control.IsSelectionList && !control.IsValuesPredefined)
                {
                    var originalField = product.CustomFields.FirstOrDefault(f => f.FieldName == definition.Name);
                    translations.Add(new PropertyTranslation("CustomFields[" + field.FieldName + "]", originalField == null ? null : originalField.FieldValue, field.FieldValue));
                }
            }

            _translationStore.AddOrUpdate(CultureInfo.GetCultureInfo(culture), new EntityKey(typeof(Product), model.Id), translations);

            foreach (var variant in model.Variants)
            {
                var originalVariant = product.Variants.FirstOrDefault(v => v.Id == variant.Id);
                var variantKey      = new EntityKey(typeof(ProductVariant), variant.Id);
                _translationStore.AddOrUpdate(CultureInfo.GetCultureInfo(culture), variantKey, GetVariantTranslations(variant, originalVariant, productType, controls));
            }

            return(AjaxForm().RedirectTo(@return));
        }
        protected override void MapProperty(System.Reflection.PropertyInfo targetProperty, object source, object target, Type sourceType, Type targetType, string propertyPath, MappingContext context)
        {
            var model   = target as ProductVariant;
            var variant = source as Kooboo.Commerce.Products.ProductVariant;

            if (targetProperty.Name == "VariantFields" && context.Includes.Includes(propertyPath))
            {
                var product     = context.ApiContext.Database.Repository <Kooboo.Commerce.Products.Product>().Find(variant.ProductId);
                var productType = product.ProductType;

                var controls = FormControls.Controls().ToList();

                foreach (var definition in productType.VariantFieldDefinitions)
                {
                    var field      = variant.VariantFields.FirstOrDefault(f => f.FieldName == definition.Name);
                    var fieldModel = new CustomField
                    {
                        FieldName  = definition.Name,
                        FieldLabel = productType.GetText("VariantFieldDefinitions[" + definition.Name + "].Label", context.ApiContext.Culture),
                        FieldValue = field == null ? null : field.FieldValue
                    };

                    if (String.IsNullOrEmpty(fieldModel.FieldLabel))
                    {
                        fieldModel.FieldLabel = definition.Label;
                    }

                    if (field != null)
                    {
                        var control = controls.Find(c => c.Name == definition.ControlType);
                        if (!control.IsSelectionList && !control.IsValuesPredefined)
                        {
                            fieldModel.FieldText = variant.GetText("VariantFields[" + definition.Name + "]", context.ApiContext.Culture);
                        }
                        else
                        {
                            if (control.IsSelectionList)
                            {
                                fieldModel.FieldText = productType.GetText("VariantFieldDefinitions[" + definition.Name + "].SelectionItems[" + fieldModel.FieldValue + "]", context.ApiContext.Culture);
                            }
                            else
                            {
                                fieldModel.FieldText = productType.GetText("VariantFieldDefinitions[" + definition.Name + "].DefaultValue", context.ApiContext.Culture);
                            }
                        }
                    }

                    if (String.IsNullOrEmpty(fieldModel.FieldText))
                    {
                        fieldModel.FieldText = fieldModel.FieldValue;
                    }

                    model.VariantFields.Add(fieldModel);
                }
            }
            else
            {
                base.MapProperty(targetProperty, source, target, sourceType, targetType, propertyPath, context);
            }
        }
Example #3
0
        private List <ProductVariantModel> GetVariants(Product product, ProductType productType, string culture)
        {
            var controls = FormControls.Controls().ToList();
            var models   = new List <ProductVariantModel>();

            foreach (var variant in product.Variants)
            {
                var variantKey  = new EntityKey(typeof(ProductVariant), variant.Id);
                var translation = _translationStore.Find(CultureInfo.GetCultureInfo(culture), variantKey);

                var model = new ProductVariantModel
                {
                    Id    = variant.Id,
                    Sku   = variant.Sku,
                    Price = variant.Price
                };

                foreach (var fieldDefinition in productType.VariantFieldDefinitions)
                {
                    // field might be null because admin can add new fields to product types when products already exist
                    var field    = variant.VariantFields.FirstOrDefault(f => f.FieldName == fieldDefinition.Name);
                    var control  = controls.Find(c => c.Name == fieldDefinition.ControlType);
                    var compared = new CustomFieldModel
                    {
                        FieldName  = fieldDefinition.Name,
                        FieldText  = control.GetFieldDisplayText(fieldDefinition, field == null ? null : field.FieldValue),
                        FieldValue = field == null ? null : field.FieldValue
                    };

                    var translated = new CustomFieldModel
                    {
                        FieldName  = compared.FieldName,
                        FieldText  = compared.FieldText,
                        FieldValue = compared.FieldValue
                    };

                    var diff = new CustomFieldModel
                    {
                        FieldName = compared.FieldName
                    };

                    // If the field value is entered in product editing page, then it's always the field value that get translated
                    if (translation != null && !control.IsSelectionList && !control.IsValuesPredefined)
                    {
                        translated.FieldText  = translation.GetTranslatedText("VariantFields[" + fieldDefinition.Name + "]");
                        translated.FieldValue = translated.FieldText;

                        diff.FieldText = DiffHelper.GetDiffHtml(translation.GetOriginalText("VariantFields[" + fieldDefinition.Name + "]"), field == null ? null : field.FieldValue);
                    }

                    model.VariantFields.Add(new TranslationTuple <CustomFieldModel>(compared, diff, translated));
                }

                models.Add(model);
            }

            return(models);
        }
Example #4
0
 public IEnumerable <SelectListItem> GetSelectListItems(RequestContext requestContext, string filter = null)
 {
     foreach (var item in FormControls.Controls())
     {
         yield return(new SelectListItem
         {
             Text = item.Name,
             Value = item.Name
         });
     }
 }
Example #5
0
        public ActionResult Translate(int id, string culture)
        {
            var product     = CurrentInstance.Database.Repository <Product>().Find(id);
            var productType = product.ProductType;

            var controls = FormControls.Controls().ToList();

            var compared   = Mapper.Map <Product, ProductModel>(product);
            var translated = Mapper.Map <Product, ProductModel>(product);
            var difference = new ProductModel();

            var productKey  = new EntityKey(typeof(Product), product.Id);
            var translation = _translationStore.Find(CultureInfo.GetCultureInfo(culture), productKey);

            if (translation != null)
            {
                translated.Name = translation.GetTranslatedText("Name");
                difference.Name = DiffHelper.GetDiffHtml(translation.GetOriginalText("Name"), product.Name);
            }

            // Custom fields
            // Product type definition might change, so we need to display fields base on product type definition
            compared.CustomFields.Clear();
            translated.CustomFields.Clear();

            foreach (var definition in productType.CustomFieldDefinitions)
            {
                var control = controls.Find(c => c.Name == definition.ControlType);
                var field   = product.CustomFields.FirstOrDefault(f => f.FieldName == definition.Name) ?? new ProductCustomField(definition.Name, null);

                var comparedField = MapOrDefault(definition, field);
                comparedField.FieldText = control.GetFieldDisplayText(definition, field == null ? null : field.FieldValue);
                compared.CustomFields.Add(comparedField);

                var translatedField = MapOrDefault(definition, field);
                translatedField.FieldText = comparedField.FieldText;

                var diffField = new CustomFieldModel {
                    FieldName = definition.Name
                };

                // If the field value is defined in product editing page, then it's always the field value that get translated
                if (translation != null && !control.IsSelectionList && !control.IsValuesPredefined)
                {
                    translatedField.FieldText  = translation.GetTranslatedText("CustomFields[" + field.FieldName + "]");
                    translatedField.FieldValue = translatedField.FieldText;

                    diffField.FieldText = DiffHelper.GetDiffHtml(translation.GetOriginalText("CustomFields[" + field.FieldName + "]"), comparedField.FieldText);
                }

                translated.CustomFields.Add(translatedField);
                difference.CustomFields.Add(diffField);
            }

            // Variants
            translated.Variants = GetVariants(product, productType, culture);

            ViewBag.ProductType = productType;
            ViewBag.Compared    = compared;
            ViewBag.Difference  = difference;

            return(View(translated));
        }
Example #6
0
        public static ProductModel Create(Product product, CultureInfo culture, CategoryTree categoryCache)
        {
            var doc = new ProductModel
            {
                Id   = product.Id,
                Name = product.GetText("Name", culture) ?? product.Name
            };

            // Brand
            if (product.Brand != null)
            {
                doc.Brand   = product.Brand.GetText("Name", culture) ?? product.Brand.Name;
                doc.BrandId = product.Brand.Id;
            }

            // Categories
            var categoryNames = new HashSet <string>();
            var categoryIds   = new HashSet <int>();

            foreach (var category in product.Categories)
            {
                foreach (var each in categoryCache.Find(category.Id).PathFromRoot())
                {
                    var name = Localizer.GetText(new EntityKey(typeof(Category), each.Id), "Name", culture);
                    if (String.IsNullOrEmpty(name))
                    {
                        name = each.Name;
                    }

                    categoryNames.Add(name);
                    categoryIds.Add(each.Id);
                }
            }

            doc.Categories  = categoryNames.ToList();
            doc.CategoryIds = categoryIds.ToList();

            // Prices
            foreach (var variant in product.Variants)
            {
                doc.Prices.Add(variant.Price);
            }

            doc.LowestPrice  = product.LowestPrice;
            doc.HighestPrice = product.HighestPrice;

            // Variant fields
            var controls = FormControls.Controls().ToList();

            foreach (var variant in product.Variants)
            {
                foreach (var fieldDef in product.ProductType.VariantFieldDefinitions)
                {
                    var variantField = variant.VariantFields.FirstOrDefault(f => f.FieldName == fieldDef.Name);
                    if (variantField != null)
                    {
                        string fieldValue = null;
                        var    control    = controls.Find(c => c.Name == fieldDef.ControlType);
                        if (control.IsSelectionList)
                        {
                            var item = fieldDef.SelectionItems.FirstOrDefault(i => i.Value == variantField.FieldValue);
                            if (item != null)
                            {
                                fieldValue = product.ProductType.GetText("VariantFieldDefinitions[" + fieldDef.Name + "].SelectionItems[" + item.Value + "]", culture) ?? item.Text;
                            }
                        }
                        else if (control.IsValuesPredefined)
                        {
                            fieldValue = product.ProductType.GetText("VariantFieldDefinitions[" + fieldDef.Name + "].DefaultValue", culture) ?? fieldDef.DefaultValue;
                        }
                        else
                        {
                            fieldValue = variant.GetText("VariantFields[" + fieldDef.Name + "]", culture) ?? variantField.FieldValue;
                        }

                        if (!String.IsNullOrEmpty(fieldValue))
                        {
                            if (doc.VariantFieldValues.ContainsKey(fieldDef.Name))
                            {
                                doc.VariantFieldValues[fieldDef.Name].Add(fieldValue);
                            }
                            else
                            {
                                doc.VariantFieldValues.Add(fieldDef.Name, new HashSet <string> {
                                    fieldValue
                                });
                            }
                        }
                    }
                }
            }

            // Search text
            var searchText = new StringBuilder();

            searchText.Append(doc.Name);
            searchText.Append(" ").Append(doc.Brand);
            searchText.Append(" ").Append(String.Join(" ", doc.Categories));

            foreach (var each in doc.VariantFieldValues)
            {
                searchText.Append(" ").Append(String.Join(" ", each.Value));
            }

            doc.SearchText = searchText.ToString();

            return(doc);
        }