真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

CMS:文章管理之視圖(4)

現(xiàn)在來完成分類的編輯操作。原來是想用模型加載數(shù)據(jù)的,但現(xiàn)在想想,用表單加載會(huì)方便些。
切換到文章管理的控制器,添加onCategoryEdit方法,利用表單來加載數(shù)據(jù),代碼如下:
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的才是可以編輯的分類,因而這里要加個(gè)判斷。設(shè)置好分類編輯窗口的的提交地址和標(biāo)題后,就調(diào)用load方法為表單加載數(shù)據(jù)了。如果成 功,就顯示窗口。這里要注意作用域的設(shè)置,在這里把作用域設(shè)置為win了,這樣,在success方法內(nèi),this指針就指向窗口了。
 
現(xiàn)在切換到Category控制器,完成Details方法。根據(jù)書12.5.2節(jié)的示例可以知道,在data內(nèi)返回一個(gè)JSON對(duì)象就可以了,對(duì)象中的關(guān)鍵字就是表單中字段的名字,這相當(dāng)簡單,代碼如下:
[AjaxAuthorize(Roles= "普通用戶,系統(tǒng)管理員")]
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時(shí),要設(shè)置為-1,這樣才能對(duì)應(yīng)上是根節(jié)點(diǎn)。
現(xiàn) 在還不能測試,因?yàn)榫庉嫲粹o現(xiàn)在還是禁用狀態(tài),因而,要監(jiān)聽分類樹的selectionchange事件,當(dāng)有選擇了節(jié)點(diǎn)且節(jié)點(diǎn)id大于10000時(shí)啟用 編輯和刪除按鈕。切換到文章管理的控制器,先在me.control語句上添加綁定selectionchange的語句,代碼如下:
me.view.down("treepanel").on("selectionchange",me.onTreeSelect, me);
 
然后編寫onTreeSelect方法,這里要注意setDisabled的賦值,要把id的值考慮進(jìn)去,代碼如下:
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方法內(nèi),如果選擇記錄的長度等于0,說明要禁用按鈕,又或者id值小于10000,也要禁用按鈕。
 
好了,現(xiàn)在可以單擊編輯按鈕對(duì)分類進(jìn)行編輯了。
余下的就是完成編輯操作的后臺(tái)代碼了,這個(gè)與Add方法區(qū)別不大,具體代碼如下:
[HttpPost]
[AjaxAuthorize(Roles= "普通用戶,系統(tǒng)管理員")]
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,或在分類數(shù)據(jù)庫中不包含該id,就要把父id設(shè)置為null。
注意:在數(shù)據(jù)庫T_Category表的trg_CategoryUpdate觸發(fā)器中有個(gè)錯(cuò)誤,需要把開頭的“SET NOCOUNT ON;”屏蔽掉才能正常更新fullpath和HierarchyLevel。
至此,編輯功能就完成了。下面繼續(xù)完成刪除功能,這與刪除文件目錄的代碼沒太大區(qū)別。切換到文章管理的控制器,完成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 + "”?

注意:該類別下子類將被全部刪除,而該類別及其子類的文章會(huì)被移動(dòng)到未分類中。

";
        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("發(fā)生錯(cuò)誤",e.exceptions[0].error);
                        },
                        scope: tree
                    });
                }
            }
        }, tree)
    }
},
 
現(xiàn) 在,切換到Category控制器,完成Delete方法。在方法內(nèi),先要通過fullpath,一次過把所有子類搜索出來,設(shè)置其state值為1。然 后把它們包含的文章找出來,設(shè)置這些文章的CategoryId值為10000。最后把提交的數(shù)據(jù)完整返回就行了。具體代碼如下:
[AjaxAuthorize(Roles= "普通用戶,系統(tǒng)管理員")]
publicJObject Delete()
{
    bool success = false;
    string msg = "";
    JArray ja = null;
    try
    {
        string data = Request["data"]?? "";
        if (string.IsNullOrEmpty(data))
        {
            msg = "錯(cuò)誤的提交數(shù)據(jù)。";
        }
        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 = "錯(cuò)誤的提交數(shù)據(jù)。";
            }
        }
    }
    catch (Exception e)
    {
        msg = e.Message;
    }
    returnHelper.MyFunction.WriteJObjectResult(success, 0, msg, ja);
}
 
除了處理數(shù)據(jù)部分,整個(gè)處理流程基本是一樣的,都是先從data中取得數(shù)據(jù),轉(zhuǎn)換,然后從數(shù)據(jù)庫獲得數(shù)據(jù)處理。
余下的小問題是讓樹顯示時(shí)選擇一個(gè)默認(rèn)節(jié)點(diǎn),而這個(gè)要用到《解決Ext JS 4.1版本Tree在刷新時(shí)選擇第一行的問題》中的解決辦法,具體代碼如下:
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);
 
至此,文章分類的操作就完成了。下文繼續(xù)完成文章管理的操作。
源代碼:http://vdisk.weibo.com/s/iflJg

分享名稱:CMS:文章管理之視圖(4)
當(dāng)前地址:http://weahome.cn/article/pceidd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部