Exemple #1
0
        //http://stackoverflow.com/questions/11774741/load-partial-view-depending-on-dropdown-selection-in-mvc3
        public async Task <ActionResult> ListingPartial(int categoryID)
        {
            // Custom fields
            var customFieldCategoryQuery = await _customFieldCategoryService.Query(x => x.CategoryID == categoryID).Include(x => x.MetaField.ListingMetas).SelectAsync();

            var customFieldCategories = customFieldCategoryQuery.ToList();
            var customFieldModel      = new CustomFieldListingModel()
            {
                MetaCategories = customFieldCategories
            };

            return(PartialView("_CategoryCustomFields", customFieldModel));
        }
        public async Task <ActionResult> ListingUpdate(int?id)
        {
            if (CacheHelper.Categories.Count == 0)
            {
                TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                TempData[TempDataKeys.UserMessage]           = "[[[There are not categories available yet.]]]";
            }

            Listing item;

            var model = new ListingUpdateModel()
            {
                Categories = CacheHelper.Categories
            };

            if (id.HasValue)
            {
                item = await _listingService.FindAsync(id);

                if (item == null)
                {
                    return(new HttpNotFoundResult());
                }

                // Pictures
                var pictures = await _listingPictureservice.Query(x => x.ListingID == id).SelectAsync();

                var picturesModel = pictures.Select(x =>
                                                    new PictureModel()
                {
                    ID        = x.PictureID,
                    Url       = ImageHelper.GetListingImagePath(x.PictureID),
                    ListingID = x.ListingID,
                    Ordering  = x.Ordering
                }).OrderBy(x => x.Ordering).ToList();

                model.Pictures = picturesModel;
            }
            else
            {
                item = new Listing()
                {
                    CategoryID  = CacheHelper.Categories.Any() ? CacheHelper.Categories.FirstOrDefault().ID : 0,
                    Created     = DateTime.Now.Date,
                    LastUpdated = DateTime.Now.Date,
                    Expiration  = DateTime.Now.AddDays(30),
                    Enabled     = true,
                    Active      = true,
                }
            };

            // Item
            model.ListingItem = item;

            // Custom fields
            var customFieldCategoryQuery = await _customFieldCategoryService.Query(x => x.CategoryID == item.CategoryID).Include(x => x.MetaField.ListingMetas).SelectAsync();

            var customFieldCategories = customFieldCategoryQuery.ToList();
            var customFieldModel      = new CustomFieldListingModel()
            {
                ListingID      = item.ID,
                MetaCategories = customFieldCategories
            };

            model.CustomFields  = customFieldModel;
            model.Users         = UserManager.Users.ToList();
            model.UserID        = item.UserID;
            model.CategoryID    = item.CategoryID;
            model.ListingTypeID = item.ListingTypeID;

            // Listing types
            model.ListingTypes = CacheHelper.ListingTypes.Where(x => x.CategoryListingTypes.Any(y => y.CategoryID == model.CategoryID)).ToList();

            return(View(model));
        }
        private async Task GetSearchResult(SearchListingModel model)
        {
            IEnumerable <Listing>       items      = null;
            List <MetaFieldSearchModel> metaFields = model.CustomFields;

            // Category
            if (model.CategoryID != 0)
            {
                items = await _listingService.Query(x => x.CategoryID == model.CategoryID)
                        .Include(x => x.ListingPictures)
                        .Include(x => x.Category)
                        .Include(x => x.ListingType)
                        .Include(x => x.AspNetUser)
                        .Include(x => x.ListingReviews)
                        .Include(x => x.ListingMetas)
                        .SelectAsync();

                // Set listing types
                model.ListingTypes = CacheHelper.ListingTypes.Where(x => x.CategoryListingTypes.Any(y => y.CategoryID == model.CategoryID)).ToList();

                //Custom fields which are searchable for selected category
                var customFieldCategoryQuery = await _customFieldCategoryService.Query(x => x.CategoryID == model.CategoryID && x.MetaField.Searchable).Include(x => x.MetaField.ListingMetas).SelectAsync();

                var customFieldCategories = customFieldCategoryQuery.ToList();
                model.CustomFields = customFieldCategoryQuery.Select(x => new MetaFieldSearchModel
                {
                    ID            = x.MetaField.ID,
                    Name          = x.MetaField.Name,
                    Placeholder   = x.MetaField.Placeholder,
                    ControlTypeID = x.MetaField.ControlTypeID,
                    Options       = x.MetaField.Options,
                    Ordering      = x.MetaField.Ordering
                }).OrderBy(ob => ob.Ordering).ToList();
            }
            else
            {
                model.ListingTypes = CacheHelper.ListingTypes;

                // All Custom fields which are searchable
                var metaFieldQuery = await _metaFieldService.Query(x => x.Searchable).SelectAsync();

                model.CustomFields = metaFieldQuery.Select(x => new MetaFieldSearchModel
                {
                    ID            = x.ID,
                    Name          = x.Name,
                    Placeholder   = x.Placeholder,
                    ControlTypeID = x.ControlTypeID,
                    Options       = x.Options,
                    Ordering      = x.Ordering
                }).OrderBy(ob => ob.Ordering).ToList();
            }

            // Set default Listing Type if it's not set or listing type is not set
            if (model.ListingTypes.Count > 0 &&
                (model.ListingTypeID == null || !model.ListingTypes.Any(x => model.ListingTypeID.Contains(x.ID))))
            {
                model.ListingTypeID = new List <int>();
                model.ListingTypeID.Add(model.ListingTypes.FirstOrDefault().ID);
            }

            // Search Text
            if (!string.IsNullOrEmpty(model.SearchText))
            {
                model.SearchText = model.SearchText.ToLower();

                // Search by title, description, location
                if (items != null)
                {
                    items = items.Where(x =>
                                        x.Title.ToLower().Contains(model.SearchText) ||
                                        x.Description.ToLower().Contains(model.SearchText) ||
                                        x.Location.ToLower().Contains(model.SearchText));
                }
                else
                {
                    items = await _listingService.Query(
                        x => x.Title.ToLower().Contains(model.SearchText) ||
                        x.Description.ToLower().Contains(model.SearchText) ||
                        x.Location.ToLower().Contains(model.SearchText))
                            .Include(x => x.ListingPictures)
                            .Include(x => x.Category)
                            .Include(x => x.AspNetUser)
                            .Include(x => x.ListingReviews)
                            .SelectAsync();
                }
            }

            // Latest
            if (items == null)
            {
                items = await _listingService.Query().OrderBy(x => x.OrderByDescending(y => y.Created))
                        .Include(x => x.ListingPictures)
                        .Include(x => x.Category)
                        .Include(x => x.AspNetUser)
                        .Include(x => x.ListingReviews)
                        .Include(x => x.ListingMetas)
                        .SelectAsync();
            }

            // Filter items by Listing Type
            items = items.Where(x => model.ListingTypeID.Contains(x.ListingTypeID)).ToList();

            // Location
            if (!string.IsNullOrEmpty(model.Location))
            {
                items = items.Where(x => !string.IsNullOrEmpty(x.Location) && x.Location.IndexOf(model.Location, StringComparison.OrdinalIgnoreCase) != -1);
            }

            // Custom fields
            if (metaFields != null)
            {
                metaFields.RemoveAll(x => x.Options == null); // ignore any blank default values
                if (metaFields.Count > 0)
                {
                    var metaFieldSelected = metaFields.Select(x => new { x.ID, x.Options }).ToList();
                    //var metaFieldTest = items.Select(i => i.ListingMetas).ToList(); //debug test....
                    foreach (var metaField in metaFields)
                    {
                        items = items.Where(x => x.ListingMetas.Any(y => metaField.ID == y.FieldID && metaField.Options.Contains(y.Value))).ToList();
                        model.CustomFields.FirstOrDefault(x => x.ID == metaField.ID).Selected = metaField.Options;
                    }
                }
            }

            // Picture
            if (model.PhotoOnly)
            {
                items = items.Where(x => x.ListingPictures.Count > 0);
            }

            /// Price
            if (model.PriceFrom.HasValue)
            {
                items = items.Where(x => x.Price >= model.PriceFrom.Value);
            }

            if (model.PriceTo.HasValue)
            {
                items = items.Where(x => x.Price <= model.PriceTo.Value);
            }

            // Show active and enabled only
            var itemsModelList = new List <ListingItemModel>();

            foreach (var item in items.Where(x => x.Active && x.Enabled).OrderByDescending(x => x.Created))
            {
                itemsModelList.Add(new ListingItemModel()
                {
                    ListingCurrent = item,
                    UrlPicture     = item.ListingPictures.Count == 0 ? ImageHelper.GetListingImagePath(0) : ImageHelper.GetListingImagePath(item.ListingPictures.OrderBy(x => x.Ordering).FirstOrDefault().PictureID)
                });
            }
            var breadCrumb = GetParents(model.CategoryID).Reverse().ToList();

            model.BreadCrumb = breadCrumb;
            model.Categories = CacheHelper.Categories;

            model.Listings         = itemsModelList;
            model.ListingsPageList = itemsModelList.ToPagedList(model.PageNumber, model.PageSize);
            model.Grid             = new ListingModelGrid(model.ListingsPageList.AsQueryable());
        }