以版面添加为例: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>