2. SQLEDITABLE ドキュメント

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の更新および、改ざん等の対策を行っています。

  1. インプット・ハッシュ

    入力初期値のハッシュ値です。これは、入力を検知します。

  2. レコード・ハッシュ

    DBのレコードのハッシュ値です。これは、DBレコードの変更等を検知します。 レコード・ハッシュとDBレコードが合致しない場合、更新・削除は行われません。

  3. テーブル・ハッシュ

    レコードのキーとハッシュのハッシュ値です。これは、テーブルの改ざんを防ぎます。 テーブル・ハッシュ値はセッションに格納されます。 テーブル・ハッシュが一致しない場合、エラーが発生します。

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()