フィールドの値の内部表現
フリーレイアウト型のコンテンツフィールドの値は、内部的には以下のようなJSON文字列として保存しています(実際には不要な改行やスペースを詰めて保存します)。
フィールドの組み合わせ(またはユニット)の1件分のデータを、1つのオブジェクトとして扱います。
そして、フィールドの組み合わせ(またはユニット)の複数回の繰り返しを、配列として扱います。
フリーレイアウト型のコンテンツフィールドの内部形式
[
{ "フィールド名":"値", "フィールド名":"値", ・・・, "フィールド名":"値", "flcf_row_is_null":XXX },
{ "フィールド名":"値", "フィールド名":"値", ・・・, "フィールド名":"値" "flcf_row_is_null"::XXX },
・・・
{ "フィールド名":"値", "フィールド名":"値", ・・・, "フィールド名":"値" "flcf_row_is_null"::XXX }
]
「flcf_row_is_null」は、1件分のフィールドの組み合わせ(またはユニット)が、空であるかどうかを表すフラグで、プラグインの内部処理によって追加されます。空ならこの値は1になり、空でなければ「""」(空文字列)になります。
例えば、あるフリーレイアウト型のコンテンツフィールドがあり、その中に「txt1」と「txt2」の2つのテキスト型のフィールドを作ったとします。そして、このフィールドの組み合わせを2回作り、以下のようにデータを保存したとします。
フィールドのデータの例
txt1フィールド | txt2フィールド |
こんにちは | 山田 |
さようなら | 田中 |
この場合、このコンテンツフィールドの値の内部形式は、以下のようになります。
上記の表に対応するコンテンツフィールドの値の内部形式
[
{ "txt1":"こんにちは", "txt2":"山田", "flcf_row_is_null": "" },
{ "txt1":"さようなら", "txt2":"田中", "flcf_row_is_null": "" }
]
ユニットを使う場合も、同様の形でJSON文字列で保存しています。ユニット名は、内部的には「flcf_unit_name」というフィールドに保存しています。
例えば、以下のような状況でデータを保存したとします。
- フリーレイアウト型のコンテンツフィールドがあり、その中に「txt1」と「txt2」の2つのテキスト型のフィールドがある
- 「unit1」と「unit2」の2種類のユニットを定義していて、「unit1」ユニットでは「txt1」フィールドに値を入力し、「unit2」ユニットでは「txt2」フィールドに値を入力する
- ユニットを2つ作り、以下の表のように値を入力した
ユニット | txt1フィールド | txt2フィールド |
unit1 | こんにちは | 入力なし |
unit2 | 入力なし | 田中 |
この場合、このコンテンツフィールドの値の内部形式は、以下のようになります。
上記の表に対応するコンテンツフィールドの値の内部形式
[
{ "flcf_unit_name":"unit1", "txt1":"こんにちは", "txt2":"", "flcf_row_is_null": "" },
{ "flcf_unit_name":"unit2", "txt1":"", "txt2":"田中", "flcf_row_is_null": "" }
]
Data APIでの読み込み
フリーレイアウト型のコンテンツフィールドに入力した値を、Data APIで扱うこともできます。
前述したように、フリーレイアウト型のコンテンツフィールドの値は、JSON文字列として保存されます。Data APIでコンテンツデータを読み込んだときにも、フリーレイアウト型のコンテンツフィールドの値は、JSON文字列で読み込まれます。
各プログラム言語からData APIでコンテンツにアクセスした後、言語ごとのJSON系の関数を使って、その言語に応じたデータ構造に変換することができます。
たとえば、JavaScriptのData APIライブラリを使い、Data APIのオブジェクトを変数apiに割り当ててあるものとします。
この状況で以下のコードを実行すると、「各コンテンツに対する処理」の中では、「cd.flcf['コンテンツフィールド名']」で、個々のフリーレイアウト型のコンテンツフィールドに保存されている値にアクセスすることができます。
例えば、「テキスト」というフリーレイアウト型のコンテンツフィールドに、「txt1」というフィールドがあるとします。この場合、「cd.flcf['テキスト][番号].txt1」で、txt1フィールドに代入した個々の値にアクセスできます(番号は0~件数-1の数値)。
Data APIでコンテンツを読み込んで処理する例
api.listContentData(サイトID, コンテンツタイプID, function(response) {
var cds = response.items;
for (var c1 = 0, cl1 = cds.length; c1 < cl1; c1++) {
var cd = cds[c1];
cd.flcf = {};
for (var c2 = 0, cl2 = cd.data.length; c2 < cl2; c2++) {
if (cd.data[c2].type == 'flcf') {
cd.flcf[cd.data[c2].label] = jQuery.parseJSON(cd.data[c2].data);
}
}
各コンテンツに対する処理
}
});
Data APIでの保存
Data APIでは、コンテンツデータを保存することもできます。その際に、フリーレイアウト型のコンテンツフィールドの値を保存することもできます。読み込みの場合と逆に、保存したいデータ構造をJSON文字列に変換して、対象のコンテンツフィールドの値として代入しておくようにします。
たとえば、以下のような状況だとします。
- あるコンテンツタイプに、「txt1」と「txt2」のフィールドがあるフリーレイアウト型のコンテンツフィールドを追加した。
- JavaScriptのData APIライブラリを使い、Data APIのオブジェクトを変数apiに割り当てた。
- Data APIからMovable Typeにログインする処理はすでに終わっている。
この状況で、コンテンツデータを新規作成して、このコンテンツフィールドに以下の表の値を保存したいとします。
コンテンツフィールドに保存する値
txt1フィールド | txt2フィールド |
こんにちは | 山田 |
さようなら | 田中 |
この処理は以下のように書くことができます。コンテンツデータ(変数cd)を作成する際に、「data」というプロパティを作り、そこに「id」と「data」というプロパティの組を持つオブジェクトを作ります。この「data」プロパティに、フリーレイアウト型に保存するJSONを代入します。
なお、JSONを作る際に「jQuery.toJSON」という関数を使っています。この関数は、「jQuery JSON Plugin」というjQueryのプラグインで提供されています。Movable Typeの「mt-static」→「jquery」ディレクトリにある「jquery.json.js」を組み込むことで、この関数を使うことができます。
Data APIでコンテンツを作成する例
var cd = {
label: 'データ識別ラベル',
data: [
{
id: コンテンツフィールドID,
data: jQuery.toJSON(
[
{ txt1: 'こんにちは', txt2: '山田' },
{ txt1: 'さようなら', txt2: '田中' }
]
)
}
]
};
api.createContentData(サイトID, コンテンツタイプID, cd, function(response) {
コンテンツデータの保存が終わった後の処理
});