/// <summary>
        /// Prepare list of used images
        /// Many be associated with products, as thumbnail, icon, or std. images
        /// or as additional images
        /// or to option swathces
        /// </summary>
        private void InitAssociatedImageUrls()
        {
            associatedImages = new List <string>();

            // ADD PRODUCT IMAGES
            ICriteria criteria = NHibernateHelper.CreateCriteria <Product>();

            criteria.Add(Restrictions.Eq("Store", AbleContext.Current.Store));
            criteria.Add(Restrictions.Disjunction()
                         .Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"))
                         .Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%"))
                         .Add(Restrictions.Like("IconUrl", "~/Assets/ProductImages/%")));

            IList <Product> products = ProductDataSource.LoadForCriteria(criteria);

            foreach (Product product in products)
            {
                if (product.ImageUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(product.ImageUrl);
                }
                if (product.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(product.ThumbnailUrl);
                }
                if (product.IconUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(product.IconUrl);
                }
            }

            // ADDITIONAL IMAGES
            ICriteria imageCriteria = NHibernateHelper.CreateCriteria <ProductImage>();

            imageCriteria.Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"));
            IList <ProductImage> images = ProductImageDataSource.LoadForCriteria(imageCriteria);

            foreach (ProductImage image in images)
            {
                associatedImages.Add(image.ImageUrl);
            }

            // OPTION SWATCHES
            ICriteria choicesCriteria = NHibernateHelper.CreateCriteria <OptionChoice>();

            choicesCriteria.Add(Restrictions.Disjunction()
                                .Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"))
                                .Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%")));

            IList <OptionChoice> choices = OptionChoiceDataSource.LoadForCriteria(choicesCriteria);

            foreach (OptionChoice choice in choices)
            {
                if (choice.ImageUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(choice.ImageUrl);
                }
                if (choice.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(choice.ThumbnailUrl);
                }
            }

            // ADD CATEGORY IMAGES
            ICriteria categoryCriteria = NHibernateHelper.CreateCriteria <Category>();

            categoryCriteria.Add(Restrictions.Eq("Store", AbleContext.Current.Store));
            categoryCriteria.Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%"));
            IList <Category> categories = CategoryDataSource.LoadForCriteria(categoryCriteria);

            foreach (Category category in categories)
            {
                if (category.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(category.ThumbnailUrl);
                }
            }

            // ADD LINK IMAGES
            ICriteria linksCriteria = NHibernateHelper.CreateCriteria <Link>();

            linksCriteria.Add(Restrictions.Eq("Store", AbleContext.Current.Store));
            linksCriteria.Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%"));
            IList <Link> links = LinkDataSource.LoadForCriteria(linksCriteria);

            foreach (Link link in links)
            {
                if (link.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(link.ThumbnailUrl);
                }
            }

            // ADD GIFT WRAPING IMAGES
            ICriteria wrapstylesCriteria = NHibernateHelper.CreateCriteria <WrapStyle>();

            wrapstylesCriteria.Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"));

            IList <WrapStyle> wrapStyles = WrapStyleDataSource.LoadForCriteria(wrapstylesCriteria);

            foreach (WrapStyle ws in wrapStyles)
            {
                if (ws.ImageUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(ws.ImageUrl);
                }
                if (ws.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                {
                    associatedImages.Add(ws.ThumbnailUrl);
                }
            }

            // ADD VARIANT IMAGES
            ICriteria variantsCriteria = NHibernateHelper.CreateCriteria <ProductVariant>();

            criteria.Add(Restrictions.Disjunction()
                         .Add(Restrictions.Like("ImageUrl", "~/Assets/ProductImages/%"))
                         .Add(Restrictions.Like("ThumbnailUrl", "~/Assets/ProductImages/%"))
                         .Add(Restrictions.Like("IconUrl", "~/Assets/ProductImages/%")));

            int variantsCount      = ProductVariantDataSource.CountForCriteria(variantsCriteria.Clone() as ICriteria);
            int maxVariantsToCache = 500;

            // avoid loading all variants at same time
            for (int index = 0; index < variantsCount; index += maxVariantsToCache)
            {
                variantsCriteria.SetMaxResults(maxVariantsToCache);
                variantsCriteria.SetFirstResult(index);
                IList <ProductVariant> productVariants = ProductVariantDataSource.LoadForCriteria(variantsCriteria);
                foreach (ProductVariant productVariant in productVariants)
                {
                    if (productVariant.ImageUrl.StartsWith("~/Assets/ProductImages/"))
                    {
                        associatedImages.Add(productVariant.ImageUrl);
                    }
                    if (productVariant.ThumbnailUrl.StartsWith("~/Assets/ProductImages/"))
                    {
                        associatedImages.Add(productVariant.ThumbnailUrl);
                    }
                    if (productVariant.IconUrl.StartsWith("~/Assets/ProductImages/"))
                    {
                        associatedImages.Add(productVariant.IconUrl);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates the google feed
        /// </summary>
        /// <param name="feedFile">The feed file to generate</param>
        /// <param name="includeAllProducts">If true, product feed exclusion settings are ignored.</param>
        /// <param name="defaultBrand">Default brand to use if one is not set for a prodcut</param>
        /// <param name="defaultCategory">Default category to use if one is not set for a prodcut</param>
        /// <returns>True if the generation succeeds, false otherwise.</returns>
        private static bool CreateFeed(string feedFile, bool includeAllProducts, string defaultBrand, string defaultCategory)
        {
            // ensure the feed directory exists
            FileInfo fi = new FileInfo(feedFile);

            if (!fi.Directory.Exists)
            {
                try
                {
                    fi.Directory.Create();
                }
                catch (Exception ex)
                {
                    Logger.Error("Error generating Google feed: ~\\Feeds directory does not exist and could not be created.", ex);
                    return(false);
                }
            }

            // write the header row to the feed file
            try
            {
                using (StreamWriter feedWriter = File.CreateText(feedFile))
                {
                    feedWriter.Write(GetHeaderRow());
                    feedWriter.Close();
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Error generating Google feed.", ex);
                return(false);
            }

            try
            {
                ISession session = AbleContext.Current.Database.GetSession();
                using (StreamWriter feedWriter = File.AppendText(feedFile))
                {
                    IList <Product> products;
                    ICriteria       countCriteria = NHibernateHelper.CreateCriteria <Product>()
                                                    .Add(Restrictions.Not(Restrictions.Eq("VisibilityId", (byte)CatalogVisibility.Private)));
                    if (!includeAllProducts)
                    {
                        countCriteria.Add(Restrictions.Eq("ExcludeFromFeed", false));
                    }
                    int count = countCriteria.SetProjection(Projections.RowCount())
                                .UniqueResult <int>();

                    int startIndex = 0;
                    while (startIndex < count)
                    {
                        // DETERMINE HOW MANY ROWS LEFT TO INCLUDE IN FEED
                        int rowsRemaining = count - startIndex;

                        // ONLY PROCESS 1000 ROWS AT A TIME
                        int maxRows = (rowsRemaining > 1000) ? 1000 : rowsRemaining;

                        // GET THE ROWS TO BE OUTPUT
                        ICriteria productCriteria = NHibernateHelper.CreateCriteria <Product>(maxRows, startIndex, string.Empty)
                                                    .Add(Restrictions.Not(Restrictions.Eq("VisibilityId", (byte)CatalogVisibility.Private)));
                        if (!includeAllProducts)
                        {
                            productCriteria.Add(Restrictions.Eq("ExcludeFromFeed", false));
                        }
                        products = productCriteria.List <Product>();

                        // GENERATE THE FEED DATA
                        string feedData = GetFeedData(products, defaultBrand, defaultCategory);

                        // WRITE DATA TO THE FEED FILE
                        feedWriter.Write(feedData);
                        feedWriter.Flush();

                        // REMOVE PRODUCTS FROM SESSION TO CONSERVE MEMORY
                        foreach (var product in products)
                        {
                            session.Evict(product);
                        }

                        // LOOP TO THE NEXT BLOCK OF DATA
                        startIndex += 1000;
                    }

                    // CLOSE THE FEED FILE
                    feedWriter.Close();
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Error generating Google feed.", ex);
                return(false);
            }

            return(true);
        }