2. SQLEDITABLE ドキュメント¶
2.1. インフォメーション¶
- リポジトリ : https://github.com/hiho-/SQLEDITABLE
- バグ報告 : https://github.com/hiho-/SQLEDITABLE/issues
- デモ : SQLEDITABLE デモ
- ライセンス : LGPLv3
2.2. 謝辞¶
このソフトウェアーは、 editable-table:http://mindmup.github.io/editable-table/ のコードを使用しています。
2.3. SQLEDITABLE 基本的な使い方¶
最初に、SQLEDITABLEのプラグインファイルをリンクからダウンロードし、アプリケーションにセットします。
https://github.com/hiho-/SQLEDITABLE/releases
- web2py.plugin.sqleditable.w2p - プラグインファイル
- web2py.app.demo.w2p - デモアプリ
モデル(db.pyなど)もしくはコントローラ(default.pyなど)に、次の記述を追加します。
from plugin_sqleditable.editable import SQLEDITABLE
SQLEDITABLE.init()
後は、SQLFORM と同様に記述するだけです。
サンプルを示します。
モデル
db.define_table('employee_sheet', Field('employee_number','integer',length=5,label='Emp.no.'), Field('name','string',length=50,notnull=True), Field('date_employment','date',label='Enter',requires=IS_DATE()), Field('employee_section','string',label='Section', requires=IS_IN_SET({'s':'sales','p':'production','d':'development', 'c':'control'})), Field('employee_comment','string',label='Comment'), Field('date_resignation','date',label='Exit',readable=False, requires=IS_EMPTY_OR(IS_DATE())), Field('resigned','boolean', writable=False, default=False), Field('remuneration','decimal(12,2)', readable=False), Field('currency','string',readable=False, requires=IS_IN_SET(['USD','EUR','GBP','JPY'])))コントローラ
# coding: utf8 from plugin_sqleditable.editable import SQLEDITABLE SQLEDITABLE.init() def demo010(): response.title = 'demo010' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, showid=False, maxrow=5).process() return dict(editable=editable)
コントローラファイルの最初に、 SQLEDITABLE.init() を記述しています。
現在のところ、対応しているフィールドタイプは、interger , double , float , decimal, string , boolean , date , datetime , time です。 また、IS_IN_SET バリデータが記述されていると、リストボックスが表示されます。
2.4. SQLEDITABLEの特徴¶
SQLEDITABLEの特徴について説明します。
2.4.1. SQLFORMに似た記述法¶
process メソッドを利用できます。
def demo010(): response.title = 'demo010' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, showid=False, maxrow=5).process() return dict(editable=editable)keepvalues や onvalidation、detect_record_change など幾つかを除いた、processメソッドのパラメータは、SQLEDITABLEでも利用可能です。
例えば、Flashメッセージを書き換えます。
def demo015(): response.title = 'demo015' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, showid=False, maxrow=5).process( message_onsuccess='success', message_onfailure='error') return dict(editable=editable)なお、message_onchange は detect_record_change パラメータがないため、設定してもメッセージは表示されません。
accepts メソッドでも記述可能です。
def demo013(): response.title = 'demo013' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, showid=False, maxrow=5) if editable.accepts(request.vars, session): response.flash = T('editable accepted') elif editable.errors: response.flash = T('editable has errors') else: response.flash = T('please fill out the editable') return dict(editable=editable)accepted 属性も使用可能です。
def demo014(): response.title = 'demo014' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, showid=False, maxrow=5) if editable.process().accepted: response.flash = T('editable accepted') elif editable.errors: response.flash = T('editable has errors') else: response.flash = T('please fill out the editable') return dict(editable=editable)acceptsメソッドやaccepted属性では、処理に応じてロジックの記述が可能です。 しかし ajax 内の処理のため、リダイレクトは動作しません。リダイレクトは、 next パラメータを使用してください。
2.4.2. キー操作¶
SQLEDITABLEは、矢印キーでフォーカスのセル移動が可能です。また、TABキーでもフォーカスが移動します。
フォーカスがあるセルでは、直接値を入力するか、ENTERキーを押して入力モードに切り替えます。
入力後は再度、ENTERキーを押すと、セルにフォーカスが戻ります。
Selectボックスがあるセルでは、ENTERキーでフォーカスを移動し、矢印キーやSPACEキーで値を変更可能です。
vertical=False
の場合、ブラウザによって、Selectボックスのキー操作が動かない場合があります。カレンダーはキー操作では表示できません。クリックが必要です。
2.4.3. 2つのバリデート¶
SQLEDITABLEでは2種類のバリテートを実施しています。
Javascript バリデート
数値や桁数指定があるフィールドでは、javascriptバリデートが動きます。 条件に外れる入力値は入力を受け付けません。 javascriptバリデートが不要な場合は、
validate_js=False
を指定します。web2py バリデート
OKボタンを押した後に、ajax内で各フィールドのバリデートを行います。
2.4.4. 3つのハッシュ値¶
SQLEDITABLE では3種類のハッシュ値を使用し、DBの更新および、改ざん等の対策を行っています。
- インプット・ハッシュ
- 入力初期値のハッシュ値です。これは、入力を検知します。
- レコード・ハッシュ
- DBのレコードのハッシュ値です。これは、DBレコードの変更等を検知します。 レコード・ハッシュとDBレコードが合致しない場合、更新・削除は行われません。
- テーブル・ハッシュ
- レコードのキーとハッシュのハッシュ値です。これは、テーブルの改ざんを防ぎます。 テーブル・ハッシュ値はセッションに格納されます。 テーブル・ハッシュが一致しない場合、エラーが発生します。
2.5. クラス・メソッド説明¶
- class
editable.
SQLEDITABLE
¶SQLEDITABLEオブジェクトを生成します。
editable = SQLEDITABLE(db.employee_sheet, [1,2,3], showid=False, maxrow=5)
Parameters:
- table – Tableオブジェクト
- record – 表示するレコードidの指定(リスト,タプル,主キーが含まれたRowsオブジェクト)、主キーが複数の場合はリストのリストで指定、指定がない場合は全レコードが対象
- deletable – レコード削除チェックボックスの表示設定、デフォルト False
- header – ヘッダ情報の設定、デフォルト None、Noneの場合はTableオブジェクトから自動取得
- maxrow – 表示行数、デフォルト None、Noneの場合は該当するレコードを全て表示
- lineno – 行番号表示、デフォルト True
- showid – レコードのキー値の表示、デフォルト True
- editid – レコードのキー値の編集、デフォルト False
- validate_js – javascriptバリデート、デフォルト True
- oninit – 初期化時に呼び出す関数指定、デフォルト None
- touch_device – カレンダー・時刻選択にHTML5ウィジェット使用判定、デフォルト Auto、TrueはHTML5ウィジット使用、False使用しない、Auto自動判定
パラメータのサンプルを示します。
- record
フィルタに利用
def demo031(): def record(): rows = db(db.employee_sheet.resigned==True).select() return [row.id for row in rows] response.title = 'demo031' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, record=record).process() return dict(editable=editable)フィルタに利用 (Rowsオブジェクトで渡す)
def demo033(): def record(): rows = db(db.employee_sheet.resigned==True).select() return rows response.title = 'demo031' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, record=record).process() return dict(editable=editable)ソートに利用
def demo032(): def record(): rows = db(db.employee_sheet).select(orderby=db.employee_sheet.name) return [row.id for row in rows] response.title = 'demo032' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, record=record).process() return dict(editable=editable)主キーが複数の場合
db.define_table('scadule_sheet2', Field('scadule_date','date',label='date'), Field('scadule_time','time',label='time'), Field('term','integer'), Field('term_unit','string', requires=IS_IN_SET({'min':'minute','hr':'hour','d':'day','wk':'week', 'mo':'month'})), Field('detail','string',length=30,requires=IS_NOT_EMPTY()), primarykey=['scadule_date','scadule_time'])def demo080(): response.title = 'demo080' response.view = 'plugin_sqleditable/sample.html' record = [['2014-07-01','00:00:00'], ['2014-07-02','00:01:00']] editable = SQLEDITABLE(db.scadule_sheet2, record=record, editid=True, maxrow=8).process() return dict(editable=editable)- oninit
def demo016(): def oninit(editable): editable.table_class = 'table table-condensed' editable.ajax_button_value = T('Save') editable.lineno_label = T('Line') editable.deleteable_label = T('Delete') response.title = 'demo016' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, showid=False, maxrow=5, deletable=True, oninit=oninit).process() return dict(editable=editable)テーブルクラス、ajaxボタンのテキスト、ライン番号のラベル、削除フラグのラベル、を変更します。
def demo017(): def oninit(editable): editable.msg_process_dialog = T('please wait', lazy=False) response.title = 'demo017' response.view = 'plugin_sqleditable/sample.html' editable = SQLEDITABLE(db.employee_sheet, showid=False, maxrow=5, oninit=oninit).process() return dict(editable=editable)ダイアログメッセージを変更(ダイアログオブジェクトを指定すれば、ダイアログデザインの変更も可能)
SQLEDITABLE.
init
()¶SQLEDITABLEの環境定義を行います。スタティック・メソッドです。 アクションがコールされる前に、記述する必要があります。
from plugin_sqleditable.editable import SQLEDITABLE SQLEDITABLE.init()
SQLEDITABLE.
process
()¶
SQLEDITABLE.
accepts
()¶これらのメソッドでは、SQLFORMの殆どのパラメータ・属性を利用可能です。但し、以下のようにパラメータに例外があります。
- onvalidation (onsuccess, onfailure, onchange) - 使用できません。
- keepvalues - 使用できません。新規レコードは、モデルのデフォルト値が使用されます。
- dbio - 使用できません。
- detect_record_change - 使用できません。標準で、全てのレコード変更を感知します。
- next - 成功時リダイレクトする next は、processメソッドだけでなく accepts でも利用可能です。
SQLEDITABLE.
as_dict
()¶SQLEDITABLE オブジェクトを辞書として渡します。辞書データは、次のようになります。
- editable - テーブル
- button - ajaxボタン
- script - javascript
def demo040(): response.title = 'demo040' response.view = 'plugin_sqleditable/sample_as_dict.html' editable = SQLEDITABLE(db.employee_sheet, showid=False, maxrow=5).process() return editable.as_dict()