溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2020-06-21 22:10:18 來源:網(wǎng)絡(luò) 閱讀:609 作者:tianxiaode2008 欄目:編程語言
現(xiàn)在來完成分類的編輯操作。原來是想用模型加載數(shù)據(jù)的,但現(xiàn)在想想,用表單加載會方便些。
切換到文章管理的控制器,添加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的才是可以編輯的分類,因而這里要加個判斷。設(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)返回一個JSON對象就可以了,對象中的關(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è)置為-1,這樣才能對應(yīng)上是根節(jié)點。
現(xiàn) 在還不能測試,因為編輯按鈕現(xiàn)在還是禁用狀態(tài),因而,要監(jiān)聽分類樹的selectionchange事件,當(dāng)有選擇了節(jié)點且節(jié)點id大于10000時啟用 編輯和刪除按鈕。切換到文章管理的控制器,先在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)在可以單擊編輯按鈕對分類進(jìn)行編輯了。
余下的就是完成編輯操作的后臺代碼了,這個與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ā)器中有個錯誤,需要把開頭的“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 + "”?<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("發(fā)生錯誤",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 = "錯誤的提交數(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 = "錯誤的提交數(shù)據(jù)。";
            }
        }
    }
    catch (Exception e)
    {
        msg = e.Message;
    }
    returnHelper.MyFunction.WriteJObjectResult(success, 0, msg, ja);
}
 
除了處理數(shù)據(jù)部分,整個處理流程基本是一樣的,都是先從data中取得數(shù)據(jù),轉(zhuǎn)換,然后從數(shù)據(jù)庫獲得數(shù)據(jù)處理。
余下的小問題是讓樹顯示時選擇一個默認(rèn)節(jié)點,而這個要用到《解決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);
 
至此,文章分類的操作就完成了。下文繼續(xù)完成文章管理的操作。
源代碼:http://vdisk.weibo.com/s/iflJg
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI