Как записать детей указанного родителя в столбец дерева (таблица) - PullRequest
0 голосов
/ 27 декабря 2010

Я новичок в Grails и попытался реализовать TreeView с помощью плагина RichUI, который показывает всех родителей с отдельными детьми в Parent.list.gsp

xml для родителей и их детей

     <parents name='Parents'>
  <Parent id='1' name='Parent_1'>
    <Children name='Children'>
      <child name='Child_2' id='2' />
      <child name='Child_4' id='4' />
      <child name='Child_1' id='3' />
      <child name='Child_3' id='1' />
    </Children>
  </Parent>
  <Parent id='2' name='Parent_2'>
    <Children name='Children'>
      <child name='Child_1' id='8' />
      <child name='Child_2' id='7' />
      <child name='Child_4' id='6' />
      <child name='Child_3' id='5' />
    </Children>
  </Parent>
</parents>

Класс родительского домена

class Parent {

String name

static hasMany = [children:Child]

}

Класс дочернего домена

class Child {

    String name
    Parent parent

    static belongsTo = [parent:Parent]

}

Родительский контроллер

def list = {

    def writer = new StringWriter()
    def xml = new MarkupBuilder(writer)
    xml.parents(name: "Parents"){
        Parent.list().each {
            Parent parentt = it
            Parent( id:parentt.id,name:parentt.name) {
                Children(name:'Children'){
                    parentt.children.each {
                        Child childd = it
                        child(name:childd.name,id:childd.id)
                    }
                }
            }
        }
    }
    if(!params.max)params.max=10
    ["data":writer.toString(),parentInstanceList: Parent.list(params), parentInstanceTotal: Parent.count()]
}

Parent.list.gsp

 <head>
    <resource:treeView/> ...</head>

 <body>
   <table>
                <thead>
                    <tr>

                        <g:sortableColumn property="id" title="${message(code: 'parent.id.label', default: 'Id')}" />

                        <g:sortableColumn property="name" title="${message(code: 'parent.name.label', default: 'Name')}" />
                        <g:sortableColumn property="relationship" title="${message(code: 'parent.relationhsip.label', default: 'Relationship')}" />

                    </tr>
                </thead>
                <tbody>
                <g:each in="${parentInstanceList}" status="i" var="parentInstance">
                    <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">

                        <td><g:link action="show" id="${parentInstance.id}">${fieldValue(bean: parentInstance, field: "id")}</g:link></td>
                        <td>${fieldValue(bean: parentInstance, field: "name")}</td>
                        <td><richui:treeView  xml="${data}" /></td>

                    </tr>
                </g:each>
                </tbody>
            </table>

 </body>

Проблема

В настоящее время в представлении списка каждая родительская запись содержит список всех родителей и их детей в столбце отношений

Представление родительского списка Снимок экрана текст ссылки

Вопрос

как я могу зачислить всех детей только для каждого родителя вместо того, чтобы зачислять всех родителей со своими детьми в каждую запись для родителей?

заранее спасибо

Рехман

1 Ответ

0 голосов
/ 27 декабря 2010

проблема здесь в том, что вы визуализируете XML для всех узлов в одной операции и затем передаете его в «data», который отображает один и тот же XML для каждой строки.

вам нужно передать параметр родительского идентификатора в замыкание:

/ * это запускается в цикле foreach в вашем gsp * /

def listParentNode = {
def parentId = params.id
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.parents(name: "Parents"){
    Parent.findAllById(parentId).each {
        Parent parentt = it
        Parent( id:parentt.id,name:parentt.name) {
            Children(name:'Children'){
                parentt.children.each {
                    Child childd = it
                    child(name:childd.name,id:childd.id)
                }
            }
        }
    }
}

["data":writer.toString()]
//or render "data" as XML // depending on what the richui tag is expecting.
}

другой кусок находится в вашем gsp, оставьте gsp файл без изменений, просто измените эту часть:

<td><richui:treeView  xml="${createLink(controller:'somecontroller',action:'listParentNode', id: parentInstance.id )}" /></td>

somecontroller - это имя вашего контроллера, где выполняются эти действия.

...