protected virtual TreeNode <MenuItem> AppendToParent(MenuItemProviderRequest request, TreeNode <MenuItem> node) { var root = request.Parent.Root; var providers = root.GetMetadata <List <string> >("Providers"); var provider = request.Entity.ProviderName; node.SetMetadata("Provider", provider); if (providers == null) { root.SetMetadata("Providers", new List <string> { provider }); } else if (!providers.Contains(provider)) { providers.Add(provider); } if (node.Id == null && node.Value.Id.HasValue()) { node.Id = node.Value.Id; } return(request.Parent.Append(node)); }
private TreeNode <MenuItem> ConvertNode( MenuItemProviderRequest request, TreeNode <ICategoryNode> categoryNode, IDictionary <int, PictureInfo> allPictureInfos) { var node = categoryNode.Value; var name = node.Id > 0 ? node.GetLocalized(x => x.Name) : null; var menuItem = new MenuItem { EntityId = node.Id, EntityName = nameof(Category), Text = name?.Value ?? node.Name, Rtl = name?.CurrentLanguage?.Rtl ?? false, BadgeText = node.Id > 0 ? node.GetLocalized(x => x.BadgeText) : null, BadgeStyle = (BadgeStyle)node.BadgeStyle, RouteName = node.Id > 0 ? "Category" : "HomePage" }; if (node.Id > 0) { menuItem.RouteValues.Add("SeName", node.GetSeName()); if (node.ParentCategoryId == 0 && node.Published && node.PictureId != null) { menuItem.ImageId = node.PictureId; } } // Apply inheritable properties. menuItem.Visible = request.Entity.Published; menuItem.PermissionNames = request.Entity.PermissionNames; if (request.Entity.NoFollow) { menuItem.LinkHtmlAttributes.Add("rel", "nofollow"); } if (request.Entity.NewWindow) { menuItem.LinkHtmlAttributes.Add("target", "_blank"); } var convertedNode = new TreeNode <MenuItem>(menuItem) { Id = categoryNode.Id }; if (categoryNode.HasChildren) { foreach (var childNode in categoryNode.Children) { convertedNode.Append(ConvertNode(request, childNode, allPictureInfos)); } } return(convertedNode); }
/// <summary> /// Converts the passed menu item entity to a <see cref="MenuItem"/> object. /// </summary> /// <param name="entity">The entity to convert.</param> /// <returns>Menu item.</returns> protected virtual MenuItem ConvertToMenuItem(MenuItemProviderRequest request) { var entity = request.Entity; var title = entity.GetLocalized(x => x.Title); string shortDescription = entity.GetLocalized(x => x.ShortDescription); var menuItem = new MenuItem { EntityId = entity.Id, EntityName = nameof(MenuItemRecord), MenuItemId = entity.Id, Text = title, Summary = shortDescription, Visible = entity.Published, Rtl = title?.CurrentLanguage?.Rtl ?? false, PermissionNames = entity.PermissionNames }; if (shortDescription.HasValue()) { menuItem.LinkHtmlAttributes.Add("title", shortDescription); } if (entity.NoFollow) { menuItem.LinkHtmlAttributes.Add("rel", "nofollow"); } if (entity.NewWindow) { menuItem.LinkHtmlAttributes.Add("target", "_blank"); } if (entity.CssClass.HasValue()) { menuItem.LinkHtmlAttributes.Add("class", entity.CssClass); } if (entity.HtmlId.HasValue()) { menuItem.LinkHtmlAttributes.Add("id", entity.HtmlId); menuItem.Id = entity.HtmlId; } if (entity.Icon.HasValue() && !request.IsEditMode) { menuItem.Icon = IconExplorer.GetIconByName(entity.Icon).GetCssClass(entity.Style); } // For future use: entity.ShowExpanded return(menuItem); }
protected override void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node) { // Always resolve against current store, current customer and working language. var result = _linkResolver.Resolve(request.Entity.Model); var item = node.Value; item.Url = result.Link; item.ImageId = result.PictureId; if (item.Text.IsEmpty()) { item.Text = result.Label; } switch (result.Type) { case LinkType.Product: case LinkType.Category: case LinkType.Manufacturer: case LinkType.Topic: if (request.IsEditMode) { // Info: node.Value.EntityId is MenuItemRecord.Id for editing MenuItemRecord. } else { item.EntityId = result.Id; item.EntityName = result.Type.ToString(); } break; } if (request.IsEditMode) { var info = result.Type.GetLinkTypeInfo(); item.Summary = T(info.ResKey); item.Icon = info.Icon; if (item.Url.IsEmpty()) { item.Text = null; item.ResKey = "Admin.ContentManagement.Menus.SpecifyLinkTarget"; } } else { // For edit mode, only apply MenuItemRecord.Published. item.Visible = result.Status == LinkStatus.Ok; } }
protected override void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node) { try { node.ApplyRouteData(request.Entity.Model); } catch { } if (request.IsEditMode) { node.Value.Summary = T("Providers.MenuItems.FriendlyName.Route"); node.Value.Icon = "fas fa-directions"; if (!node.Value.HasRoute()) { node.Value.Text = null; node.Value.ResKey = "Admin.ContentManagement.Menus.SpecifyLinkTarget"; } } }
public override TreeNode <MenuItem> Append(MenuItemProviderRequest request) { if (request.IsEditMode) { var item = ConvertToMenuItem(request); item.Summary = T("Providers.MenuItems.FriendlyName.Catalog"); item.Icon = "fa fa-cubes"; AppendToParent(request, item); } else { var tree = _categoryService.GetCategoryTree(0, false, _services.StoreContext.CurrentStore.Id); var allPictureIds = tree.Flatten().Select(x => x.PictureId.GetValueOrDefault()); var allPictureInfos = _pictureService.GetPictureInfos(allPictureIds); var randomId = CommonHelper.GenerateRandomInteger(0, 1000000); if (request.Entity.BeginGroup) { AppendToParent(request, new MenuItem { IsGroupHeader = true, Text = request.Entity.GetLocalized(x => x.ShortDescription) }); } // Do not append the root itself. foreach (var child in tree.Children) { AppendToParent(request, ConvertNode(request, child, allPictureInfos, ref randomId)); } } // Do not traverse appended items. return(null); // TBD: Cache invalidation workflow changes, because the catalog tree // is now contained within other menus. Invalidating the tree now means: // invalidate all containing menus also. }
public virtual TreeNode <MenuItem> Append(MenuItemProviderRequest request) { Guard.NotNull(request, nameof(request)); Guard.NotNull(request.Parent, nameof(request.Parent)); Guard.NotNull(request.Entity, nameof(request.Entity)); // Add group header item. if (request.Entity.BeginGroup && !request.IsEditMode) { AppendToParent(request, new MenuItem { IsGroupHeader = true, Text = request.Entity.GetLocalized(x => x.ShortDescription) }); } var node = AppendToParent(request, ConvertToMenuItem(request)); ApplyLink(request, node); return(node); }
protected override void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node) { try { if (request.Entity.Model.HasValue()) { var routeValues = JsonConvert.DeserializeObject <RouteValueDictionary>(request.Entity.Model); var routeName = string.Empty; if (routeValues.TryGetValue("routename", out var val)) { routeName = val as string; routeValues.Remove("routename"); } if (routeName.HasValue()) { node.Value.Route(routeName, routeValues); } else { node.Value.Action(routeValues); } } } catch { } if (request.IsEditMode) { node.Value.Summary = T("Providers.MenuItems.FriendlyName.Route"); node.Value.Icon = "fas fa-directions"; if (!node.Value.HasRoute()) { node.Value.Text = null; node.Value.ResKey = "Admin.ContentManagement.Menus.SpecifyLinkTarget"; } } }
private TreeNode <MenuItem> ConvertNode( MenuItemProviderRequest request, TreeNode <ICategoryNode> categoryNode, IDictionary <int, PictureInfo> allPictureInfos, ref int randomId) { var node = categoryNode.Value; var name = node.Id > 0 ? node.GetLocalized(x => x.Name) : null; var menuItem = new MenuItem { Id = randomId++.ToString(), EntityId = node.Id, EntityName = nameof(Category), Text = name?.Value ?? node.Name, Rtl = name?.CurrentLanguage?.Rtl ?? false, BadgeText = node.Id > 0 ? node.GetLocalized(x => x.BadgeText) : null, BadgeStyle = (BadgeStyle)node.BadgeStyle, RouteName = node.Id > 0 ? "Category" : "HomePage", }; // Handle external link if (node.ExternalLink.HasValue()) { var link = _linkResolver.Resolve(node.ExternalLink); if (link.Status == LinkStatus.Ok) { menuItem.Url = link.Link; } } if (menuItem.Url.IsEmpty()) { if (node.Id > 0) { menuItem.RouteName = "Category"; menuItem.RouteValues.Add("SeName", node.GetSeName()); } else { menuItem.RouteName = "HomePage"; } } // Picture if (node.Id > 0 && node.ParentCategoryId == 0 && node.Published && node.PictureId != null) { menuItem.ImageId = node.PictureId; } // Apply inheritable properties. menuItem.Visible = request.Entity.Published; menuItem.PermissionNames = request.Entity.PermissionNames; if (request.Entity.NoFollow) { menuItem.LinkHtmlAttributes.Add("rel", "nofollow"); } if (request.Entity.NewWindow) { menuItem.LinkHtmlAttributes.Add("target", "_blank"); } var convertedNode = new TreeNode <MenuItem>(menuItem) { Id = categoryNode.Id }; if (categoryNode.HasChildren) { foreach (var childNode in categoryNode.Children) { convertedNode.Append(ConvertNode(request, childNode, allPictureInfos, ref randomId)); } } return(convertedNode); }
protected override void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node) { // Void, does nothing here. }
protected virtual TreeNode <MenuItem> AppendToParent(MenuItemProviderRequest request, MenuItem item) { return(AppendToParent(request, new TreeNode <MenuItem>(item))); }
/// <summary> /// Generates and applies the link to the converted <see cref="MenuItem"/> object. /// </summary> /// <param name="request">Contains information about the request to the provider.</param> /// <param name="node">The newly created menu item node to apply the generated link to.</param> protected abstract void ApplyLink(MenuItemProviderRequest request, TreeNode <MenuItem> node);