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); } }
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); }
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 }); } }
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)); }
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); }