简体   繁体   English

来自数据库的PrimeFaces面包屑

[英]BreadCrumb with PrimeFaces from database

I'm working with folders within a database. 我正在使用数据库中的文件夹。 Each folder is referenced by its parent : 每个文件夹均由其父文件夹引用:

      id  ref
root   0   0
me     1   0
folder 2   0
inme   3   1

Each folder are displayed when I click on their name. 当我单击它们的名称时,将显示每个文件夹。 The "commandLink" has got a parameter : the folder ID. “ commandLink”具有一个参数:文件夹ID。 It works great but I don't know how to keep tracks of the path : I would like something like root > me > inme . 它很好用,但是我不知道如何跟踪路径:我root > me > inme这样的东西。

Is there any way to have virtually in the URL ".../root/me/inme" using backing-beans ? 有什么方法可以使用backing-beans在URL“ ... / root / me / inme”中进行虚拟化吗?

Thanks 谢谢

Just wrote it myself, check this: 我自己写的,检查一下:

Page: 页:

<h:form id="form1">
    <h:outputText id="trackmsg" value="#{MyBean.trackMsg}"/>
    <p:dataTable value="#{MyBean.folderList}" var="folder" style="width: 300px">
        <p:column headerText="name">
            <p:commandLink value="#{folder.name}" action="#{MyBean.track(folder.id)}" update=":form1:trackmsg"/>
        </p:column>
        <p:column headerText="id">
            <h:outputText value="#{folder.id}"/>
        </p:column>
        <p:column headerText="ref">
            <h:outputText value="#{folder.ref}"/>
        </p:column>
    </p:dataTable>
</h:form>

Backing Bean: (Just two key methods: track() and findParent() ) 支持Bean :(只有两个关键方法: track()findParent()

private List<Folder> folderList=new ArrayList<>();
private String trackMsg="";//to show tracks of the path:  root>me>inme

@PostConstruct
public void init(){//Just initialize thr list
    folderList.add(new Folder("root", 0, 0));
    folderList.add(new Folder("me", 1, 0));
    folderList.add(new Folder("folder", 2, 0));
    folderList.add(new Folder("inme", 3, 1));
    folderList.add(new Folder("ininme", 4, 3));
}

public void track(int id){//to composite the track path
    trackMsg="";
    Folder selectedFolder=new Folder();
    for(Folder fold:folderList) //find the selected Folder
        if(fold.getId()==id)
        {
            selectedFolder=fold;
            if(selectedFolder.getId()!=selectedFolder.getRef())//if so, it means the root folder
            trackMsg=">"+selectedFolder.getName();
        }

    Folder parentFolder=findParent(selectedFolder);//get the parent folder of the selected folder

    while(parentFolder!=null && parentFolder.getId()!=parentFolder.getRef()){//while there is parent folder and not root folder
        trackMsg=">"+parentFolder.getName() + trackMsg;
        parentFolder=findParent(parentFolder);//find the parent of parent
    }

    trackMsg="root"+trackMsg;//the last, root folder
}

public Folder findParent(Folder child){//find the parent folder of the passing folder
    for(Folder fold:folderList)
        if(fold.getId()==child.getRef())
            return fold;
    return null;
}

When I click "ininme" in the dataTable, it looks like: 当我在数据表中单击“ ininme”时,它看起来像:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM