FreeLayoutContentField

対応バージョン:MovableType7

フィールドの値の内部表現

更新日:2024.02.07

フリーレイアウト型のコンテンツフィールドの値は、内部的には以下のような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) {
  コンテンツデータの保存が終わった後の処理
});
前へ
プラグインTOP