NopCommerce 3.80框架研究(三)替换tinymce 为KindEditor
NopCommerce 自带的编辑器tinymce 功能不是很全。所以尝试将其替换为功能更强大的 KindEditor 并替实现文件上传和在线浏览功能
首先下载 并解压到如下位置
请注意这里是部署在Nop.Web站点下,前后台分离部署的情况请另作调整
部署时记得删除Kindedtor/asp.net/文件夹
修改富文本编辑器模板:Presentation/Nop.Web/Administration/Views/Shared/EditorTemplates/RichEditor.cshtml
- @model String
- @using Nop.Web.Framework.UI;
- @{
- Html.AddCssFileParts("~/Content/kindeditor/themes/default/default.css");
- Html.AddScriptParts("~/Content/kindeditor/kindeditor-all-min.js");
- }
- <script>
- KindEditor.ready(function (K) {
- window.editor = K.create('#@ViewData.TemplateInfo.GetFullHtmlFieldId(string.Empty)', {
- width: 1050,
- height: 650,
- uploadJson: '@Url.Action("ProcessRequest", "KindEditor", new{ a= "UPLOAD" })',
- fileManagerJson: '@Url.Action("ProcessRequest", "KindEditor", new { a = "MANAGE" })',
- allowFileManager: true
- });
- });
- </script>
- @Html.TextArea(string.Empty, /* Name suffix */
- ViewData.TemplateInfo.FormattedModelValue /* Initial value */
- )
添加文件上传控制器 KindEditorController.cs
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.IO;
- using System.IO.Compression;
- using System.Text.RegularExpressions;
- using System.Web;
- using Nop.Core;
- using Nop.Services.Security;
- using Nop.Web.Framework.Security;
- using System.Globalization;
- //Copyright@Tony Han
//http://qbit.cnblogs.com/
//2016-12-3 23:33:19
//http://www.cnblogs.com/Qbit/p/NopCommerce_KindEditor.html- namespace Nop.Admin.Controllers
- {
- //Controller for Roxy fileman (http://www.roxyfileman.com/) for TinyMCE editor
- //the original file was \RoxyFileman-1.4.3-net\fileman\asp_net\main.ashx
- //some custom changes by wooncherk contribution
- //do not validate request token (XSRF)
- [AdminAntiForgery(true)]
- public class KindEditorController : BaseAdminController
- {
- #region Fields
- //custom code by nopCommerce team
- private readonly IPermissionService _permissionService;
- private readonly HttpContextBase context;
- private readonly HttpResponseBase response;
- #endregion
- #region Ctor
- //custom code by nopCommerce team
- public KindEditorController(IPermissionService permissionService, HttpContextBase context)
- {
- this._permissionService = permissionService;
- this.context = context;
- this.response = this.context.Response;
- }
- #endregion
- #region Methods
- public void ProcessRequest()
- {
- string action = "UPLOAD";
- //custom code by nopCommerce team
- if (!_permissionService.Authorize(StandardPermissionProvider.HtmlEditorManagePictures))
- showError("You don't have required permission");
- try
- {
- if (context.Request["a"] != null)
- action = (string)context.Request["a"];
- switch (action.ToUpper())
- {
- case "UPLOAD":
- Upload(context);
- break;
- case "MANAGE":
- Manage(context);
- break;
- default:
- break;
- }
- }
- catch (Exception ex)
- {
- showError(ex.ToString());
- }
- }
- private void Manage(HttpContextBase context)
- {
- String aspxUrl = context.Request.Path.Substring(, context.Request.Path.LastIndexOf("/") + );
- //根目录路径,相对路径
- String rootPath = "/Content/attached/";
- //根目录URL,可以指定绝对路径,比如 http://www.yoursite.com/attached/
- String rootUrl = "/Content/attached/";
- //图片扩展名
- String fileTypes = "gif,jpg,jpeg,png,bmp";
- String currentPath = "";
- String currentUrl = "";
- String currentDirPath = "";
- String moveupDirPath = "";
- String dirPath = context.Server.MapPath(rootPath);
- String dirName = context.Request.QueryString["dir"];
- if (!String.IsNullOrEmpty(dirName))
- {
- if (Array.IndexOf("image,flash,media,file".Split(','), dirName) == -)
- {
- context.Response.Write("Invalid Directory name.");
- context.Response.End();
- }
- dirPath += dirName + "/";
- rootUrl += dirName + "/";
- if (!Directory.Exists(dirPath))
- {
- Directory.CreateDirectory(dirPath);
- }
- }
- //根据path参数,设置各路径和URL
- String path = context.Request.QueryString["path"];
- path = String.IsNullOrEmpty(path) ? "" : path;
- if (path == "")
- {
- currentPath = dirPath;
- currentUrl = rootUrl;
- currentDirPath = "";
- moveupDirPath = "";
- }
- else
- {
- currentPath = dirPath + path;
- currentUrl = rootUrl + path;
- currentDirPath = path;
- moveupDirPath = Regex.Replace(currentDirPath, @"(.*?)[^\/]+\/$", "$1");
- }
- //排序形式,name or size or type
- String order = context.Request.QueryString["order"];
- order = String.IsNullOrEmpty(order) ? "" : order.ToLower();
- //不允许使用..移动到上一级目录
- if (Regex.IsMatch(path, @"\.\."))
- {
- context.Response.Write("Access is not allowed.");
- context.Response.End();
- }
- //最后一个字符不是/
- if (path != "" && !path.EndsWith("/"))
- {
- context.Response.Write("Parameter is not valid.");
- context.Response.End();
- }
- //目录不存在或不是目录
- if (!Directory.Exists(currentPath))
- {
- context.Response.Write("Directory does not exist.");
- context.Response.End();
- }
- //遍历目录取得文件信息
- string[] dirList = Directory.GetDirectories(currentPath);
- string[] fileList = Directory.GetFiles(currentPath);
- switch (order)
- {
- case "size":
- Array.Sort(dirList, new NameSorter());
- Array.Sort(fileList, new SizeSorter());
- break;
- case "type":
- Array.Sort(dirList, new NameSorter());
- Array.Sort(fileList, new TypeSorter());
- break;
- case "name":
- default:
- Array.Sort(dirList, new NameSorter());
- Array.Sort(fileList, new NameSorter());
- break;
- }
- Hashtable result = new Hashtable();
- result["moveup_dir_path"] = moveupDirPath;
- result["current_dir_path"] = currentDirPath;
- result["current_url"] = currentUrl;
- result["total_count"] = dirList.Length + fileList.Length;
- List<Hashtable> dirFileList = new List<Hashtable>();
- result["file_list"] = dirFileList;
- for (int i = ; i < dirList.Length; i++)
- {
- DirectoryInfo dir = new DirectoryInfo(dirList[i]);
- Hashtable hash = new Hashtable();
- hash["is_dir"] = true;
- hash["has_file"] = (dir.GetFileSystemInfos().Length > );
- hash["filesize"] = ;
- hash["is_photo"] = false;
- hash["filetype"] = "";
- hash["filename"] = dir.Name;
- hash["datetime"] = dir.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");
- dirFileList.Add(hash);
- }
- for (int i = ; i < fileList.Length; i++)
- {
- FileInfo file = new FileInfo(fileList[i]);
- Hashtable hash = new Hashtable();
- hash["is_dir"] = false;
- hash["has_file"] = false;
- hash["filesize"] = file.Length;
- hash["is_photo"] = (Array.IndexOf(fileTypes.Split(','), file.Extension.Substring().ToLower()) >= );
- hash["filetype"] = file.Extension.Substring();
- hash["filename"] = file.Name;
- hash["datetime"] = file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");
- dirFileList.Add(hash);
- }
- context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(result));
- context.Response.End();
- }
- public void Upload(HttpContextBase context)
- {
- String aspxUrl = context.Request.Path.Substring(, context.Request.Path.LastIndexOf("/") + );
- //文件保存目录路径
- String savePath = "/Content/attached/";
- //文件保存目录URL
- String saveUrl = "/Content/attached/";
- //定义允许上传的文件扩展名
- Hashtable extTable = new Hashtable();
- extTable.Add("image", "gif,jpg,jpeg,png,bmp");
- extTable.Add("flash", "swf,flv");
- extTable.Add("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
- extTable.Add("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
- //最大文件大小
- int maxSize = ;
- var imgFile = context.Request.Files["imgFile"];
- if (imgFile == null)
- {
- showError("请选择文件。");
- }
- String dirPath = context.Server.MapPath(savePath);
- if (!Directory.Exists(dirPath))
- {
- showError("上传目录不存在。");
- }
- String dirName = context.Request.QueryString["dir"];
- if (String.IsNullOrEmpty(dirName))
- {
- dirName = "image";
- }
- if (!extTable.ContainsKey(dirName))
- {
- showError("目录名不正确。");
- }
- String fileName = imgFile.FileName;
- String fileExt = Path.GetExtension(fileName).ToLower();
- if (imgFile.InputStream == null || imgFile.InputStream.Length > maxSize)
- {
- showError("上传文件大小超过限制。");
- }
- if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(((String)extTable[dirName]).Split(','), fileExt.Substring().ToLower()) == -)
- {
- showError("上传文件扩展名是不允许的扩展名。\n只允许" + ((String)extTable[dirName]) + "格式。");
- }
- //创建文件夹
- dirPath += dirName + "/";
- saveUrl += dirName + "/";
- if (!Directory.Exists(dirPath))
- {
- Directory.CreateDirectory(dirPath);
- }
- String ymd = DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo);
- dirPath += ymd + "/";
- saveUrl += ymd + "/";
- if (!Directory.Exists(dirPath))
- {
- Directory.CreateDirectory(dirPath);
- }
- String newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
- String filePath = dirPath + newFileName;
- imgFile.SaveAs(filePath);
- String fileUrl = saveUrl + newFileName;
- Hashtable hash = new Hashtable();
- hash["error"] = ;
- hash["url"] = fileUrl;
- context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(hash));
- context.Response.End();
- }
- #endregion
- #region Utitlies
- private void showError(string message)
- {
- Hashtable hash = new Hashtable();
- hash["error"] = ;
- hash["message"] = message;
- context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(hash));
- context.Response.End();
- }
- #region KindEditorClass
- public class NameSorter : IComparer
- {
- public int Compare(object x, object y)
- {
- if (x == null && y == null)
- {
- return ;
- }
- if (x == null)
- {
- return -;
- }
- if (y == null)
- {
- return ;
- }
- FileInfo xInfo = new FileInfo(x.ToString());
- FileInfo yInfo = new FileInfo(y.ToString());
- return xInfo.FullName.CompareTo(yInfo.FullName);
- }
- }
- public class SizeSorter : IComparer
- {
- public int Compare(object x, object y)
- {
- if (x == null && y == null)
- {
- return ;
- }
- if (x == null)
- {
- return -;
- }
- if (y == null)
- {
- return ;
- }
- FileInfo xInfo = new FileInfo(x.ToString());
- FileInfo yInfo = new FileInfo(y.ToString());
- return xInfo.Length.CompareTo(yInfo.Length);
- }
- }
- public class TypeSorter : IComparer
- {
- public int Compare(object x, object y)
- {
- if (x == null && y == null)
- {
- return ;
- }
- if (x == null)
- {
- return -;
- }
- if (y == null)
- {
- return ;
- }
- FileInfo xInfo = new FileInfo(x.ToString());
- FileInfo yInfo = new FileInfo(y.ToString());
- return xInfo.Extension.CompareTo(yInfo.Extension);
- }
- }
- #endregion
- #endregion
- }
- }
测试效果:
原文地址:http://www.cnblogs.com/Qbit/p/NopCommerce_KindEditor.html
NopCommerce 3.80框架研究(三)替换tinymce 为KindEditor的更多相关文章
- NopCommerce 3.80框架研究(一) 数据访问与持久化
NopCommerce 是一个国外的开源电商系统.3.80版本使用EF6.0 和.Net Framework 4.5.1 并引入了Autofac , Autofac是一款IOC框架,比较于其他的IOC ...
- NopCommerce 3.80框架研究(二) MVC 表示层与数据验证
表示层框架结构 /Views/Shared/_Root.Head.cshtml /Views/Shared/_Root.cshtml /Views/Shared/_ColumnsOne.cshtml ...
- Prism框架研究(三)
这一篇主要用来介绍一下基于Prism Library中的核心服务以及如何配置Container,还有一个重要的部分是如何管理各个组件之间的依赖性,下面就这些内容来做一一的介绍. 1 Prism中的核心 ...
- ASP.NET Web API 框架研究 ASP.NET Web API 路由
ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
- JavaScript框架设计(三) push兼容性和选择器上下文
JavaScript框架设计(三) push兼容性和选择器上下文 博主很久没有更博了. 在上一篇 JavaScript框架设计(二) 中实现了最基本的选择器,getId,getTag和getClass ...
- 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...
- Flask框架(三)—— 请求扩展、中间件、蓝图、session源码分析
Flask框架(三)—— 请求扩展.中间件.蓝图.session源码分析 目录 请求扩展.中间件.蓝图.session源码分析 一.请求扩展 1.before_request 2.after_requ ...
- Pytest测试框架(三):pytest fixture 用法
xUnit style 结构的 fixture用于初始化测试函数, pytest fixture是对传统的 xUnit 架构的setup/teardown功能的改进.pytest fixture为测试 ...
随机推荐
- C++基础之函数和作用域
(1)函数的定义格式如下所示.<类型><函数名>(<形参表>) {<若干条语句>}其中,<类型>包含存储类和数据类型.存储类省略为外部函数, ...
- cf837D(01背包)
题目链接: http://codeforces.com/contest/837/problem/D 题意: 给出 n 个数, 从中选出 k 个数使得这 k 个数的乘积末尾 0 最多 . 思路: 先记录 ...
- 清北刷题冲刺 10-28 a.m
立方数 (cubic) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方 ...
- Redis数据类型,持久化,回收策略——(Redis缓存第一章)
缓存:第一种是内存缓存 比如Map(简单的数据结构),以及EH Cache(Java第三方库),第二种是缓存组件比如Memached,Redis:Redis(remote dictionary ser ...
- 我的省选 Day -9
Day -9 不知不觉,日子已经变成一位数了,已经到了最后关头了. 早上班主任在上数学课时告诉我们,高校自招的降分政策已经没有以前那么优惠了(这我知道啊) 于是老师间接的暗示了奥赛如果没拿到省一就没什 ...
- css奇技淫巧—border-radius
官方介绍: 浏览器支持:IE9+, Firefox 4+, Chrome, Safari 5+,和Opera支持border-radius属性. border-radius 属性是一个最多可指定四个 ...
- Migration-添加表(加外键)
public partial class _222 : DbMigration { public override void Up() { //DropForeignKey("dbo.Ass ...
- Flask&&人工智能AI --1
Flask初识,Response三剑客,jsonify以及send_file.Request,模板语言 Jinja2,用户登录例子,内置Sessio 一.Flask初识 首先,要看你学没学过Djang ...
- Java中常用的数据源
几种常用的Java数据源解决方案 Java中的数据源就是javax.sql.DataSource.DataSource的创建可以有不同的实现. JNDI方式创建DataSource 以JNDI方式创建 ...
- jdbc取出表名 名称
package com.dataconnect.test.util; import java.sql.Connection; import java.sql.DatabaseMetaData; imp ...