PowerCMS™

PowerCMS ブログ

ホーム > PowerCMS ブログ > PowerCMS 4.1 で対応した DataAPI 関連機能について

2015年04月10日

PowerCMS 4.1 で対応した DataAPI 関連機能について

先日リリースした PowerCMS 4.1 は、いくつかのオブジェクトで DataAPI に対応しました。

本記事ではそれらの詳細や使い方をご紹介します。

カスタムオブジェクト

PowerCMS では任意のカスタムオブジェクトを作成する機能がありますが、DataAPI で、カスタムオブジェクトの作成、取得、更新、削除ができるようになりました。

エンドポイント

カスタムオブジェクトのエンドポイントの一覧です。

それぞれのエンドポイントについて、DataAPI の JavaScript SDK (Node.js)を使ったサンプルコードを掲載しています。

DataAPI の JavaScript SDK のインストールや使い方については、下記の公式ドキュメントをご参照ください。

カスタムオブジェクトの作成

HTTP メソッド POST
ルート /sites/:site_id/customobjects
パラメータ
  • class(カスタムオブジェクトのクラス名)
  • customobject(カスタムオブジェクトの JSON オブジェクト)
    • name(カスタムオブジェクトの名前)
    • body(カスタムオブジェクトの本文)
    • keywords(カスタムオブジェクトのキーワード)
    • authored_on(カスタムオブジェクトの公開日)
    • period_on(カスタムオブジェクトの掲載終了日)
    • set_period(カスタムオブジェクトの掲載終了フラグ)
    • category_id(カスタムオブジェクトのフォルダID)
    • basename(カスタムオブジェクトのベースネーム)
    • status(カスタムオブジェクトのステータス)
    • tags(カスタムオブジェクトのタグ)
    • customFields(カスタムオブジェクトのカスタムフィールド
認証 必須

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var param = {
    "class": "customobject",
    customobject: {
        name: "カスタムオブジェクトA",
        body: "

カスタムオブジェクトの本文

", keywords: "customobject,sample", authored_on: "20150401090000", period_on: "20160401090000", set_period: 1, category_id: 1, basename: "customobject_a", status: "PUBLISHED", tags: ["tag1"], customFields: [{ basename: "cf_customobject_text", value: "カスタムフィールドの値" }] } }; api.authenticate(credential, function(response) { if (! response.error) { api.createCustomobject(1, param, function(response) { console.log(response); }); } });

カスタムオブジェクト一覧の取得

HTTP メソッド GET
ルート /sites/:site_id/customobjects
パラメータ
  • class(カスタムオブジェクトのクラス名)
  • sortBy(ソートするフィールド)
  • sortOrder(ソート順)
  • limit(カスタムオブジェクトの取得数)
  • offset(オフセット値)
  • status(カスタムオブジェクトのステータス)
  • search(検索文字列)
  • searchFields(検索対象)
  • folder(フィルタするフォルダベースネーム)
  • group(フィルタするグループ名)
  • group_id(フィルタするグループ ID)
認証 省略可(省略した場合、取得できる情報に一部制限)

認証しない場合、公開以外のステータスのカスタムオブジェクトは取得できません。

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var param = {
    "class": "customobject",
    sortBy: "name",
    sortOrder: "ascend",
    limit: 10,
    offset: 0,
    status: "PUBLISHED",
    search: "カスタム",
    searchFields: "name",
    folder: 1,
    group: "カスタムオブジェクトグループA",
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.listCustomobjects(1, param, function(response) {
            console.log(response);
        });
    }
});

カスタムオブジェクトの取得

HTTP メソッド GET
ルート /sites/:site_id/customobjects/:customobject_id
パラメータ なし
認証 省略可(省略した場合、取得できる情報に一部制限)

認証しない場合、公開以外のステータスのカスタムオブジェクトは取得できません。

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.getCustomobject(1, 1, function(response) {
            console.log(response);
        });
    }
});

カスタムオブジェクトの更新

HTTP メソッド PUT
ルート /sites/:site_id/customobjects/:customobject_id
パラメータ
  • class(カスタムオブジェクトのクラス名)
  • customobject(カスタムオブジェクトの JSON オブジェクト)
    • name(カスタムオブジェクトの名前)
    • body(カスタムオブジェクトの本文)
    • keywords(カスタムオブジェクトのキーワード)
    • authored_on(カスタムオブジェクトの公開日)
    • period_on(カスタムオブジェクトの掲載終了日)
    • set_period(カスタムオブジェクトの掲載終了フラグ)
    • category_id(カスタムオブジェクトのフォルダID)
    • basename(カスタムオブジェクトのベースネーム)
    • status(カスタムオブジェクトのステータス)
    • tags(カスタムオブジェクトのタグ)
    • customFields(カスタムオブジェクトのカスタムフィールド)
認証 必須

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var param = {
    "class": "customobject",
    customobject: {
        name: "カスタムオブジェクトA",
        body: "

カスタムオブジェクトの本文

", keywords: "customobject,sample", authored_on: "20150401090000", period_on: "20160401090000", set_period: 1, category_id: 1, basename: "customobject_a", status: "PUBLISHED", tags: ["tag1"], customFields: [{ basename: "cf_customobject_text", value: "カスタムフィールドの値" }] } }; api.authenticate(credential, function(response) { if (! response.error) { api.updateCustomobject(1, 1, param, function(response) { console.log(response); }); } });

カスタムオブジェクトの削除

HTTP メソッド DELETE
ルート /sites/:site_id/customobjects/:customobject_id
パラメータ class(カスタムオブジェクトのクラス名)
認証 必須

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.deleteCustomobject(1, 1, { 'class': 'customobject' }, function(response) {
            console.log(response);
        });
    }
});

バナー(旧キャンペーン)

DataAPI で、バナーの作成、取得、更新、削除ができるようになりました。

エンドポイント

バナーのエンドポイントの一覧です。

バナーの作成

HTTP メソッド POST
ルート /sites/:site_id/campaigns
パラメータ
  • campaign(バナーの JSON オブジェクト)
    • title(バナーのタイトル)
    • text(バナーの本文)
    • memo(バナーのメモ)
    • publishing_on(バナーの掲載開始日時)
    • period_on(バナーの掲載終了日時)
    • created_on(バナーの作成日)
    • modified_on(バナーの更新日)
    • banner_width(バナーの表示サイズの幅)
    • banner_height(バナーの表示サイズの高さ)
    • status(バナーのステータス)
    • tags(バナーのタグ)
    • customFields(バナーのカスタムフィールド)
  • image(バナーの画像)
  • movie(バナーのムービー)
認証 必須

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var fs = require("fs");

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var param = {
    campaign: {
        title: "バナーA",
        text: "

バナーAのテキスト

", memo: "バナーAのメモ", publishing_on: "20150401090000", period_on: "20160401090000", created_on: "20150401090000", modified_on: "20150401090000", banner_width: 300, banner_height: 300, status: "PUBLISHED", tags: ["tag1"], customFields: [{ basename: "cf_banner_text", value: "バナーのカスタムフィールドの値" }] }, image: fs.createReadStream('/path/to/image.jpg'), movie: fs.createReadStream('/path/to/movie.mp4') }; api.authenticate(credential, function(response) { if (! response.error) { api.createCampaign(1, param, function(response) { console.log(response); }); } });

バナー一覧の取得

HTTP メソッド GET
ルート /sites/:site_id/campaigns
パラメータ
  • sortBy(ソートするフィールド)
  • sortOrder(ソート順)
  • limit(バナーの取得数)
  • offset(オフセット値)
  • status(バナーのステータス)
  • search(検索文字列)
  • searchFields(検索対象)
  • active(掲載期間かどうかのフラグ)
  • group(フィルタするグループ名)
  • group_id(フィルタするグループ ID)
認証 省略可(省略した場合、取得できる情報に一部制限)

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var param = {
    sortBy: "name",
    sortOrder: "ascend",
    limit: 10,
    offset: 0,
    status: "PUBLISHED",
    search: "バナー",
    searchFields: "name",
    active: 1,
    group: "バナーグループA",
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.listCampaigns(1, param, function(response) {
            console.log(response);
        });
    }
});

バナーの取得

HTTP メソッド GET
ルート /sites/:site_id/campaigns/:campaign_id
パラメータ なし
認証 省略可(省略した場合、取得できる情報に一部制限)

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.getCampaign(1, 1, function(response) {
            console.log(response);
        });
    }
});

バナーの更新

HTTP メソッド PUT
ルート /sites/:site_id/campaigns/:campaign_id
パラメータ
  • campaign(バナーの JSON オブジェクト)
    • title(バナーのタイトル)
    • text(バナーの本文)
    • memo(バナーのメモ)
    • publishing_on(バナーの掲載開始日時)
    • period_on(バナーの掲載終了日時)
    • created_on(バナーの作成日)
    • modified_on(バナーの更新日)
    • banner_width(バナーの表示サイズの幅)
    • banner_height(バナーの表示サイズの高さ)
    • status(バナーのステータス)
    • tags(バナーのタグ)
    • customFields(バナーのカスタムフィールド)
  • image(バナーの画像)
  • movie(バナーのムービー)
認証 必須

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var param = {
    campaign: {
        title: "バナーA",
        text: "

バナーAのテキスト

", memo: "バナーAのメモ", publishing_on: "20150401090000", period_on: "20160401090000", created_on: "20150401090000", modified_on: "20150401090000", banner_width: 300, banner_height: 300, status: "PUBLISHED", tags: ["tag1"], customFields: [{ basename: "cf_banner_text", value: "バナーのカスタムフィールドの値" }] }, image: fs.createReadStream('/path/to/image.jpg'), movie: fs.createReadStream('/path/to/movie.mp4') }; api.authenticate(credential, function(response) { if (! response.error) { api.updateCampaign(1, 1, param, function(response) { console.log(response); }); } });

バナーの削除

HTTP メソッド DELETE
ルート /sites/:site_id/campaigns/:campaign_id
パラメータ なし
認証 必須

サンプルコード(Node.js)

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.deleteCampaign(1, 1, function(response) {
            console.log(response);
        });
    }
});

既存のオブジェクト

Movable Type 単体で、DataAPI は、様々なオブジェクト(記事、アイテム、テンプレート等)の作成、取得、更新、削除にそれぞれ対応していますが、PowerCMS 4.1 からは、PowerCMS で拡張したカラムも取得・更新可能になっています。

記事・ウェブページ

追加されたフィールド

フィールド名 用途 提供元
unpublished 非公開設定かどうかのフラグが格納されるフィールドです(ウェブページでは未実装) EntryUnpublish
pcms_unpublished_on 非公開日時が格納されるフィールドです(ウェブページでは未実装) EntryUnpublish
approver_ids ワークフローに関わったユーザーのIDが格納されるフィールドです EntryWorkflow
creator_id 記事の作成者のユーザー ID が格納されるフィールドです(ワークフロー機能は所有者を差し替えながらワークフローを回すため、最初に作成したユーザーIDはここに格納されます) EntryWorkflow
template_module_id ひな形のテンプレートモジュール ID が格納されるフィールドです TemplateSelector
prefs ひな形の表示オプション(編集画面に表示するフィールド、および、順序)が格納されるフィールドです TemplateSelector

サンプルコード1(Node.js)

EntryUnpublish の DataAPI の追加機能で、指定した記事(ID:25 と仮定)を日時指定非公開を設定する例です。

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var entry_id = 25;

var param = {
    unpublished: 1,
    pcms_unpublished_on: "20160401090000"
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.updateEntry(1, entry_id, param, function(response) {
            console.log(response);
        });
    }
});

サンプルコード2(Node.js)

TemplateSelector の DataAPI の追加機能で、指定したひな形(ID:30 と仮定)の表示オプションを変更(カスタムフィールドの順序を a, b, c から c, b, a に更新すると仮定。a, b, c はそれぞれカスタムフィールドのベースネーム)する例です。

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var entry_id = 30;

var param = {
    prefs: "title,text,tags,customfield_c,customfield_b,customfield_a,category,feedback,assets"
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.updateEntry(1, entry_id, param, function(response) {
            console.log(response);
        });
    }
});

サンプルコード3(Node.js)

TemplateSelector の DataAPI の追加機能で、記事の作成時にひな形(ひな形のテンプレートモジュールの ID が 40 と仮定)を指定して、下書き保存する例です。

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var param = {
    title: "新しい記事",
    body: "

新しい記事です。

", status: "Draft", template_module_id: 40 }; api.authenticate(credential, function(response) { if (! response.error) { api.createEntry(1, param, function(response) { console.log(response); }); } });

テンプレート

追加されたフィールド

フィールド名 用途 提供元
shift_jis テンプレートを再構築する際に、文字コードを Shift_JIS で出力するかどうかのフラグが格納されるフィールドです KeitaiLib
pager テンプレートを再構築する際に、ページ分割するかどうかのフラグが格納されるフィールドです Pager

サンプルコード3(Node.js)

KeitaiLib および、Pager の DataAPI の追加機能で、既存のインデックステンプレート(ID: 123 と仮定)を Shift_JIS に変更し、ページ分割オプションを指定する例です。

var MT = {
    DataAPI: require("mt-data-api-sdk")
};

var api = new MT.DataAPI({
    baseUrl:  "http://example.com/mt/mt-data-api.cgi",
    clientId: "node"
});

var credential = {
    username: "USER_NAME",
    password: "PASSWORD",
    remember: true
};

var template_id = 123;

var param = {
    shift_jis: 1,
    pager: 1
};

api.authenticate(credential, function(response) {
    if (! response.error) {
        api.createEntry(1, template_id, param, function(response) {
            console.log(response);
        });
    }
});

その他

DataAPI を利用することで、PowerCMS を管理画面経由で操作する場合との挙動の違いがなくなるように、各種処理の調整をしました。

例えば、DataAPI でテンプレートを削除した際に、ページ分割機能(Pager)で生成したページも合わせて削除するようにする処理や、DataAPI で記事を追加した際に、記事本文に含まれる画像ファイル等を自動でアイテムに保存する処理(SidebarAssets)など、管理画面経由の操作で透過的に実施される処理を DataAPI 経由の操作でも実施するような改修が含まれています。

PowerCMS 4.1 にて是非 DataAPI をご活用ください。


カテゴリー
PowerCMS 4
技術情報

Recent Entries