public IViewComponentResult Invoke(string widgetZone, object additionalData)
        {
            ICollection <ShoppingCartItem> cartItems = _workContext.CurrentCustomer.ShoppingCartItems;
            var cartPictureModifierModel             = new List <ProductPictureModifierModel>();

            foreach (var cart in cartItems)
            {
                if (string.IsNullOrWhiteSpace(cart.AttributesXml))
                {
                    continue;
                }

                string formattedAttribute = _productAttributeFormatter
                                            .FormatAttributes(cart.Product, cart.AttributesXml);
                string[] attributes = formattedAttribute.Split("<br />");

                string colorAttributesString = attributes
                                               .FirstOrDefault(x => x.Contains(ProductPictureModifierDefault.ProductAttributeName));

                string customUploadAttribute = attributes.FirstOrDefault(x =>
                                                                         x.Contains($"{ProductPictureModifierDefault.ProductAttributeNameForLogoUpload}: <a href="));

                if (string.IsNullOrWhiteSpace(colorAttributesString) || colorAttributesString.Split(":").Length != 2)
                {
                    continue;
                }

                (int, string)mergedPicture = (0, "");
                if (!string.IsNullOrEmpty(customUploadAttribute))
                {
                    //Get the download
                    Download download = _productPictureModifierService.GetDownloadFromAttributeXml(customUploadAttribute);

                    //Get position setting
                    var logoPosition = _logoPositionService.GetByProductId(cart.ProductId);

                    //Get the picture with custom logo
                    mergedPicture = _customLogoService.MergeProductPictureWithLogo(
                        download.DownloadBinary,
                        download.Id,
                        cart.ProductId,
                        ProductPictureModifierUploadType.Custom,
                        logoPosition.Size,
                        logoPosition.Opacity,
                        logoPosition.XCoordinate,
                        logoPosition.YCoordinate,
                        75
                        );
                }

                cartPictureModifierModel.Add(new ProductPictureModifierModel
                {
                    ColorCode       = colorAttributesString.Split(":").Last().Trim(),
                    EntityId        = cart.Id,
                    CustomImagePath = mergedPicture.Item2
                });
            }

            return(View("~/Plugins/Widgets.ProductPictureModifier/Views/PublicCartItemsColor.cshtml", cartPictureModifierModel));
        }
Exemplo n.º 2
0
        public IViewComponentResult Invoke(string widgetZone, object additionalData)
        {
            //Validate the request is being invoked from admin order's page
            if (!(additionalData is OrderModel order))
            {
                return(View("~/Plugins/Widgets.ProductPictureModifier/Views/PublicCartColorSelector.cshtml",
                            new List <ProductPictureModifierModel>()));
            }

            var cartPictureModifierModel = new List <ProductPictureModifierModel>();

            foreach (var orderItem in order.Items)
            {
                string[] attributes = orderItem.AttributeInfo.Split("<br />");

                string colorAttributesString = attributes
                                               .FirstOrDefault(x => x.Contains(ProductPictureModifierDefault.ProductAttributeName));

                string customUploadAttribute = attributes.FirstOrDefault(x =>
                                                                         x.Contains($"{ProductPictureModifierDefault.ProductAttributeNameForLogoUpload}: <a href="));
                if (string.IsNullOrWhiteSpace(colorAttributesString) || colorAttributesString.Split(":").Length != 2)
                {
                    continue;
                }

                (int, string)mergedPicture = (0, "");
                if (!string.IsNullOrEmpty(customUploadAttribute))
                {
                    //Get the download
                    Download download = _productPictureModifierService.GetDownloadFromAttributeXml(customUploadAttribute);

                    //Get position setting
                    LogoPosition logoPosition = _logoPositionService.GetByProductId(orderItem.ProductId);

                    //Get the picture with custom logo
                    mergedPicture = _customLogoService.MergeProductPictureWithLogo(
                        download.DownloadBinary,
                        download.Id,
                        orderItem.ProductId,
                        ProductPictureModifierUploadType.Custom,
                        logoPosition.Size,
                        logoPosition.Opacity,
                        logoPosition.XCoordinate,
                        logoPosition.YCoordinate,
                        75
                        );
                }

                cartPictureModifierModel.Add(new ProductPictureModifierModel
                {
                    ColorCode       = colorAttributesString.Split(":").Last().Trim(),
                    EntityId        = orderItem.Id,
                    CustomImagePath = mergedPicture.Item2
                });
            }

            return(View("~/Plugins/Widgets.ProductPictureModifier/Views/AdminOrderItemsColor.cshtml", cartPictureModifierModel));
        }
Exemplo n.º 3
0
        public virtual IActionResult CustomLogoAdd(LogoModel logo)
        {
            if (!_permissionService.Authorize(StandardPermissionProvider.ManageWidgets))
            {
                return(AccessDeniedView());
            }

            if (!ModelState.IsValid)
            {
                return(Json(new { Result = false, Errors = GetErrorsFromModelState() }));
            }

            //Get 1st product picture we use 1st picture of product to combine with logo
            ProductPicture productPicture = _productPictureModifierService
                                            .GetFirstProductPicture(logo.ProductId);

            if (productPicture == null)
            {
                throw new Exception("Product does not have any image");
            }

            byte[] logoBinary = _pictureService.LoadPictureBinary(_pictureService.GetPictureById(logo.PictureId));

            //Get new product image which has been merged with the logo uploaded
            (int, string)mergedPicture = _logoService.MergeProductPictureWithLogo(
                logoBinary,
                logo.PictureId,
                logo.ProductId,
                ProductPictureModifierUploadType.Predefined,
                logo.Size,
                logo.Opacity,
                logo.XCoordinate,
                logo.YCoordinate,
                overrideThumb: true);

            if (logo.AttributeValueId > 0)
            {
                var existingAttributeValue = _productAttributeService.
                                             GetProductAttributeValueById(logo.AttributeValueId);

                var existingProductPicture = _productService.GetProductPicturesByProductId(logo.ProductId)
                                             .First(x => x.PictureId == existingAttributeValue.PictureId);

                //update product attribute value
                existingAttributeValue.PictureId             = mergedPicture.Item1;
                existingAttributeValue.ImageSquaresPictureId = logo.PictureId;
                _productAttributeService.UpdateProductAttributeValue(existingAttributeValue);

                //update product picture
                existingProductPicture.PictureId = mergedPicture.Item1;
                _productService.UpdateProductPicture(existingProductPicture);

                return(Json(new { Result = true, AttributeId = logo.AttributeValueId }));
            }
            //Insert the image as product picture
            _productService.InsertProductPicture(new ProductPicture
            {
                ProductId    = logo.ProductId,
                PictureId    = mergedPicture.Item1,
                DisplayOrder = ProductPictureModifierDefault.MergedPictureDisplayOrder
            });

            ProductAttribute logoAttribute = _productPictureModifierService
                                             .GetProductAttributeByName(ProductPictureModifierDefault.ProductAttributeNameForLogo)
                                             .FirstOrDefault() ?? throw new ArgumentException("Product Attribute Not Found");

            //get product's attribute for predefined logo attributes
            ProductAttributeMapping logoProductMapping = _productAttributeService
                                                         .GetProductAttributeMappingsByProductId(logo.ProductId)
                                                         .FirstOrDefault(x => x.ProductAttributeId == logoAttribute.Id);

            //create the mapping if it does not exist
            if (logoProductMapping == null)
            {
                logoProductMapping = new ProductAttributeMapping
                {
                    ProductAttributeId     = logoAttribute.Id,
                    ProductId              = logo.ProductId,
                    AttributeControlTypeId = (int)AttributeControlType.ImageSquares
                };
                _productAttributeService.InsertProductAttributeMapping(logoProductMapping);

                ////no logo attribute
                ////todo find a way to use the picture for this
                //_productAttributeService.InsertProductAttributeValue(new ProductAttributeValue
                //{
                //    ProductAttributeMappingId = logoProductMapping.Id,
                //    AttributeValueType = AttributeValueType.Simple,
                //    Name = _localizationService.GetResource("Widgets.ProductPictureModifier.Attributes.NoLogo"),
                //    ImageSquaresPictureId = 1,
                //    PictureId = productPicture.PictureId,
                //});

                //provision for manual upload by user
                Setting customUploadIconSetting = _settingService
                                                  .GetSetting(ProductPictureModifierDefault.UploadIconPictureIdSetting);
                var customUploadForLogoAttribute = new ProductAttributeValue
                {
                    ProductAttributeMappingId = logoProductMapping.Id,
                    AttributeValueType        = AttributeValueType.Simple,
                    Name = _localizationService.GetResource("Widgets.ProductPictureModifier.Attributes.Upload"),
                    ImageSquaresPictureId = int.Parse(customUploadIconSetting.Value),
                };
                _productAttributeService.InsertProductAttributeValue(customUploadForLogoAttribute);

                ProductAttribute productAttributeForCustomUpload = _productPictureModifierService
                                                                   .GetProductAttributeByName(ProductPictureModifierDefault.ProductAttributeNameForLogoUpload)
                                                                   .FirstOrDefault() ?? throw new ArgumentException("Product Attribute Not Found for Custom Upload");

                //custom upload attribute mapping with product based on condition
                var customUploadProductAttributeMapping = new ProductAttributeMapping
                {
                    ProductAttributeId              = productAttributeForCustomUpload.Id,
                    ProductId                       = logo.ProductId,
                    AttributeControlTypeId          = (int)AttributeControlType.FileUpload,
                    ValidationFileAllowedExtensions = "png",
                    ConditionAttributeXml           = _productAttributeParser.AddProductAttribute(null, logoProductMapping,
                                                                                                  customUploadForLogoAttribute.Id.ToString())
                };
                _productAttributeService.InsertProductAttributeMapping(customUploadProductAttributeMapping);
            }

            //save the actual logo attribute
            var productAttributeValue = new ProductAttributeValue
            {
                ProductAttributeMappingId = logoProductMapping.Id,
                AttributeValueType        = AttributeValueType.Simple,
                Name = "Custom Logo",
                ImageSquaresPictureId = logo.PictureId,
                PictureId             = mergedPicture.Item1,
            };

            _productAttributeService.InsertProductAttributeValue(productAttributeValue);

            //Logo Position for custom upload
            LogoPosition logoPosition = _logoPositionService.GetByProductId(logo.ProductId);

            if (logo.MarkAsDefault || IsLogoSettingNew(logoPosition))
            {
                logoPosition.Size        = logo.Size;
                logoPosition.XCoordinate = logo.XCoordinate;
                logoPosition.YCoordinate = logo.YCoordinate;
                logoPosition.Opacity     = logo.Opacity;
                _logoPositionService.Update(logoPosition);
            }

            return(Json(new { Result = true, AttributeId = productAttributeValue.Id }));
        }
Exemplo n.º 4
0
        public IActionResult UploadFileProductAttribute(int attributeId)
        {
            var attribute = _productAttributeService.GetProductAttributeMappingById(attributeId);

            if (attribute == null || attribute.AttributeControlType != AttributeControlType.FileUpload)
            {
                return(Json(new
                {
                    success = false,
                    downloadGuid = Guid.Empty
                }));
            }

            var httpPostedFile = Request.Form.Files.FirstOrDefault();

            if (httpPostedFile == null)
            {
                return(Json(new
                {
                    success = false,
                    message = "No file uploaded",
                    downloadGuid = Guid.Empty
                }));
            }

            var fileBinary = _downloadService.GetDownloadBits(httpPostedFile);

            var qqFileNameParameter = "qqfilename";
            var fileName            = httpPostedFile.FileName;

            if (string.IsNullOrEmpty(fileName) && Request.Form.ContainsKey(qqFileNameParameter))
            {
                fileName = Request.Form[qqFileNameParameter].ToString();
            }
            //remove path (passed in IE)
            fileName = _fileProvider.GetFileName(fileName);

            var contentType = httpPostedFile.ContentType;

            var fileExtension = _fileProvider.GetFileExtension(fileName);

            if (!string.IsNullOrEmpty(fileExtension))
            {
                fileExtension = fileExtension.ToLowerInvariant();
            }

            if (attribute.ValidationFileMaximumSize.HasValue)
            {
                //compare in bytes
                var maxFileSizeBytes = attribute.ValidationFileMaximumSize.Value * 1024;
                if (fileBinary.Length > maxFileSizeBytes)
                {
                    //when returning JSON the mime-type must be set to text/plain
                    //otherwise some browsers will pop-up a "Save As" dialog.
                    return(Json(new
                    {
                        success = false,
                        message = string.Format(_localizationService.GetResource("ShoppingCart.MaximumUploadedFileSize"), attribute.ValidationFileMaximumSize.Value),
                        downloadGuid = Guid.Empty
                    }));
                }
            }

            var download = new Download
            {
                DownloadGuid   = Guid.NewGuid(),
                UseDownloadUrl = false,
                DownloadUrl    = "",
                DownloadBinary = fileBinary,
                ContentType    = contentType,
                //we store filename without extension for downloads
                Filename  = _fileProvider.GetFileNameWithoutExtension(fileName),
                Extension = fileExtension,
                IsNew     = true
            };

            _downloadService.InsertDownload(download);

            //generate new image merging the uploaded custom logo and product picture
            //newly added features for the override
            var logoPosition = _logoPositionService.GetByProductId(attribute.ProductId);

            (int, string)imagePath = _customLogoService.MergeProductPictureWithLogo(
                download.DownloadBinary,
                download.Id,
                attribute.ProductId,
                ProductPictureModifierUploadType.Custom,
                logoPosition.Size,
                logoPosition.Opacity,
                logoPosition.XCoordinate,
                logoPosition.YCoordinate,
                _mediaSettings.ProductDetailsPictureSize
                );
            //when returning JSON the mime-type must be set to text/plain
            //otherwise some browsers will pop-up a "Save As" dialog.
            return(Json(new
            {
                success = true,
                message = _localizationService.GetResource("ShoppingCart.FileUploaded"),
                downloadUrl = Url.Action("GetFileUpload", "Download", new { downloadId = download.DownloadGuid }),
                downloadGuid = download.DownloadGuid,
                imagePath = imagePath.Item2, //added property for the override
            }));
        }