码迷,mamicode.com
首页 > 其他好文 > 详细

一步一步教你如何制件 ZKEACMS 的扩展组件/插件

时间:2016-06-30 16:18:28      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:

前言

如果你还不知道ZKEACMS,不妨先了解一下。

技术分享

ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来

官方地址:http://www.zkea.net/zkeacms

下载地址:https://github.com/SeriaWei/ASP.NET-MVC-CMS/releases

GitHub:https://github.com/SeriaWei/ASP.NET-MVC-CMS

开源中国社区:http://git.oschina.net/seriawei/ASP.NET-MVC-CMS

演示地址:http://demo.zkea.net/  

后台:http://demo.zkea.net/admin 

用户名,密码:admin 

做一个路径导航的组件:

技术分享

 

添加一个组件项目

打开Modules目录(\Easy.CMS.Web\Modules),找到Standard文件夹,这个是一个标准的组件项目,复制一份,并把名称改为Breadcrumb 

技术分享

技术分享

进入Breadcrumb文件夹,并把项目名称改为Easy.CMS.Breadcrumb.csproj

技术分享

使用Visual Studio打开解决方案(ZKEASOFT.CMS.Web),在Modues目录下添加一个已有项目:

技术分享

找到Easy.CMS.Breadcrumb.csproj并添加:

技术分享

修改名空间组件名等相关信息

打开Easy.CMS.Breadcrumb的属性,修改程序集名称和名空间为:Easy.CMS.Breadcrumb

技术分享

把StandardPlug类名改为BreadcrumbPlug,并删除注册路由代码,因为现在要加的这个导航组件不需要

技术分享

技术分享

方法说明:

RegistRoute() 这个方法用来注册组件的路由

AdminMenu() 这个方法用来添加后端左测的菜单

InitScript() 这个方法用来整合注册脚本,方便在View中使用

InitStyle() 这个方法用来整合注册样式,方便在View中使用

接下来打开CopyItems.xml文件,并修改内容:

技术分享

这个文件的作用是把DLL复制到web的bin目录,方便调试,或者也可以直接改生成目录到web的bin目录。

接下来就要开始Coding了

在Models目录下,添加一个BreadcrumbWidget的类,并添加如下代码:

namespace Easy.CMS.Breadcrumb.Models
{
    [DataConfigure(typeof(BreadcrumbWidgetMetaData))]
    public class BreadcrumbWidget : WidgetBase
    {
        public bool IsLinkAble { get; set; }
    }

    class BreadcrumbWidgetMetaData : WidgetMetaData<BreadcrumbWidget>
    {
        protected override void ViewConfigure()
        {
            base.ViewConfigure();
            ViewConfig(m => m.IsLinkAble).AsHidden();
        }
    }
}

BreadcrumbWidget继承自WidgetBase,并拥有一个自己的属性IsLinkAble,由于现在IsLinkAble暂时没用,所以把它隐藏了。

BreadcrumbWidget这个Entity,默认会对应一个名称为BreadcrumbWidget的表,该表必须要有的字段是:ID和IsLinkAble。

在Service目录下面,添加一个BreadcrumbWidgetService的类,并添加以下代码:

namespace Easy.CMS.Breadcrumb.Service
{
    public class BreadcrumbWidgetService : WidgetService<BreadcrumbWidget>
    {
        private IPageService _pageService;

        public IPageService PageService
        {
            get { return _pageService ?? (_pageService = ServiceLocator.Current.GetInstance<IPageService>()); }
        }

        private List<PageEntity> _parentPages;

        public List<PageEntity> ParentPages
        {
            get { return _parentPages ?? (_parentPages = new List<PageEntity>()); }
        }
        public override WidgetPart Display(WidgetBase widget, HttpContextBase httpContext)
        {
            GetParentPage(httpContext.GetLayout().Page);
            return widget.ToWidgetPart(ParentPages);
        }

        void GetParentPage(PageEntity page)
        {
            ParentPages.Insert(0, page);
            if (page.ParentId.IsNotNullAndWhiteSpace() && page.ParentId != "#")
            {
                var parentPage = PageService.Get(m => m.ID == page.ParentId).FirstOrDefault();
                if (parentPage != null)
                {
                    GetParentPage(parentPage);    
                }
            }
        }
    }
}

代码比较简单,目的就是为了取出当前页面的所有父页面,然后将这些页面显示出来,所以,为了,显示,我们需要添加一个View。

在Views目录下,添加一个名为Widget.Breadcrumb的视图:

@model List<Easy.Web.CMS.Page.PageEntity>
<ol class="breadcrumb">
    @for (int i = 0; i < Model.Count; i++)
    {
        if (i == Model.Count - 1)
        {
            <li class="active">@Model[i].PageName</li>
        }
        else
        {
            <li><a href="@Url.Content(Model[i].Url)">@Model[i].PageName</a></li>
        }
    }
</ol>

与系统整合

添加一个Content目录并往里面添加一张256x256的图片作为该组件的缩略图,该缩略图将会在选择组件时看到。

技术分享

创建BreadcrumbWidget表

CREATE TABLE BreadcrumbWidget
    (
      ID NVARCHAR(100) PRIMARY KEY
                       NOT NULL ,
      IsLinkAble BIT NULL
    );

往CMS_WidgetTemplate表里面添加一条记录,告诉系统有一个新的组件:

INSERT INTO dbo.CMS_WidgetTemplate
        ( Title ,
          GroupName ,
          PartialView ,
          AssemblyName ,
          ServiceTypeName ,
          ViewModelTypeName ,
          Thumbnail ,
          [Order] ,
          Status
        )
VALUES  ( N路径导航 ,
          N1.通用 , 
          NWidget.Breadcrumb ,
          NEasy.CMS.Breadcrumb , 
          NEasy.CMS.Breadcrumb.Service.BreadcrumbWidgetService , 
          NEasy.CMS.Breadcrumb.Models.BreadcrumbWidget , 
          N~/Modules/Breadcrumb/Content/breadcrumb.png , 
          6 , 
          1
        )

运行程序试一下吧:

技术分享

技术分享

技术分享

组件字段显示英文怎么办?直接到Language表里面去Update吧,怎么找到它们呢?

SELECT * FROM dbo.Language WHERE Module=NBreadcrumbWidget

或者在运行程序之前,用以下脚本初始化多语言文本

INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@ActionType, 2052, NActionType, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@AssemblyName, 2052, NAssemblyName, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@CreateBy, 2052, NCreateBy, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@CreatebyName, 2052, N创建人, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@CreateDate, 2052, N创建日期, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@CustomClass, 2052, NCustomClass, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@CustomStyle, 2052, NCustomStyle, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@Description, 2052, N描述, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@FormView, 2052, NFormView, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@ID, 2052, NID, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@IsLinkAble, 2052, NIsLinkAble, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@IsSystem, 2052, NIsSystem, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@IsTemplate, 2052, N保存为模板, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@LastUpdateBy, 2052, NLastUpdateBy, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@LastUpdateByName, 2052, N更新人, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@LastUpdateDate, 2052, N更新日期, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@LayoutID, 2052, N布局, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@PageID, 2052, N页面, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@PartialView, 2052, N模版, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@Position, 2052, N排序, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@ServiceTypeName, 2052, NServiceTypeName, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@Status, 2052, N状态, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@StyleClass, 2052, N自定义样式, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@Thumbnail, 2052, N模板缩略图, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@Title, 2052, N标题, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@ViewModelTypeName, 2052, NViewModelTypeName, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@WidgetName, 2052, N组件名称, NBreadcrumbWidget, NEntityProperty)
INSERT [dbo].[Language] ([LanKey], [LanID], [LanValue], [Module], [LanType]) VALUES (NBreadcrumbWidget@ZoneID, 2052, N区域, NBreadcrumbWidget, NEntityProperty)

 

还有什么不明白的吗?加入我们进一步为你解答

技术分享

 

一步一步教你如何制件 ZKEACMS 的扩展组件/插件

标签:

原文地址:http://www.cnblogs.com/seriawei/p/5630159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!