Last modified date : 2019/01/31

複数テキスト入力欄(textarea)をテーブルに変更し、値を JSON に変換して元の欄に保存します。

使い方

$('foo').MTAppJSONTable({
    inputType: 'input',
    caption: 'bit part menbers',
    header: {nickname: 'ニックネーム', firstname: '名', lastname: '姓', sex: '性別'},
    headerPosition: 'top',
    headerOrder: ['nickname','firstname','lastname','sex'],
    footer: true,
    edit: false,
    add: true,
    clear: false,
    debug: false
});

foo には MTAppJSONTable を適用させたい textarea のセレクタを設定します。
オプション設定は下記の通りです。

保存される JSON のサンプル

下図の場合に保存される JSON は、それぞれ下記のようになります。
※実際には1行になります。

{
  "items": [
    {
      "nickname": "tinybeans",
      "firstname": "Tomohiro",
      "lastname": "Okuwaki",
      "sex": "male"
    },
    {
      "nickname": "mersy",
      "firstname": "Masashi",
      "lastname": "Yanagiya",
      "sex": "female"
    },
    {
      "nickname": "bitpart",
      "firstname": "bit part",
      "lastname": "合同会社",
      "sex": "male"
    }
  ]
}

{
  "items": [
    {
      "platform": "Movable Type",
      "name": "MTAppjQuery",
      "rating": "★★★★★"
    },
    {
      "platform": "Sublime Text 2",
      "name": "MTML Completions",
      "rating": "★★★★"
    }
  ]
}

保存した値をテンプレートで取り出す方法

MTAppJSONTable を利用して保存した JSON の値をテンプレートで取り出す方法を紹介します。

MTAppJSONTable は headerPosition オプションで1行目が見出しの表組み(top)か1列目が見出しの表組み(left)かを指定できますが、その設定によってテンプレートの取り出し方も変わってきます。

なお、ここでは記事の概要欄(MTEntryExcerpt)で MTAppJSONTable を使っているとします。

MTAppJSONTable のJSON文字列をMTタグで扱えるハッシュに変換する

はじめに、MTAppJSONTable で保存されたJSON文字列をMTタグで扱える配列・ハッシュ変数に変換する必要があります。

MTAppjQuery にはJSON文字列を配列・ハッシュ変数に変換するには、下記のように MTAppjQuery によって拡張された json_decode モディファイを利用します。

<mt:EntryExcerpt convert_breaks="0" json_decode="1" setvar="json">

保存されたJSON文字列を余計な情報のないプレーンなテキストとして扱うために convert_breaks="0" を付けることがポイントです。これで JSON 文字列がMTタグで扱える配列・ハッシュに変換されます。

そして、MTAppJSONTable で利用される JSON のルートのキーは items となりますので、下記のようにして変数 items にセットします。

<mt:Var name="json" key="items" setvar="items">

この2行を最初に書いて置けば、その後は 配列 items の中に各 JSON 要素のハッシュが入っている入れ子状態の変数になります。

変換した JSON を構造的に出力して確認する

MTAppjQuery では、MTDumper というファンクションタグが提供されています。このタグを利用すれば、上記のように json_decode モディファイアで変換したJSONを構造的に出力して確認することができます。

<MTDumper name="json">

一つの値をピンポイントで取り出す

管理画面で下図のように値が保存されているとします。

この中から、一人目のニックネームを取り出したい場合は下記のようなコードになります。

<mt:Var name="items" index="0" setvar="person">
<p><mt:Var name="person" key="nickname"></p>

これで「tinbyeans」と出力されます。1番目の要素が index="0" となるのがポイントです。

headerPosition: 'top'(1行目が見出しの表組み)の場合

1行目が見出しの表組みを、管理画面の見た目と同じような表組みで出力するテンプレートは下記のようになります。

<mt:Ignore>theadとtfootに入れるtrをセット [start]</mt:Ignore>
<mt:SetVar name="order">
<mt:SetVar name="order" function="push" value="nickname">
<mt:SetVar name="order" function="push" value="firstname">
<mt:SetVar name="order" function="push" value="lastname">
<mt:SetVar name="header" key="nickname" value="ニックネーム">
<mt:SetVar name="header" key="firstname" value="姓">
<mt:SetVar name="header" key="lastname" value="名">
<mt:SetVarBlock name="header_tr">
<tr>
<mt:Loop name="order">
  <th class="<mt:Var name="__value__">"><mt:Var name="header" key="$__value__"></th>
</mt:Loop>
</tr>
</mt:SetVarBlock>
<mt:Ignore>theadとtfootに入れるtrをセット [ end ]</mt:Ignore>
<mt:Ignore>tbodyに入れるtrをセット [start]</mt:Ignore>
<mt:SetVarBlock name="tbody_tr">
<mt:SetVar name="items_index" value="0">
<mt:Loop name="items">
  <tr>
  <mt:Var name="items" index="$items_index" setvar="item">
  <mt:SetVar name="order_index" value="0">
  <mt:Loop name="order">
    <mt:Var name="__value__" setvar="key">
    <mt:Var name="order" index="$order_index" setvar="key">
    <td class="<mt:Var name="key">"><mt:Var name="item" key="$key"></td>
    <mt:SetVar name="order_index" op="++">
  </mt:Loop>
  </tr>
  <mt:SetVar name="items_index" op="++">
</mt:Loop>
</mt:SetVarBlock>
<mt:Ignore>tbodyに入れるtrをセット [ end ]</mt:Ignore>
<mt:Ignore>最後にtableを出力 [start]</mt:Ignore>
<table class="table table-striped" border="1">
  <thead>
    <mt:Var name="header_tr">
  </thead>
  <tfoot>
    <mt:Var name="header_tr">
  </tfoot>
  <tbody>
    <mt:Var name="tbody_tr">
  </tbody>
</table>
<mt:Ignore>最後にtableを出力 [ end ]</mt:Ignore>

headerPosition: 'left'(1列目が見出しの表組み)の場合

1列目が見出しの表組みを、管理画面の見た目と同じような表組みで出力するテンプレートは下記のようになります。

<mt:Ignore>見出し要素を出力するための変数をセット [start]</mt:Ignore>
<mt:SetVar name="order">
<mt:SetVar name="order" function="push" value="platform">
<mt:SetVar name="order" function="push" value="name">
<mt:SetVar name="order" function="push" value="rating">
<mt:SetVar name="header" key="platform" value="プラットフォーム">
<mt:SetVar name="header" key="name" value="製品名">
<mt:SetVar name="header" key="rating" value="評価">
<mt:Ignore>見出し要素を出力するための変数をセット [ end ]</mt:Ignore>
<mt:Ignore>tbodyに入れるtrをセット [start]</mt:Ignore>
<mt:SetVarBlock name="tbody_tr">
<mt:Loop name="order">
<mt:Var name="__value__" setvar="key">
<tr>
  <th class="<mt:Var name="key">"><mt:Var name="header" key="$key"></th>
  <mt:SetVar name="items_index" value="0">
  <mt:Loop name="items">
    <mt:Var name="items" index="$items_index" setvar="item">
    <td class="<mt:Var name="key">"><mt:Var name="item" key="$key"></td>
    <mt:SetVar name="items_index" op="++">
  </mt:Loop>
</tr>
</mt:Loop>
</mt:SetVarBlock>
<mt:Ignore>tbodyに入れるtrをセット [ end ]</mt:Ignore>
<mt:Ignore>最後にtableを出力 [start]</mt:Ignore>
<table class="table table-striped" border="1">
  <tbody>
    <mt:Var name="tbody_tr">
  </tbody>
</table>
<mt:Ignore>最後にtableを出力 [ end ]</mt:Ignore>

MTAppJSONTableSave カスタムイベント

例えば、

$('#jsontable').MTAppJSONTable({
  // 省略
});

というように設定していた場合、

$('#jsontable').trigger('MTAppJSONTableSave');

とすれば、任意のタイミングで JSONTable の保存処理(注1)を走らせることができます。

(注1)ここでいう保存処理とは、JSONTable の表の中の値を解析して JSON に加工し、MTAppJSONTable を適用した元のフィールド( textarea )にその JSON を入れることを指します。

オプション

$(foo).MTAppJSONTable({
    "inputType": "textarea",
    "caption": null,
    "header": null,
    "headerOrder": [],
    "headerPosition": "top",
    "footer": false,
    "edit": true,
    "add": false,
    "clear": true,
    "sortable": false,
    "cellMerge": false,
    "listingCheckbox": false,
    "listingCheckboxType": "checkbox",
    "listingTargetKey": null,
    "listingTargetEscape": false,
    "cbAfterBuild": null,
    "cbBeforeAdd": null,
    "cbAfterAdd": null,
    "cbAfterSelectRow": null,
    "cbAfterSelectColumn": null,
    "optionButtons": null,
    "itemsRootKey": "items",
    "nest": false,
    "debug": false
});

inputType v1.8.0

Type : String,Plane Object, Default : "textarea"

テーブル内の入力欄の種類を指定します。

textarea を指定した場合はすべての入力欄が複数行テキストに、 input を指定した場合はすべての入力欄が1行テキストになります。デフォルトは textarea です。

$('foo').MTAppJSONTable({
    inputType: 'input'
});

また、v1.8.0 からオブジェクトを指定して項目ごとに入力欄の種類を指定出来るようになりした。

例えば、ヘッダーの項目が optionsName、optionsType、optionsText の3つで、それぞれの入力欄の種類を、

  • optionsName : 1行テキスト
  • optionsType : 1行テキスト
  • optionsText : 複数行テキスト

としたい場合は、下記のように設定することができます。

$('#excerpt').MTAppJSONTable({
    "inputType": {
        "optionsName": "input",
        "optionsType": "input",
        "optionsText": "textarea"
    },
    "header": {
        "optionsName": "名前",
        "optionsType": "種類",
        "optionsText": "説明"
    },
    "headerOrder": [
        "optionsName",
        "optionsType",
        "optionsText"
    ]
});

caption

Type : String, Default : null

表組みのキャプションを指定することが出来ます。初期値はありません。

$('foo').MTAppJSONTable({
    caption: 'bit part members'
});

header 必須

Type : Plane Object, Default : null

テーブルのヘッダー th をオブジェクトで指定します。

$('foo').MTAppJSONTable({
    header: {
        nickname: 'ニックネーム',
        firstname: '名',
        lastname: '姓',
        sex: '性別'
    }
});

キーとラベルをセットで指定します。

ここで指定したキーが JSON のキーになり、ラベルがテーブルのヘッダーに表示されるテキストとなります。

headerOrder 必須

Type : Array, Default : []

header オプションで指定した key の並びを指定します。

$('foo').MTAppJSONTable({
    headerOrder: ['nickname','firstname','lastname','sex']
});

v1.8.0 以降は headerOrder の項目のうち、既に保存されている JSON にその項目がない場合(後から headerOrder を追加した場合など)は、JSON にその項目をマージするようになりました(その項目の値は空文字)。

headerPosition

Type : String, Default : "top"

1行目が見出しの表組みにする場合は top を、1列目が見出しの表組みにする場合は left を指定します。

つまり top を指定した場合は header オプションでセットしたヘッダーが表の上部に、 left を指定した場合は表の左側に表示されます。

edit

Type : Boolean, Default : true

false を指定すると編集不可な普通の表組みとして表示されます。

add

Type : Boolean, Default : false

true を指定するとユーザーが行または列を追加できるようになります。

clear

Type : Boolean, Default : true

デフォルトではチェックボックスで選択した行または列を削除ボタンで削除できますが、falseを指定すると削除できなくなります。

sortable v1.7.0

Type : Boolean, Default : false

true を指定すると headerPosition: "top" のときに限り表の行をドラッグアンドドロップで並べ替えることができます。

cellMerge v1.7.0

Type : Boolean, Default : false

true を指定するとセルを結合することができるようになります。

listingCheckbox v1.7.0

Type : Boolean, Default : false

true を設定すると、テーブルの最初の行または列にチェックボックスを表示します。

clear: true が設定されている場合(初期値)は、強制的に listingCheckbox: true となります。

listingCheckboxType v1.7.0

Type : Boolean, Default : "checkbox"

"radio" を設定すると listingCheckbox: true のときに表の1列目または1行目に表示されるチェックボックスがラジオボタンになります。

listingTargetKey v1.7.0

Type : String, Default : null

MTAppListing で内部的に利用しています。
このオプションにセットしたキーの値が、MTAppListing で保存される値となります。

listingTargetEscape v1.7.0

Type : Boolean, Default : false

MTAppListing で内部的に利用しています。
true を設定すると listingTargetKey で設定したキーのセルの値がURLエンコードされます。
headerPosition: 'top' の場合のみ有効です。

cbAfterBuild v1.7.0

Type : Function, Default : null

テーブルを構築し終わったときに呼ばれる関数を設定します。
このオプションに設定した関数には下記の2つの引数が渡されます。

function(cb, $container){
  // do something
}
  • cb : {name: 'cbAfterBuild'}
  • $container : table を包含する div の jQuery オブジェクト

cbBeforeAdd v1.7.0

Type : Function, Default : null

列を追加する直前に呼ばれる関数を設定します。 headerPosition: "left" の場合のみ有効です。
このオプションに設定した関数には下記の2つの引数が渡されます。

function(cb, $td){
  // do something
}
  • cb : {name: 'cbBeforeAdd', type: 'column'}
  • $td : 追加された列の td の jQuery オブジェクト。列の上の td から順にこの関数が実行されます。

cbAfterAdd v1.7.0

Type : Function, Default : null

行または列を追加した後に呼ばれる関数を設定します。
このオプションに設定した関数には下記の2つの引数が渡されます。

function(cb, $container){
  // do something
}
  • cb : {name: 'cbAfterAdd', type: 'row or column'} コールバックオブジェクトの type の値は、行を追加した場合は row 、列を追加した場合は column です。
  • $container : table を包含する div の jQuery オブジェクト

cbAfterSelectRow v1.7.0

Type : Function, Default : null

チェックボックス等で行を選択した後に呼ばれる関数を設定します。
このオプションに設定した関数には下記の3つの引数が渡されます。

function(cb, $tr, checked){
  // do something
}
  • cb : {name: 'cbAfterSelectRow'}
  • $tr : 選択した行の tr の jQuery オブジェクト
  • checked : 選択したチェックボックス等のチェック状態の真偽値

cbAfterSelectColumn v1.7.0

Type : Function, Default : null

チェックボックス等で列を選択した後に呼ばれる関数を設定します。
このオプションに設定した関数には下記の3つの引数が渡されます。

function(cb, $td, checked){
  // do something
}
  • cb : {name: 'cbAfterSelectColumn'}
  • $td : 選択した列の td の集合の jQuery オブジェクト
  • checked : 選択したチェックボックス等のチェック状態の真偽値

optionButtons v1.7.0

Type : Array, Default : null

「行を追加」や「削除」ボタンの横に独自のボタンを追加することができます。
1つのボタンに対して1つのプレーンオブジェクトとし、それを配列にして設定ます。オブジェクトに指定する各項目は下記の通りです。

[
  {
    classname: "action1", // ボタンに振られるクラス名
    text: "button action 1" // ボタンのテキスト
  },
  {
    classname: "action2",
    text: "button action 2"
  }
]

itemsRootKey v1.7.0

Type : String, Default : "items"

JSON のルートキーを変更することができます。デフォルトでは items です。

nest v1.10.0

Type : Boolean, Default : false

MTAppJSONTable の表の入力欄に JSON が入っているとき、通常であればその JSON はそのまま文字列として出力されますが、 nest: true オプションを設定することで、文字列の JSON を展開し、親の JSON の値の一部として扱えるようになります。

debug v1.8.0

Type : Boolean, Default : false

true を指定すると元の複数行テキストの入力欄が表示されます。開発中に保存される JSON を確認するときに便利です。

$('foo').MTAppJSONTable({
    debug: true
});

v1.8.0 より debug: true が設定されている場合は「JSONを表示」ボタンが表示され、そのボタンをクリックすることで元の複数行テキストの入力欄が表示されるようになりました。

また v1.8.0 以降は、元の複数行テキストの入力欄が表示されているときは、テーブル内の値は無視され、その元の複数行テキストの入力欄に書かれている JSON 文字列が優先されそのまま保存されます。

つまり、MTAppJSONTable を適用した他の入力欄から JSON 文字列をコピー&ペーストして一旦保存すれば、テーブルの複製ができますし、入力欄を空にして保存すれば、テーブルの内容を一括削除できます。