如何实现无限级目录

以版面添加为例:pid值为0的数据为第一级;pid值等于id值的数据为这个id的子级

1.在repository中创建getGroupForums方法用来存储pid值相同的数据为一组

  Forum[][int] getGroupForums() //二维数组
    {
        Forum[][int] groupForums;
        foreach (forum; this.findAll())
        {
            groupForums[forum.pid] ~= forum; //pid值相同的数据分为一组
        }
        
        return groupForums;
    }

2.在controller中创建ForumItem结构体;在结构体下运用递归实现功能

    struct ForumItem
    {
        Forum forum; //Model下定义一个forum
        int level;  //等级
        string prefix;  //前缀
    }
    ForumItem[] toForumList(int currentId, Forum[][int] groupForums, int currentLevel)
    //当前ID,groupForums二维数组,当前等级
    {
        ForumItem[] nodes;//定义一个节点
        foreach (forum; groupForums[currentId])//forum, pid等于上一级id的组合
        {
            if(forum.deleted > 0)
            {
                continue;
            }//删除时列表信息同时也删除
            
            ForumItem node;
            node.forum = forum;
            node.level = currentLevel;//forum中currentLevel传到结构体中level

            string prefix;
            foreach (i; 0..currentLevel)
            {
                prefix ~= "--";
            }//循环等级加前缀
            node.prefix = prefix;

            nodes ~= node; // ~= 连接
            if (forum.id in groupForums)//判断是否有子级 groupForums中pid是否等于id
            {
                nodes ~= toForumList(forum.id, groupForums, currentLevel + 1);//递归调用
            }
        }

        return nodes;
    }
} 

3.在controller添加功能中调用repository中方法以及结构体,实现功能;

class  ForumController  : AdminBaseController
{
    mixin MakeController;

    this()
    {
        super();      
    }

    @Action Response add(ForumForm form, int pid)
    {
        auto forumrepository = new ForumRepository(_cManager);
        auto forum = new Forum;
        if(request.method == HttpMethod.POST)
        {...}
        
        view.assign("firstLevelForums", forumrepository.findAll());///查询版面所有信息
        
        auto groupForums = forumrepository.getGroupForums();//调用方法,取得以pid值相同为一组的版面信息
        auto forums = toForumList(0, groupForums, 0);//默认第一级当前ID为0, ,等级为0
        
        view.assign("groupForums", forums);///

        return new Response(request)
            .setHeader(HttpHeader.CONTENT_TYPE, MimeType.TEXT_HTML_UTF_8.asString())
            .setContent(view.render("forum/admin/add"));
    }

4.模板页

<div class="form-group row">
    <label class="col-2 col-form-label">Parent forum</label>
    <div class="col-10">
        <select class="form-control" name="pid">
            <option value="0">(None)</option>
            {% for item in groupForums %}
            <option value="{{item.forum.id}}">{{item.prefix}}{{item.forum.name}}</option>
            {% endfor %}
        </select>
    </div>
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值