/// <summary> /// Sends a product review notification message to a store owner /// </summary> /// <param name="productReview">Product review</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendProductReviewNotificationMessage(ProductReview productReview, int languageId) { if (productReview == null) throw new ArgumentNullException("productReview"); var store = _storeContext.CurrentStore; languageId = EnsureLanguageIsActive(languageId, store.Id); var messageTemplate = GetLocalizedActiveMessageTemplate("Product.ProductReview", languageId, store.Id); if (messageTemplate == null) return 0; //tokens var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens, store); _messageTokenProvider.AddProductReviewTokens(tokens, productReview); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); var toEmail = emailAccount.Email; var toName = emailAccount.DisplayName; return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
public virtual void AddProductReviewTokens(IList<Token> tokens, ProductReview productReview) { tokens.Add(new Token("ProductReview.ProductName", productReview.Product.Name)); //event notification _eventPublisher.EntityTokensAdded(productReview, tokens); }
protected void PrepareProductReviewModel(ProductReviewModel model, ProductReview productReview, bool excludeProperties, bool formatReviewText) { if (model == null) throw new ArgumentNullException("model"); if (productReview == null) throw new ArgumentNullException("productReview"); model.Id = productReview.Id; model.ProductId = productReview.ProductId; model.ProductName = productReview.Product.Name; model.CustomerId = productReview.CustomerId; var customer = productReview.Customer; model.CustomerInfo = customer.IsRegistered() ? customer.Email : _localizationService.GetResource("Admin.Customers.Guest"); model.Rating = productReview.Rating; model.CreatedOn = _dateTimeHelper.ConvertToUserTime(productReview.CreatedOnUtc, DateTimeKind.Utc); if (!excludeProperties) { model.Title = productReview.Title; if (formatReviewText) model.ReviewText = Core.Html.HtmlHelper.FormatText(productReview.ReviewText, false, true, false, false, false, false); else model.ReviewText = productReview.ReviewText; model.IsApproved = productReview.IsApproved; } }
/// <summary> /// Deletes a product review /// </summary> /// <param name="productReview">Product review</param> public virtual void DeleteProductReview(ProductReview productReview) { if (productReview == null) throw new ArgumentNullException("productReview"); _productReviewRepository.Delete(productReview); _cacheManager.RemoveByPattern(PRODUCTS_PATTERN_KEY); }
public ActionResult ProductReviewsAdd(int productId, ProductReviewsModel model, bool captchaValid) { var product = _productService.GetProductById(productId); if (product == null || product.Deleted || !product.Published || !product.AllowCustomerReviews) return RedirectToRoute("HomePage"); //validate CAPTCHA if (_captchaSettings.Enabled && _captchaSettings.ShowOnProductReviewPage && !captchaValid) { ModelState.AddModelError("", _localizationService.GetResource("Common.WrongCaptcha")); } if (_workContext.CurrentCustomer.IsGuest() && !_catalogSettings.AllowAnonymousUsersToReviewProduct) { ModelState.AddModelError("", _localizationService.GetResource("Reviews.OnlyRegisteredUsersCanWriteReviews")); } if (ModelState.IsValid) { //save review int rating = model.AddProductReview.Rating; if (rating < 1 || rating > 5) rating = _catalogSettings.DefaultProductRatingValue; bool isApproved = !_catalogSettings.ProductReviewsMustBeApproved; var productReview = new ProductReview() { ProductId = product.Id, CustomerId = _workContext.CurrentCustomer.Id, Title = model.AddProductReview.Title, ReviewText = model.AddProductReview.ReviewText, Rating = rating, HelpfulYesTotal = 0, HelpfulNoTotal = 0, IsApproved = isApproved, CreatedOnUtc = DateTime.UtcNow, }; product.ProductReviews.Add(productReview); _productService.UpdateProduct(product); //update product totals _productService.UpdateProductReviewTotals(product); //notify store owner if (_catalogSettings.NotifyStoreOwnerAboutNewProductReviews) _workflowMessageService.SendProductReviewNotificationMessage(productReview, _localizationSettings.DefaultAdminLanguageId); //activity log _customerActivityService.InsertActivity("PublicStore.AddProductReview", _localizationService.GetResource("ActivityLog.PublicStore.AddProductReview"), product.Name); PrepareProductReviewsModel(model, product); model.AddProductReview.Title = null; model.AddProductReview.ReviewText = null; model.AddProductReview.SuccessfullyAdded = true; if (!isApproved) model.AddProductReview.Result = _localizationService.GetResource("Reviews.SeeAfterApproving"); else model.AddProductReview.Result = _localizationService.GetResource("Reviews.SuccessfullyAdded"); return View(model); } //If we got this far, something failed, redisplay form PrepareProductReviewsModel(model, product); return View(model); }