现在来完成分类的编辑操作。原来是想用模型加载数据的,但现在想想,用表单加载会方便些。

切换到文章管理的控制器,添加onCategoryEdit方法,利用表单来加载数据,代码如下:

onCategoryEdit:function () {

var me = this,

tree =me.view.down("treepanel"),

rs =tree.getSelectionModel().getSelection();

if (rs.length > 0) {

rs = rs[0];

if (rs.data.id > 10000) {

var win =SimpleCMS.view.Content.CategoryEdit;

win.form.getForm().url ="/Category/Edit";

win.setTitle("编辑文章类别");

win.form.load({

url:"Category/Details",

params: { id: rs.data.id },

success: function (form,action) {

this.show();

},

failure:SimpleCMS.FormSubmitFailure,

scope: win

});

} else {

Ext.Msg.alert("信息", "类别“" + rs.data.text + "”不允许编辑。");

}

}

},

分类id大于10000的才是可以编辑的分类,因而这里要加个判断。设置好分类编辑窗口的的提交地址和标题后,就调用load方法为表单加载数据了。如果成功,就显示窗口。这里要注意作用域的设置,在这里把作用域设置为win了,这样,在success方法内,this指针就指向窗口了。

现在切换到Category控制器,完成Details方法。根据书12.5.2节的示例可以知道,在data内返回一个JSON对象就可以了,对象中的关键字就是表单中字段的名字,这相当简单,代码如下:

[AjaxAuthorize(Roles= "普通用户,系统管理员")]

publicJObject Details()

{

int id=0;

int.TryParse(Request["id"],outid);

try

{

var q = dc.T_Category.SingleOrDefault(m=> m.CategoryId == id);

if (q == null)

{

returnMyFunction.WriteJObjectResult(false, 0, "分类已被删除或不存在。", null);

}

else

{

return new JObject(

newJProperty("success",true),

new JProperty("data",

new JObject(

newJProperty("CategoryId",q.CategoryId),

newJProperty("Content",q.Content),

newJProperty("Image",q.Image),

newJProperty("Title",q.Title),

newJProperty("SortOrder",q.SortOrder),

newJProperty("ParentId",q.ParentId==null ? -1 : q.ParentId)

)

)

);

}

}

catch (Exception e)

{

returnMyFunction.WriteJObjectResult(false, 0, e.Message, null);

}

}

这里要注意的是ParentId,为null时,要设置为-1,这样才能对应上是根节点。

现在还不能测试,因为编辑按钮现在还是禁用状态,因而,要监听分类树的selectionchange事件,当有选择了节点且节点id大于10000时启用编辑和删除按钮。切换到文章管理的控制器,先在me.control语句上添加绑定selectionchange的语句,代码如下:

me.view.down("treepanel").on("selectionchange",me.onTreeSelect, me);

然后编写onTreeSelect方法,这里要注意setDisabled的赋值,要把id的值考虑进去,代码如下:

onTreeSelect:function (model, sels) {

var me = this,

id = 0;

if (sels.length > 0) {

id = sels[0].data.id;

}

me.getCategoryEdit().setDisabled(sels.length == 0 || id <= 10000);

me.getCategoryDelete().setDisabled(sels.length== 0 || id <= 10000);

}

这里,如果存在选择,则把id值取出来,然后在setDisabled方法内,如果选择记录的长度等于0,说明要禁用按钮,又或者id值小于10000,也要禁用按钮。

好了,现在可以单击编辑按钮对分类进行编辑了。

余下的就是完成编辑操作的后台代码了,这个与Add方法区别不大,具体代码如下:

[HttpPost]

[AjaxAuthorize(Roles= "普通用户,系统管理员")]

publicJObject Edit(CategoryModel model)

{

bool success = false;

JObject errors = new JObject();

if (ModelState.IsValid)

{

try

{

var q =dc.T_Category.SingleOrDefault(m => m.CategoryId == model.CategoryId);

if (q == null)

{

returnMyFunction.WriteJObjectResult(false, 0, "要修改的记录已被删除或不存在。", null);

}

else

{

string old_fullpath =q.FullPath;

q.Content = model.Content;

q.Title = model.Title;

q.SortOrder = model.SortOrder;

if (model.ParentId>10000&  dc.T_Category.Select(m =>m.CategoryId).Contains(model.ParentId))

{

q.ParentId =model.ParentId;

}

else

{

q.ParentId = null;

}

dc.SaveChanges();

success = true;

returnMyFunction.WriteJObjectResult(true, 0, "", new JArray(

new JObject(

newJProperty("id", q.CategoryId),

newJProperty("text", q.Title),

newJProperty("parentId", q.ParentId),

newJProperty("fullpath", q.ParentId == null ? "" :q.Parent.FullPath)

)

));

}

}

catch (Exception e)

{

returnMyFunction.WriteJObjectResult(false, 0, e.Message, null);

}

}

else

{

MyFunction.ModelStateToJObject(ModelState, errors);

}

returnMyFunction.WriteJObjectResult(success, errors);

}

这里要注意的是,如果父id不大于10000,或在分类数据库中不包含该id,就要把父id设置为null。

注意:在数据库T_Category表的trg_CategoryUpdate触发器中有个错误,需要把开头的“SET NOCOUNT ON;”屏蔽掉才能正常更新fullpath和HierarchyLevel。

至此,编辑功能就完成了。下面继续完成删除功能,这与删除文件目录的代码没太大区别。切换到文章管理的控制器,完成onCategoryDelete方法,代码如下:

onCategoryDelete:function () {

var me = this,

tree =me.view.down("treepanel"),

rs =tree.getSelectionModel().getSelection();

if (rs.length > 0) {

rs = rs[0];

if (rs.data.id <= 10000) {

Ext.Msg.alert("删除类别", "类别“" + rs.data.text + "”不允许删除!");

return;

}

var content = "确定删除类别“" + rs.data.text + "”?<br/><p style='color:red'>注意:该类别下子类将被全部删除,而该类别及其子类的文章会被移动到未分类中。</p>";

Ext.Msg.confirm("删除类别", content, function (btn) {

if (btn == "yes") {

var rs =this.getSelectionModel().getSelection();

if (rs.length > 0) {

rs = rs[0];

rs.remove();

this.store.sync({

success: function (e,opt) {

var me = this;

me.store.commitChanges();

me.view.select(0);

me.view.focus(false);

},

failure: function(e,opt) {

var me = this;

me.store.rejectChanges()

Ext.Msg.alert("发生错误",e.exceptions[0].error);

},

scope: tree

});

}

}

}, tree)

}

},

现在,切换到Category控制器,完成Delete方法。在方法内,先要通过fullpath,一次过把所有子类搜索出来,设置其state值为1。然后把它们包含的文章找出来,设置这些文章的CategoryId值为10000。最后把提交的数据完整返回就行了。具体代码如下:

[AjaxAuthorize(Roles= "普通用户,系统管理员")]

publicJObject Delete()

{

bool success = false;

string msg = "";

JArray ja = null;

try

{

string data = Request["data"]?? "";

if (string.IsNullOrEmpty(data))

{

msg = "错误的提交数据。";

}

else

{

ja = JArray.Parse(data);

if (ja.Count > 0)

{

JObject jo = (JObject)ja[0];

var q =dc.T_Category.SingleOrDefault(m => m.CategoryId == (int)jo["id"]);

if (q != null)

{

q.State = 1;

var sub = dc.T_Category.Where(m =>m.FullPath.StartsWith(q.FullPath));

foreach (var c in sub)

{

c.State = 1;

}

var content =dc.T_Content.Where(m => sub.Select(n =>n.CategoryId).Contains(m.CategoryId));

foreach (var c in content)

{

c.CategoryId = 10000;

}

dc.SaveChanges();

success = true;

}

else

{

msg = "该类别已被删除或不存在。";

}

}

else

{

msg = "错误的提交数据。";

}

}

}

catch (Exception e)

{

msg = e.Message;

}

returnHelper.MyFunction.WriteJObjectResult(success, 0, msg, ja);

}

除了处理数据部分,整个处理流程基本是一样的,都是先从data中取得数据,转换,然后从数据库获得数据处理。

余下的小问题是让树显示时选择一个默认节点,而这个要用到《解决Ext JS 4.1版本Tree在刷新时选择第一行的问题》中的解决办法,具体代码如下:

me.view.down("treepanel").getView().on("refresh",function () {

var tree =this.view.down("treepanel");

var node = tree.getRootNode().firstChild;

if (node) {

tree.getView().select(node);

}

}, me);

至此,文章分类的操作就完成了。下文继续完成文章管理的操作。

源代码:http://vdisk.weibo.com/s/iflJg

转载于:https://www.cnblogs.com/muyuge/archive/2012/11/17/6333732.html

CMS:文章管理之视图(4)相关推荐

  1. CMS:文章管理之视图(2)

    上一篇已经完成了分类树的显示,现在开始逐步完成分类的添加.删除和编辑操作. 首先要做的是在树面板上添加一个工具栏,放置添加.删除和编辑按钮.切换到文章管理视图的脚本文件view.js,在树的定义内,添 ...

  2. CMS:文章管理之视图(6)

    现在来完成文章管理的编辑窗口.在开始之前,先去官方论坛一个名称为Ext.ux.form.TinyMCETextArea的扩展,地址是http://www.sencha.com/forum/showth ...

  3. CMS:文章管理之控制器

    有了编写用户管理的控制器的经验,写这个问题应该不大.不过,文章管理的控制器还是要考虑一下怎么写这个问题,因为在视图里涉及分类的操作和文章的操作.这确实是一个比较费神的事.在这里,问题的焦点就是需要不需 ...

  4. CMS:文章管理之模型和Store

    文章管理涉及T_Category .T_Content .T_Tag 和T_TagInContent 这4个表,在客户端,由于标签的两个表的显示会合并到文章内容里,因而文章管理至少需要2个模型和2个S ...

  5. 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...

  6. 米拓建站系统(MetInfo CMS)文章定时发布软件

    简介: 米拓建站系统(MetInfo CMS)文章定时发布软件是一个网友根据自己需求写的文章发布辅助工具,能够帮助用户定时自动发布文章,这样就不用每天手动发文章啦,只需简单的操作就能轻松发布多篇文章, ...

  7. (转) 淘淘商城系列——CMS内容管理系统工程搭建

    http://blog.csdn.net/yerenyuan_pku/article/details/72825801 淘淘商城系列--CMS内容管理系统工程搭建 上文我们一起搭建了表现层中的商城门户 ...

  8. 帝国cms文章内容tags关键词设置调用方法以及tags静态化

    说实话帝国cms用起来真的不好找一些功能,就比如说帝国cms的tag标签调用.需要注意的是帝国CMS文章的关键词和tags标签并非一码事,关键词标签是设置文章的关键词的,是用来给搜索引擎说明本篇文章的 ...

  9. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(8)之文章管理

    到这一步,我们整个项目的核心搭建已经算是完成了,接下来就是我们业务功能的实际应用,也就是表现层的设计和实现,如果你是一个项目负责人,到这一步,接下来的工作就可以交给下面的兄弟去完成了,在这里我们用文章 ...

  10. springBoot+thymeleaf框架实现cms内容管理和商城系统

    springBoot+thymeleaf框架实现cms内容管理和商城系统 概要介绍 基于开源框架springBoot2.3+thymeleaf+springSecurity+lucene8.5.2 是 ...

最新文章

  1. OpenWRT的ROM固件内置软件包修改与定制
  2. android singleTop 不起作用
  3. Dijkstra模板
  4. springsession使用redis
  5. c语言程序设计工资纳税系统流程图,c语言程序设计,纳税工资系统.doc
  6. PostgreSQL判断一个表是否存在
  7. 创业者应该了解的五大无服务器AWS服务
  8. 买一个二级计算机软件多少钱,计算机二级考试需要买课本吗
  9. 苏宁11.11:苏宁易购移动端的架构优化实践
  10. 性能测试方案(计划)模板
  11. 如何学习硬件设计——硬件开发实践篇
  12. 软件测试面试,面试官最后问:你有什么要问我的吗?应该如何回答
  13. 数据交换平台-初步设计
  14. ESP8266的FATAL EXCEPTION 28 29问题原因
  15. CityEngine2016-学习笔记(2)Shape Operations
  16. 2019.1.30《C Primer Plus》拖了一天写完的第八章编程练习答案
  17. hyperledger fabric 2.3.3 环境搭建教程
  18. CSS——网易云音乐首页之榜单区域的实现
  19. java基于Springboot+vue的球鞋销售商城网站 elementui
  20. 【前端】JS批量生成调查问卷选项

热门文章

  1. 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建
  2. 稳定婚姻问题和Gale-Shapley算法(转)
  3. VMWare Network Adapter设置错误也会导致 Determining IP information for eth0 failed
  4. oracle developer连接access
  5. 解决SVN403问题
  6. 卓有成效的管理者的五个习惯
  7. java多线程知识点之wait和sleep的区别
  8. C++指针编程你要小心的陷阱——如何优雅的释放指针void*
  9. 忍者神龟java_忍者神龟-邪恶重生
  10. android写一个遥控器界面,遥控器界面软件的设计 - 基于安卓系统手机WiFi的家用智能遥控器开发...