public ActionResult ProductAttributeConditionPopup(string btnId, string formId, ProductAttributeConditionModel model, FormCollection form) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts)) return AccessDeniedView(); var productAttributeMapping = _productAttributeService.GetProductAttributeMappingById(model.ProductAttributeMappingId); if (productAttributeMapping == null) //No attribute value found with the specified id return RedirectToAction("List", "Product"); var product = _productService.GetProductById(productAttributeMapping.ProductId); if (product == null) throw new ArgumentException("No product found with the specified id"); //a vendor should have access only to his products if (_workContext.CurrentVendor != null && product.VendorId != _workContext.CurrentVendor.Id) return RedirectToAction("List", "Product"); string attributesXml = null; if (model.EnableCondition) { var attribute = _productAttributeService.GetProductAttributeMappingById(model.SelectedProductAttributeId); if (attribute != null) { string controlId = string.Format("product_attribute_{0}", 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()); } else { //for conditions we should empty values save even when nothing is selected //otherwise "attributesXml" will be empty //hence we won't be able to find a selected attribute attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, ""); } } else { //for conditions we should empty values save even when nothing is selected //otherwise "attributesXml" will be empty //hence we won't be able to find a selected attribute attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, ""); } } break; case AttributeControlType.Checkboxes: { var cblAttributes = form[controlId]; if (!String.IsNullOrEmpty(cblAttributes)) { bool anyValueSelected = false; foreach (var item in cblAttributes.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries)) { int selectedAttributeId = int.Parse(item); if (selectedAttributeId > 0) { attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedAttributeId.ToString()); anyValueSelected = true; } } if (!anyValueSelected) { //for conditions we should save empty values even when nothing is selected //otherwise "attributesXml" will be empty //hence we won't be able to find a selected attribute attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, ""); } } else { //for conditions we should save empty values even when nothing is selected //otherwise "attributesXml" will be empty //hence we won't be able to find a selected attribute attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, ""); } } break; case AttributeControlType.ReadonlyCheckboxes: case AttributeControlType.TextBox: case AttributeControlType.MultilineTextbox: case AttributeControlType.Datepicker: case AttributeControlType.FileUpload: default: //these attribute types are supported as conditions break; } } } productAttributeMapping.ConditionAttributeXml = attributesXml; _productAttributeService.UpdateProductAttributeMapping(productAttributeMapping); ViewBag.RefreshPage = true; ViewBag.btnId = btnId; ViewBag.formId = formId; return View(model); }
public ActionResult ProductAttributeConditionPopup(string btnId, string formId, int productAttributeMappingId) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts)) return AccessDeniedView(); var productAttributeMapping = _productAttributeService.GetProductAttributeMappingById(productAttributeMappingId); if (productAttributeMapping == null) //No attribute value found with the specified id return RedirectToAction("List", "Product"); var product = _productService.GetProductById(productAttributeMapping.ProductId); if (product == null) throw new ArgumentException("No product found with the specified id"); //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 ProductAttributeConditionModel(); model.ProductAttributeMappingId = productAttributeMapping.Id; model.EnableCondition = !String.IsNullOrEmpty(productAttributeMapping.ConditionAttributeXml); //pre-select attribute and values var selectedPva = _productAttributeParser .ParseProductAttributeMappings(productAttributeMapping.ConditionAttributeXml) .FirstOrDefault(); var attributes = _productAttributeService.GetProductAttributeMappingsByProductId(product.Id) //ignore non-combinable attributes (should have selectable values) .Where(x => x.CanBeUsedAsCondition()) //ignore this attribute (it cannot depend on itself) .Where(x => x.Id != productAttributeMapping.Id) .ToList(); foreach (var attribute in attributes) { var attributeModel = new ProductAttributeConditionModel.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 ProductAttributeConditionModel.ProductAttributeValueModel { Id = attributeValue.Id, Name = attributeValue.Name, IsPreSelected = attributeValue.IsPreSelected }; attributeModel.Values.Add(attributeValueModel); } //pre-select attribute and value if (selectedPva != null && attribute.Id == selectedPva.Id) { //attribute model.SelectedProductAttributeId = selectedPva.Id; //values switch (attribute.AttributeControlType) { case AttributeControlType.DropdownList: case AttributeControlType.RadioList: case AttributeControlType.Checkboxes: case AttributeControlType.ColorSquares: { if (!String.IsNullOrEmpty(productAttributeMapping.ConditionAttributeXml)) { //clear default selection foreach (var item in attributeModel.Values) item.IsPreSelected = false; //select new values var selectedValues = _productAttributeParser.ParseProductAttributeValues(productAttributeMapping.ConditionAttributeXml); foreach (var attributeValue in selectedValues) foreach (var item in attributeModel.Values) if (attributeValue.Id == item.Id) item.IsPreSelected = true; } } break; case AttributeControlType.ReadonlyCheckboxes: case AttributeControlType.TextBox: case AttributeControlType.MultilineTextbox: case AttributeControlType.Datepicker: case AttributeControlType.FileUpload: default: //these attribute types are supported as conditions break; } } } model.ProductAttributes.Add(attributeModel); } return View(model); }