PythonScript
- Python と PythonScript について
両方ともよく知らないのですが適当に書いてます。
- PythonScript へ引数を渡す
結構ハマりました。どうやって渡せばいいのかさっぱりわかんない。結論はシンプルで Edit タブにある Parameter List のところに、引数名(たとえば argx)を記述し、DTMLメソッドのほうで <dtml-var "myfunction(argx=
100)"> とかすればよいだけでした。意外とこういうことは検索しても見付かりにくい・・・ - 呼ばれたページに戻る
return container.REQUEST.RESPONSE.redirect(container.REQUEST.HTTP_REFERER) とすれば、スクリプトを呼びだしたページに戻ります。値は渡せませんので、呼びだしたページ側で dtml-var とかで get するページであるという前提になります。
- 値の渡しかたその二
form に記述しておくとそのname で REQUEST.from['name']? でアクセスできる。複数あるとリストになる。
- 値の戻しかた
呼ばれたページに値を戻す方法。container.REQUEST.HTTP_REFERER+('&retval=%d'%(number)) にリダイレクトすれば渡せなくもないけど、問題多いような気がする。
- MySQL との連携
複数の DB の 複数のテーブルにごりごりとアクセスするロクでもない方法は発見です。
- まず、Z MySQL Database Connection を必要な数だけ作ります(database 別とかホストとか)
- 次に 上と同数の Z SQL Method を作ります。Connection ID は上のそれぞれのDBを指定し、Argumentは「無し」、メソッドは <dtml-var "REQUEST.form['host_query_tsoh']?"> とでもします(Form で重なりそうにない名前ならなんでもよい)
- host1db1, host1db2, host2db1, local と4つ作ったとします。
- 次に集約用 PythonScript を作ります。 parameter は dbent, dbquerystr とし、内容は
container.REQUEST.form['host_query_tsoh']? = dbquerystr
return dbent()
です。これを querySQL とします。
- そうすると、任意の PythonScript から container.querySQL(dbent=host1db2, dbquerystr="select userid, name from privateuser where userid = %d"%(fooid)) のように呼べます。container を抜けば dtml-in で呼んで、DTML Method でくるくる回すのもできます。
- ただ、これやっちゃうと、オブジェクトの粒度を認識しないとOOの意味がそーとー減衰されるので注意です。
# 動きますけどね
- PythonScript から DTML Method を引数付きで呼びだす
container.mydtmlmethod(None, container.REQUEST, varname1='ひとつめの変数の値です', varname2='次の変数です')
で呼びだせます。
- 好きな module を使う
- Products にテキトーなディレクトリを切ります。
Global とか
- そこに __init__.py を書きます。
from Products.PythonScripts.Utility import allow_module
allow_module(’csv’)
CSV を使いたい。re を使いたければ同様に行を追加
- Products にテキトーなディレクトリを切ります。