ファイラーでいきつまる
DojoのWidgetのTreeを使ってファイラーを作ろうとしたが挫折・・・。
とりあえず自分のprojectホームを取るソース。
view.py
from django.utils.httpwrappers import HttpResponse from django.core.extensions import render_to_response from xml.dom.minidom import * import os import sys import StringIO def make_tree(request): def tree( parentE, dir ): parent = Element( "div" ) parent.setAttribute( 'dojoType', 'TreeNode' ) parent.setAttribute( 'title', os.path.basename( dir ) ) parent.setAttribute( 'isFolder', 'true' ) parent.setAttribute( 'path', dir ) l = os.listdir( dir ) for f in l: if os.path.isdir( os.path.join( dir, f ) ): tree( parent, os.path.join( dir, f ) ) else: e = Element( "div" ) e.setAttribute( 'dojoType', 'TreeNode' ) e.setAttribute( 'title', f ) e.setAttribute( 'isFolder', 'false' ) e.setAttribute( 'path', os.path.join( dir, f ) ) t = Text() t.data = " " e.appendChild(t) parent.appendChild( e ) parentE.appendChild( parent ) setting = os.environ['DJANGO_SETTINGS_MODULE']; me = sys.modules[setting] dir = os.path.dirname(me.__file__) e = Element( "div" ) e.setAttribute( 'dojoType', 'Tree' ) e.setAttribute( 'title', 'root' ) e.setAttribute( 'toggle', 'fade' ) e.setAttribute( 'widgetId', 'firstTree' ) tree( e, dir ) i = StringIO.StringIO() e.writexml( i, '\t', '\t', '\n' ) tree = i.getvalue() return render_to_response('edit/tree', {'tree': tree})
へたれなのでwalk使ってません。
widgetの仕様に合わせてXML(?)を作成してます。
HTMLおよびjavascriptはこんな感じ。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Dojo Tree Widget Test</title> <script type="text/javascript"> //var djConfig = {isDebug: true}; var djConfig = {isDebug: true, debugAtAllCosts: true }; </script> <script type="text/javascript" src="/src/js/dojo.js"></script> <script type="text/javascript"> dojo.require("dojo.lang.*"); dojo.require("dojo.io.*"); dojo.require("dojo.json"); dojo.require("dojo.widget.*"); dojo.require("dojo.widget.Tree"); dojo.hostenv.writeIncludes(); </script> </head> <body> <h2>TreeRenderTest</h2> {{ tree }} </body> </html>
すんごい簡単。
単なるTreeなのでこんなんで表示できます。
すごい簡単な理由は以下。
Ajaxではないから。
Ajaxにすると取得データを元にwidgetを再表示するわけだがその方法がわからん・・・。
(おおよそはわかっているけど。xmlをparseしてcreateComponentだと思う・・・。)
問題
- iconなどのソースもDjangoのviewが知っていないといけない(divタグを作ってるのがviewなため)
- まじめにフィルタしないとファイルが多すぎて表示できない(特にsvnのファイル)
- 多すぎると重い(firefoxから怒られます)
うーん、フィルタを追加してEditTreeに変更すべきか。
expandイベント拾ってAjaxするのがいいんだろうなあ。
TreeControllerとかマジメに見ないといけないんだろうけど相変わらずDocがないし辛い。
また暇を見つけて考える。
助け舟出してくれる人募集です。
うくく。