2009/02/18(水)ZipFileTransport

Export

plone/Products/ZipFileTransport/browser/zipexportのaction_exportがエクスポートの実体
ここで、ログを取る

84: for x in paths:
ループでファイルリストを生成
-> ファイルサイズのチェックを追加
94: if self.context.portal_...
ユーザ認証
-> ファイルサイズのチェックも同時に行う?

画面

plone/Products/ZipFileTransport/browser/export_widget.pt
plone/Products/ZipFileTransport/browser/zipexport.py

2009/02/18(水)ploneへのパッチ

アクションボタンをすべてのページで表示する

アクションボタンの表示

plone/lib/python/plone/app/content/browser/foldercontents.py
201: if self.context.cb_dataValid():

201: if self.context.cb_dataValid() or 1:

importだけ表示 2009/02/27

ZipFileTransportに含まれるImportボタンです

Importボタンの表示

plone/lib/python/plone/app/content/browser/foldercontents.py
200:    if not len(self.items):
201:        if self.context.cb_dataValid():
202:            for button in button_actions:
203:                if button['id'] == 'paste':
204:                     return [self.setbuttonclass(button)]
205:        else:
206:            return []
↓
200:    if not len(self.items):
201:        if self.context.cb_dataValid():
202:            for button in button_actions:
203:                if button['id'] == 'paste' or button['id'] == 'import':
204:                    buttons.append(self.setbuttonclass(button))
205:            return buttons
206:        else:
207:            for button in button_actions:
208:                if button['id'] == 'import':
209:                    return [self.setbuttonclass(button)]
210:            return []

2009/02/18(水)ploneのキャッシュ

pyスクリプトをキャッシュしてる
pyc消してもダメ
メモリ上にキャッシュしてるか、他にファイルをおいてる

キャッシュするプロダクトの時間を短くすればいいのかもしれない*1

けど、面倒なのでファイルを書き換えた場合は(py書き換えた場合は)pyc消して、zope再起動したほうが早いし確実

*1 : /manage/のHTTPCCacheとかRAMCacheとかREsourceRegistryCacheあたり?

追記

ptはキャッシュしてないのでサーバ再起動は要らない...たぶん

2009/02/16(月)フォルダーコンテンツ

フォルダにあるファイル一覧を表示するビュー

plone(instanceのフォルダ)/lib/python/plone/app/content/browser/foldercontents.pt

カスタマイズ

/plone/manage_main にアクセス
portal_view_customizations
zope.interface.Interface > folder_contents
<div tal:replace="structure view/contents_table">

contents_tableの実装

plone(instanceのフォルダ)/lib/python/plone/app/content/browser/foldercontents.pyの27~?

テーブル本体は
plone(instanceのフォルダ)/lib/python/plone/app/content/browser/table.pt

このフォルダには~

plone(instanceのフォルダ)/lib/python/plone/app/content/browser/table.pt
18-23行目

コピー、カット、名前を変更など

plone(instanceのフォルダ)/lib/python/plone/app/content/browser/foldercontents.pyの193~?ちがうっぽい
plone(instanceのフォルダ)/lib/python/plone/app/content/browser/table.ptの183-
ここで、呼び出している使っているview/buttonsがどこか何か分からない
table.ptを開く前に定義済みなのかな?

あってた
plone(instanceのフォルダ)/lib/python/plone/app/content/browser/foldercontents.pyの201行目付近 self.context.cb_dataValid()でチェックしてるので、ここを常に真にしてしまえばよさげ*1

*1 : cb_dataValid() or 1

2009/01/22(木)Visual C# 2008

VC++は一通りかじってあるけど、.NETを使ってフォームアプリケーションを作ろうとするとさっぱり分かりません。
google先生で十分かと思ってたけど、適当なマニュアル本買ってきて読んだ方がいいかなぁ。

2008/12/09(火)自作ライブラリのメモ

ポップアップ

var popup = new CPopup();
    popup.append(項目名, イベント, オプション);
    popup.append(CPopup.Separator);
    popup.append(項目名, イベント, オプション);
    popup.show();

引数の例

  • イベント
    • {'click':clickentry}
  • オプション
    • {n:a[1], w:s._self}

イベントリスト

イベント名概要
click項目がクリックされたときに呼び出される. 返値をfalseにするとpopupを閉じない
close未実装。popupが閉じられる直前に呼び出される
closed未実装。popupが閉じられた直後に呼び出される

イベントメソッドの例

function clickentry(イベント, ポップアップ本体, 項目名, オプション){
}

2008/11/21(金)length プロパティ

配列の要素数ではなく,インデックスの最大値+1を指す.
そのため,

var a = new Array();
a[0] = 0; // length -> 1
a[1] = 1; // length -> 2
a[100] = 100; // length -> 101
a[2] = 2; // length -> 101

になる...

要素数を知りたい場合カウントするしかないの?

var count = 0;
for(var i in ary){ count++; }

2008/11/20(木)メソッド定義のマイルール

コンストラクタの定義

class = function(o){
}

プロトタイプで定義

ここに定義するのは,オブジェクト名付きで呼び出されるメソッド類.thisを信用することができるもの.class内部からしか呼び出さないものは_を付ける.(_付きのメソッドを外部から呼び出しても動作は保証しない)

class.prototype = {
  func1: function(){
  },
  _func2: function(){
  }
}

クラス名付きで定義

イベントなどにより呼び出されるメソッド類.thisを信用できない.必要ならば,引数に自分自身を指すオブジェクトを入れる.

class.func3 = function(){
}

2008/11/19(水)javascriptのpro...

と同じ罠にはまってしまった...
なにやってるんだか.

A = function(){}
A.prototype = {
  pos: {x:0, y:0}
}

a = new A();
b = new A();

a.pos.x = 10; a.pos.y = 20;
b.pos.x = 30; b.pos.y = 40;

a.pos.x; // -> 30;
a.pos.y; // -> 40;
b.pos.x; // -> 30;
b.pos.y; // -> 40;

正しくは↓の通り。

A = function(){
  this.pos = {x:0, y:0};
}
A.prototype = {
  pos: null
}

a = new A();
b = new A();

a.pos.x = 10; a.pos.y = 20;
b.pos.x = 30; b.pos.y = 40;

a.pos.x; // -> 10;
a.pos.y; // -> 20;
b.pos.x; // -> 30;
b.pos.y; // -> 40;

一度,以前作ったプログラムも見直した方がいいかもしれない