##language:zh #pragma section-numbers on ''' 含有章节索引的 *PUG 文章通用模板 ''' ::-- [[hf_linux|hf_linux]] [<>] <> ## 默许导航,请保留 <> = 文章大标 = ''用python生成xtree树形菜单'' == 模型 == === 模型代码 === {{{ #!python #coding=utf-8 class TreeObject(object): def __init__(self,name="",action="",xmlSrc=""): self.name = name if action: self.action = "\""+action+"\"" else: self.action = "null" self.__xmlSrc = xmlSrc #tree.xmlSrc="/getNOde ?...." self.icon = "null" self.openIcon = "null" self.parent = "" self.spanLevel = 1 self.subTreeItems = [] def addSubTreeItem(self,treeItem): self.subTreeItems.append(treeItem) treeItem.parent = self #TODO :escape def setXmlSrc(self,xmlSrc): self.__xmlSrc = xmlSrc def getXmlSrc(self): return self.__xmlSrc xmlSrc = property(getXmlSrc,setXmlSrc) def toXml(self): buf = "" buf += "\n" i=0 for item in self.subTreeItems: tmp = item.itemToXml(i) buf += tmp i+=1 buf += "\n" return buf class JsTree(TreeObject): #static variable idxGenerator = "" def __init__(self,name="",action="",xmlSrc=""): if name == "": name = "jsTree" super(JsTree, self).__init__(name,action,xmlSrc) self.rootName = "" self.behavior = "classic" def getJsTreeStr(self): buf= "\n" return buf @staticmethod def indexGenerator(): i = 0 while True: i = i+1 yield i @staticmethod def getJsVariableIndex(): if not JsTree.idxGenerator: JsTree.idxGenerator = JsTree.indexGenerator() return JsTree.idxGenerator.next() class TreeItem(TreeObject): def __init__(self,name="",action="",xmlSrc=""): if name == "": name = "TreeItem" super(TreeItem, self).__init__(name,action,xmlSrc) def buildJsTreeStr(self,parent,indent): prefix = "" buf = "" try: indent = int(indent) except: indent = 0 for i in range(indent): prefix = prefix+"\t" item = "tree" + str(JsTree.getJsVariableIndex()) buf += prefix + "var " + item if not self.xmlSrc: buf += " = new WebFXTreeItem('" else: buf += " = new WebFXLoadTreeItem('" buf += self.name + "'," if self.xmlSrc: buf += "\"" + self.xmlSrc + "\"," buf += self.action buf += ",null," buf += self.icon+","+self.openIcon+");\n" for treeItem in self.subTreeItems: buf += treeItem.buildJsTreeStr(item,indent+1) buf += prefix buf += parent buf += ".add("+item+");\n" return buf def itemToXml(self,indent=0): prefix = "" buf="" try: indent = int(indent) except: indent = 0 for i in range(indent): prefix = prefix+"\t" buf += prefix+ "\n" else: buf += "/>\n" return buf class InputTreeItem(TreeItem): def __init__(self,name="",action="",xmlSrc=""): super(InputTreeItem, self).__init__(name,action,xmlSrc) self.fieldName = "" self.fieldValue = "" self.checked = False self.inputType = "checkbox" self.js_cls = "WebFXCheckBoxTreeItem" self.js_xload_cls = "WebFXCheckBoxLoadTreeItem" def buildJsTreeStr(self,parent,indent): if not self.fieldName: raise ValueError("fieldName can't be null") if not self.fieldValue: raise ValueError("fieldValue can't be null") try: indent = int(indent) except: indent = 0 buf = "" prefix = "" for i in range(int(indent)): prefix += "\t" treeItem = "tree" + str(JsTree.getJsVariableIndex()) buf += prefix + "var " + treeItem if self.xmlSrc: buf += " = new " +self.js_xload_cls +"('" else: buf += " = new "+ self.js_cls+" ('" buf += self.name + "'," if self.xmlSrc: buf += "\""+self.xmlSrc+"\"," buf += "' " + self.fieldName + "','"+self.fieldValue if self.checked: booleanStr = "true" else: booleanStr = "false" buf += "' , "+self.action+","+booleanStr+",null," buf += self.icon + "," + self.openIcon+");\n" for curItem in self.subTreeItems: tmp = curItem.buildJsTreeStr(treeItem,indent+1) buf += tmp buf += prefix + parent+".add("+treeItem+");\n" return buf def itemToXml(self,indent): prefix = "" buf="" try: indent = int(indent) except: indent = 0 for i in range(indent): prefix = prefix+"\t" buf += prefix+ "\n" else: buf += "/>\n" return buf class CheckboxTreeItem(InputTreeItem): def __init__(self,name="",action="",xmlSrc=""): super(CheckboxTreeItem, self).__init__(name,action,xmlSrc) self.inputType = "checkbox" self.js_cls = "WebFXCheckBoxTreeItem" self.js_xload_cls = "WebFXCheckBoxLoadTreeItem" class RadioTreeItem(InputTreeItem): def __init__(self,name="",action="",xmlSrc=""): super(RadioTreeItem, self).__init__(name,action,xmlSrc) self.inputType = "radio" self.js_cls = "WebFXRadioTreeItem" self.js_xload_cls = "WebFXRadioLoadTreeItem" if __name__ == "__main__": tree = JsTree() tree1 = TreeItem('tree1') tree2 = TreeItem('tree2') tree3 = TreeItem('tree3') tree2.addSubTreeItem(tree3) tree1.addSubTreeItem(tree2) tree.addSubTreeItem(tree1) input1 = RadioTreeItem('input1') input1.fieldName = "input1" input1.fieldValue = "input1" input2 = RadioTreeItem('input2') input2.fieldName = "input2" input2.fieldValue = "input2" input2.xmlSrc = "dddd" input3 = RadioTreeItem('input3') input3.fieldName = "input3" input3.fieldValue = "input3" input2.addSubTreeItem(input3) input1.addSubTreeItem(input2) tree.addSubTreeItem(input1) tree1.addSubTreeItem(input1) print tree.getJsTreeStr() print tree1.itemToXml() }}} ==== 次节标题1 ==== 目标效 果 {{http://static.haokanbu.com/media/blog/52358ed7193247e197b29d5d8565ed92.jpeg}} == 章标题2 == === 小节标题2 === {{{ 其它 代码引用 }}} ==== 次节标题2 ==== = 反馈 =