コンテンツにスキップ

$p.apiCreateSite

概要

AjaxのPOSTリクエストにより、サイトを作成します。

構文

JavaScript
$p.apiCreateSite({
    id: (親サイトID),
    data: {
        (作成するサイト情報)
    },
    done: (任意の処理),
    fail: (任意の処理),
    always: (任意の処理)
});

各パラメータの説明

パラメータ名 説明 必須
id 作成するサイトの親サイトIDを指定します。"0"を指定した場合はサイトトップに作成されます。 ○
data 作成するサイト情報データを指定します。 ※欄外補足参照 -
done API通信成功時の処理を記述します。 ○
fail API通信失敗時の処理を記述します。 -
always 完了時の処理を記述します。 -

※サイト情報データは、サイトパッケージをエクスポートした際の"Site”パラメータと同等の値を設定する必要があります。$p.apiGetSiteでサイト情報を取得したのち、任意の項目を変更してリクエストデータを作成するような処理を想定します。

使用例

通常の作成

実行ユーザを作成者としてアクセス権を付与します。

$p.apiCreateSite({
    id: 123,
    data: {
        ApiVersion: 1.1,
        TenantId: 1,
        Title: 'サイト名',
        ReferenceType: 'Issues',
        ParentId: 99999,
        InheritPermission: 99999,
        SiteSettings: {
            Version: 1.017,
            ReferenceType: 'Issues',
            GridColumns: [
                'IssueId',
                'TitleBody',
                'Comments',
                'StartTime',
                'CompletionTime',
                'WorkValue',
                'ProgressRate',
                'RemainingWorkValue',
                'Status',
                'Manager',
                'Owner',
                'Updator',
                'UpdatedTime'
            ],
            EditorColumnHash: {
                General: [
                    'IssueId',
                    'Ver',
                    'Title',
                    'Body',
                    'StartTime',
                    'CompletionTime',
                    'WorkValue',
                    'ProgressRate',
                    'RemainingWorkValue',
                    'Status',
                    'Manager',
                    'Owner',
                    'Comments'
                ]
            }
        }
    },
    done: function (data) {
        //任意の処理
    },
    fail: function (data) {
        //任意の処理
    },
    always: function (data) {
        //任意の処理
    }
});

アクセス権の設定を操作したい場合

サイト作成APIでは実行ユーザを作成者としてアクセス権が付与されますが、パラメータ "DisableSiteCreatorPermission" を true に指定することで作成者のアクセス権を無効化することが可能です。
また、パラメータ "Permissions" を指定することで任意のユーザに対してアクセス権を付与することが可能です。

下記の例では、分類A(ユーザの選択肢を設定)が有効化された編集画面で実行されることを前提として、作成者のアクセス権を無効化し、対象ユーザIDに管理者権限(511)を付与しています。
指定可能なアクセス権の数値は、下記ソースコードの「enum Types」に記載されている数値の論理和となります。
https://github.com/Implem/Implem.Pleasanter/blob/master/Implem.Pleasanter/Libraries/Security/Permissions.cs

JavaScript
// アクセス権の設定対象ユーザIDを取得する
var targetUserId = $p.getControl('ClassA').attr("data-value");
$p.apiCreateSite({
    id: 123,
    data: {
        ApiVersion: 1.1,
        TenantId: 1,
        Title: 'サイト名',
        ReferenceType: 'Issues',
        ParentId: 99999,
        InheritPermission: 99999,
        DisableSiteCreatorPermission: true,
        Permissions: [
            'User,' + targetUserId + ',511'
        ],
        SiteSettings: {
            Version: 1.017,
            ReferenceType: 'Issues',
            GridColumns: [
                'IssueId',
                'TitleBody',
                'Comments',
                'StartTime',
                'CompletionTime',
                'WorkValue',
                'ProgressRate',
                'RemainingWorkValue',
                'Status',
                'Manager',
                'Owner',
                'Updator',
                'UpdatedTime'
            ],
            EditorColumnHash: {
                General: [
                    'IssueId',
                    'Ver',
                    'Title',
                    'Body',
                    'StartTime',
                    'CompletionTime',
                    'WorkValue',
                    'ProgressRate',
                    'RemainingWorkValue',
                    'Status',
                    'Manager',
                    'Owner',
                    'Comments'
                ]
            }
        }
    },
    done: function (data) {
        //任意の処理
    },
    fail: function (data) {
        //任意の処理
    },
    always: function (data) {
        //任意の処理
    }
});

Wikiを作成する場合

JavaScript
$p.apiCreateSite({
    id: 123,
    data: {
        ApiVersion: 1.1,
        Title: "Wiki名",
        ReferenceType: "Wikis",
        ParentId: 1,
        InheritPermission: 1,
        SiteSettings: {
            Version: 1.017,
            ReferenceType: "Wikis",
            NoDisplayIfReadOnly: false
        }
    },
    done: function (data) {
        //任意の処理
    },
    fail: function (data) {
        //任意の処理
    },
    always: function (data) {
        //任意の処理
    }
});

サンプルコード

Note

コード内の【 ... 】は適宜修正してください。

1. 案件ごとのサイトを、決まった名前とアクセス権で作る

案件管理の編集画面で、プロセス「案件サイト作成」のボタンを押したとき、$p.apiCreateSiteで、「案件コード_案件名」の名前のサイトを作ります。ボタンを押した人には権限を付けず、案件担当者に書き込み、承認者に読取専用の権限を付けます。作成したサイトのIDは「案件サイトID」に入れて保存します。

実務での使いどころ

案件ごとにサイトを用意する運用で、作成を利用者に任せると、名前の付け方がそろわず、作成した人に管理者の権限が残ります。画面からのサイトの作成では、名前をレコードの値から決めることも、作成した人以外の決まった相手に権限を付けることもできません。ボタンから作るようにすれば、名前と権限がそろい、どの案件のサイトかも「案件サイトID」でたどれます。

事前準備

1:案件サイトを作るフォルダを作成してください。ボタンを押す人が、このフォルダの中にサイトを作れる権限を持っている必要があります。

2:「案件管理」テーブル(期限付きテーブル)で、以下の項目を設定してください。

項目コード 内容
タイトル(Title) 案件名
分類A(ClassA) 案件コード
分類B(ClassB) 案件担当者。選択肢一覧に[[Users]]を設定
分類C(ClassC) 承認者。選択肢一覧に[[Users]]を設定
分類D(ClassD) 案件サイトID。スクリプトが入れる

3:「テーブルの管理 > プロセス」で、プロセス「案件サイト作成」(現在の状況:、変更後の状況:、アクション種別:保存)を作成してください。このサンプルは、最初に作成したプロセス(ボタンのIDがProcess_1)を前提にしています。

4:スクリプトを登録します。

4-1:「テーブルの管理 > スクリプト」タブで「新規作成」を選択する。
 4-2:タイトル: 任意の名前(例:createProjectSite)
 4-3:スクリプト: 下記サンプルコードを貼り付け、【フォルダのサイトID】を1のフォルダのサイトIDにする
 4-4:出力先:「すべて」のチェックを外し、「編集」にチェック

JavaScript
/**
 * ================================================================
 * サンプル  案件ごとのサイトを、決まった名前とアクセス権で作る
 * ================================================================
 *
 * 【概要】
 *   案件管理の編集画面で、プロセス「案件サイト作成」のボタンを押したとき、
 *   「案件コード_案件名」の名前で、案件ごとのサイトを作ります。ボタンを押した人には
 *   権限を付けず、案件担当者に書き込み、承認者に読取専用の権限を付けます。
 *   作成したサイトのIDを「案件サイトID」に入れてから、プロセスを実行し直して保存します。
 *   「案件サイトID」が入っているときは作りません。
 *
 * 【使い方】
 *   出力先:編集
 * ================================================================
 */

// 案件サイトを作るフォルダのサイトID
const PARENT_FOLDER_ID = 【フォルダのサイトID】;
// 権限を付ける項目(選択肢一覧に [[Users]] を設定)と、付ける権限(読取り=1、作成=2、更新=4、削除=8 などの和)
const MEMBER_COLUMN = 'ClassB';
const MEMBER_PERMISSION = 31;   // 案件担当者:書き込み
const APPROVER_COLUMN = 'ClassC';
const APPROVER_PERMISSION = 1;  // 承認者:読取専用
// 作成したサイトのIDを入れる項目
const SITE_ID_COLUMN = 'ClassD';
// サイトを作り終えて、プロセスを実行し直すときに立てる印
let siteCreated = false;

function showError(text) {
    $p.clearMessage();
    $p.setMessage('#Message', JSON.stringify({ Css: 'alert-error', Text: text }));
}

// 案件ごとのサイトを作り、IDを「案件サイトID」に入れてから、プロセスを実行し直す
function createSite($button, memberId, approverId) {
    $p.apiCreateSite({
        id: PARENT_FOLDER_ID,
        data: {
            Title: `${$p.getValue('ClassA')}_${$p.getValue('Title')}`,
            ReferenceType: 'Issues',
            // ボタンを押した人には権限を付けず、Permissions の相手にだけ付ける
            DisableSiteCreatorPermission: true,
            Permissions: [
                `User,${memberId},${MEMBER_PERMISSION}`,
                `User,${approverId},${APPROVER_PERMISSION}`,
            ],
            // SiteSettings が無いと「要求が不正です。」になる
            SiteSettings: { Version: 1.017, ReferenceType: 'Issues' },
        },
        done: function (data) {
            $p.set($p.getControl(SITE_ID_COLUMN), data.Id);
            siteCreated = true;
            $button.prop('disabled', false);
            $p.execProcess($button);
        },
        fail: function () {
            $button.prop('disabled', false);
            showError('案件サイトを作成できませんでした。サイトを作る権限があるかを確かめてください。');
        },
    });
}

// プロセス「案件サイト作成」(Process_1)のボタンを押し、標準の入力検証を通ったときに呼ばれる
$p.events.after_validate_Process_1 = function (args) {
    if (siteCreated) {
        // 作り終えて実行し直したときは、そのまま保存する
        siteCreated = false;
        return true;
    }
    if ($p.getValue(SITE_ID_COLUMN)) {
        showError(`案件サイトは作成済みです(サイトID:${$p.getValue(SITE_ID_COLUMN)})。`);
        return false;
    }
    const memberId = $p.getValue(MEMBER_COLUMN);
    const approverId = $p.getValue(APPROVER_COLUMN);
    if (!memberId || !approverId) {
        showError('案件担当者と承認者を選んでから作成してください。');
        return false;
    }
    const $button = args.$control;
    // 作成を待つ間にもう一度押されて、同じサイトが2つできないようにする
    $button.prop('disabled', true);
    // 作る先がフォルダかを先に確かめる。存在しないIDではトップにサイトが、
    // レコードのIDではそのテーブルにレコードが作られ、どちらもエラーにならないため
    $p.apiGetSite({
        id: PARENT_FOLDER_ID,
        done: function (data) {
            if (data.Response.Data.ReferenceType === 'Sites') {
                createSite($button, memberId, approverId);
                return;
            }
            $button.prop('disabled', false);
            showError('PARENT_FOLDER_ID にフォルダのサイトIDを指定してください。');
        },
        fail: function () {
            $button.prop('disabled', false);
            showError('PARENT_FOLDER_ID のフォルダが見つかりません。');
        },
    });
    // 確認と作成は非同期のため、いったん送信を止める(作成できたら、createSite の中で実行し直す)
    return false;
};

注記

  • Permissionsを指定すると、作成したサイトはフォルダのアクセス権を継承しません。このときDisableSiteCreatorPermission: trueが無いと、指定した相手に加えて、ボタンを押した人にも管理者の権限(511)が付きます。
  • dataにSiteSettingsが無いと、「要求が不正です。」で作成できません。
  • $p.apiCreateSiteのidに存在しないIDを指定するとトップにサイトが、レコードのIDを指定するとそのテーブルにレコードが作られ、どちらもエラーになりません。このサンプルでは、作る前に$p.apiGetSiteでフォルダであることを確かめています。
  • 作成を待つ間はボタンを押せないようにして、同じサイトが2つできないようにしています。
  • 作成したサイトのIDは、画面の「案件サイトID」に入れてから、プロセスを実行し直して保存します。開いている画面のレコードを$p.apiUpdateで更新すると、そのあと画面から保存したときに「先に更新したため更新できません」となるためです。

関連情報