public ActionResult AddAttributeCombinationPopup(string btnId, string formId, int productId, AddProductAttributeCombinationModel model, FormCollection form) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts)) return AccessDeniedView(); var product = _productService.GetProductById(productId); if (product == null) //No product found with the specified id return RedirectToAction("List", "Product"); //a vendor should have access only to his products if (_workContext.CurrentVendor != null&& product.VendorId != _workContext.CurrentVendor.Id) return RedirectToAction("List", "Product"); ViewBag.btnId = btnId; ViewBag.formId = formId; //attributes string attributesXml = ""; var warnings = new List<string>(); #region Product attributes var attributes = _productAttributeService.GetProductAttributeMappingsByProductId(product.Id) //ignore non-combinable attributes for combinations .Where(x => !x.IsNonCombinable()) .ToList(); foreach (var attribute in attributes) { string controlId = string.Format("product_attribute_{0}_{1}", attribute.ProductAttributeId, attribute.Id); switch (attribute.AttributeControlType) { case AttributeControlType.DropdownList: case AttributeControlType.RadioList: case AttributeControlType.ColorSquares: { var ctrlAttributes = form[controlId]; if (!String.IsNullOrEmpty(ctrlAttributes)) { int selectedAttributeId = int.Parse(ctrlAttributes); if (selectedAttributeId > 0) attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedAttributeId.ToString()); } } break; case AttributeControlType.Checkboxes: { var cblAttributes = form[controlId]; if (!String.IsNullOrEmpty(cblAttributes)) { foreach (var item in cblAttributes.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { int selectedAttributeId = int.Parse(item); if (selectedAttributeId > 0) attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedAttributeId.ToString()); } } } break; case AttributeControlType.ReadonlyCheckboxes: { //load read-only (already server-side selected) values var attributeValues = _productAttributeService.GetProductAttributeValues(attribute.Id); foreach (var selectedAttributeId in attributeValues .Where(v => v.IsPreSelected) .Select(v => v.Id) .ToList()) { attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedAttributeId.ToString()); } } break; case AttributeControlType.TextBox: case AttributeControlType.MultilineTextbox: { var ctrlAttributes = form[controlId]; if (!String.IsNullOrEmpty(ctrlAttributes)) { string enteredText = ctrlAttributes.Trim(); attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, enteredText); } } break; case AttributeControlType.Datepicker: { var date = form[controlId + "_day"]; var month = form[controlId + "_month"]; var year = form[controlId + "_year"]; DateTime? selectedDate = null; try { selectedDate = new DateTime(Int32.Parse(year), Int32.Parse(month), Int32.Parse(date)); } catch { } if (selectedDate.HasValue) { attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedDate.Value.ToString("D")); } } break; case AttributeControlType.FileUpload: { var httpPostedFile = this.Request.Files[controlId]; if ((httpPostedFile != null) && (!String.IsNullOrEmpty(httpPostedFile.FileName))) { var fileSizeOk = true; if (attribute.ValidationFileMaximumSize.HasValue) { //compare in bytes var maxFileSizeBytes = attribute.ValidationFileMaximumSize.Value * 1024; if (httpPostedFile.ContentLength > maxFileSizeBytes) { warnings.Add(string.Format(_localizationService.GetResource("ShoppingCart.MaximumUploadedFileSize"), attribute.ValidationFileMaximumSize.Value)); fileSizeOk = false; } } if (fileSizeOk) { //save an uploaded file var download = new Download { DownloadGuid = Guid.NewGuid(), UseDownloadUrl = false, DownloadUrl = "", DownloadBinary = httpPostedFile.GetDownloadBits(), ContentType = httpPostedFile.ContentType, Filename = Path.GetFileNameWithoutExtension(httpPostedFile.FileName), Extension = Path.GetExtension(httpPostedFile.FileName), IsNew = true }; _downloadService.InsertDownload(download); //save attribute attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, download.DownloadGuid.ToString()); } } } break; default: break; } } #endregion warnings.AddRange(_shoppingCartService.GetShoppingCartItemAttributeWarnings(_workContext.CurrentCustomer, ShoppingCartType.ShoppingCart, product, 1, attributesXml, true)); if (warnings.Count == 0) { //save combination var combination = new ProductAttributeCombination { ProductId = product.Id, AttributesXml = attributesXml, StockQuantity = model.StockQuantity, AllowOutOfStockOrders = model.AllowOutOfStockOrders, Sku = model.Sku, ManufacturerPartNumber = model.ManufacturerPartNumber, Gtin = model.Gtin, OverriddenPrice = model.OverriddenPrice, NotifyAdminForQuantityBelow = model.NotifyAdminForQuantityBelow, }; _productAttributeService.InsertProductAttributeCombination(combination); ViewBag.RefreshPage = true; return View(model); } //If we got this far, something failed, redisplay form PrepareAddProductAttributeCombinationModel(model, product); model.Warnings = warnings; return View(model); }
protected virtual void PrepareAddProductAttributeCombinationModel(AddProductAttributeCombinationModel model, Product product) { if (model == null) throw new ArgumentNullException("model"); if (product == null) throw new ArgumentNullException("product"); model.ProductId = product.Id; model.StockQuantity = 10000; model.NotifyAdminForQuantityBelow = 1; var attributes = _productAttributeService.GetProductAttributeMappingsByProductId(product.Id) //ignore non-combinable attributes for combinations .Where(x => !x.IsNonCombinable()) .ToList(); foreach (var attribute in attributes) { var attributeModel = new AddProductAttributeCombinationModel.ProductAttributeModel { Id = attribute.Id, ProductAttributeId = attribute.ProductAttributeId, Name = attribute.ProductAttribute.Name, TextPrompt = attribute.TextPrompt, IsRequired = attribute.IsRequired, AttributeControlType = attribute.AttributeControlType }; if (attribute.ShouldHaveValues()) { //values var attributeValues = _productAttributeService.GetProductAttributeValues(attribute.Id); foreach (var attributeValue in attributeValues) { var attributeValueModel = new AddProductAttributeCombinationModel.ProductAttributeValueModel { Id = attributeValue.Id, Name = attributeValue.Name, IsPreSelected = attributeValue.IsPreSelected }; attributeModel.Values.Add(attributeValueModel); } } model.ProductAttributes.Add(attributeModel); } }
//edit public ActionResult AddAttributeCombinationPopup(string btnId, string formId, int productId) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts)) return AccessDeniedView(); var product = _productService.GetProductById(productId); if (product == null) //No product found with the specified id return RedirectToAction("List", "Product"); //a vendor should have access only to his products if (_workContext.CurrentVendor != null && product.VendorId != _workContext.CurrentVendor.Id) return RedirectToAction("List", "Product"); ViewBag.btnId = btnId; ViewBag.formId = formId; var model = new AddProductAttributeCombinationModel(); PrepareAddProductAttributeCombinationModel(model, product); return View(model); }