REST API を使用した Web コンテンツの構造とテンプレートの管理
Web コンテンツ構造は、Web コンテンツ記事に含まれる情報を定義します。 構造により、Web コンテンツの作成と管理が容易になり、コンテンツに必要な情報がすべて含まれるようになります。
構造を Web コンテンツ テンプレートに関連付けることができます。 テンプレートは、コンテンツ フィールドがページ上でどのようにレンダリングされるかを決定します。 以下の表は、構造とテンプレートを備えた Liferay DXP REST API を使用して利用可能なオプションをまとめたものです。
| 利用可能なオプション | 利用不可のオプション |
|---|---|
| 構造とテンプレート情報を収集する | 構造またはテンプレートを作成する |
| 構造の権限を置き換える | 構造またはテンプレートを削除する |
構造化コンテンツの管理方法を学ぶには、いくつかの cURL および Java コードサンプルを含む、事前に構築された Liferay DXP Docker イメージを使用します。
環境のセットアップ
新しいLiferay DXPインスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:2025.q1.6-lts
メールアドレス test@liferay.com とパスワード testを使用して、 http://localhost:8080 で Liferay にサインインします。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、以下の手順に従います。
-
サンプルプロジェクトをダウンロードして解凍します。
curl https://resources.learn.liferay.com/examples/liferay-m7b1.zip -Ounzip liferay-m7b1.zip警告これらのスクリプトは基本認証を使用し、テスト用に設計されています。 本番のLiferay DXP環境では、基本認証を使用しないでください。
サイトIDを特定します。
-
サイトメニュー (
) を開き、 構成 → サイト設定に移動します。 -
プラットフォームセクションで、[Site Configuration]をクリックします。
-
[Site ID]の下でサイト識別子を見つけます。

Webコンテンツ構造とテンプレートサンプルの作成
構造またはテンプレートは、ユーザー インターフェイスを通じて手動でのみ作成できます。
基本的な 構造 と、その構造に基づいた基本的な テンプレート を作成します。 このチュートリアルでは、単一のテキスト フィールドを含む基本構造を使用して、 ContentStructure サービスを説明します。

Webコンテンツ構造IDを特定する
-
サイトメニュー (
) を開き、 コンテンツ & データ → Web コンテンツに移動します。 -
構造 タブをクリックします。
-
ID 列の下で、構造の ID を特定します。
使用するサービスの特定
Liferay DXP Headless Delivery API の StructuredContent サービスを使用して、Web コンテンツを管理します。 このサービスとすべての異なるHTTPメソッドを識別するには、Liferay APIエクスプローラーを使用します。 詳細については、「 REST サービスの使用」を参照してください。
サイトからWebコンテンツ構造を取得する
ContentStructures_GET_FromSites.sh cURL スクリプトは、既存の構造を一覧表示します。 このスクリプトは、サイトIDを唯一のパラメーターとして、GET HTTPメソッドでContentStructureサービスを使用します。
| メソッド | サービス | エンドポイント |
|---|---|---|
| GET | ContentStructure | /v1.0/sites//コンテンツ構造 |
ContentStructures_GET_FromSites.sh スクリプトでは、 ${1} パラメータは siteIDを参照します。 スクリプトを実行するときは、例のサイト ID (20125) ではなく、自分のサイト ID を使用してください。
./ContentStructures_GET_FromSites.sh 20125
次のコードは、スクリプトが生成するJSON出力を示しています。 スクリプトはサイト内のすべての構造を返します。 この例では、 id と nameで識別される単一の構造を確認できます。
{
"actions" : { },
"facets" : [ ],
"items" : [ {
"availableLanguages" : [ "en-US" ],
"contentStructureFields" : [ {
"dataType" : "string",
"inputControl" : "text",
"label" : "Text",
"localizable" : true,
"multiple" : false,
"name" : "Text86549034",
"nestedContentStructureFields" : [ ],
"options" : [ ],
"predefinedValue" : "",
"repeatable" : false,
"required" : false,
"showLabel" : true
} ],
"creator" : {
"additionalName" : "",
"contentType" : "UserAccount",
"familyName" : "Bowman",
"givenName" : "David",
"id" : 20129,
"name" : "David Bowman"
},
"dateCreated" : "2021-08-02T13:15:42Z",
"dateModified" : "2021-08-02T13:16:57Z",
"description" : "",
"id" : 41837,
"name" : "Simple Structure",
"siteId" : 20125
} ],
"lastPage" : 1,
"page" : 1,
"pageSize" : 20,
"totalCount" : 1
}
この構造には、 dataType セクションの contentStructureFieldsに記述されている 1 つの Text フィールドがあります。 構造にさらに要素を追加すると、 contentStructureFieldsの下に追加のセクションが表示されます。 以下は、テキスト ("dataType": "string") とイメージ フィールド ("dataType": "image") を持つ構造の部分的な JSON 出力です。
{
"actions": {},
"facets": [],
"items": [
{
"availableLanguages": ["en-US"],
"contentStructureFields": [
{
"dataType": "string",
"inputControl": "text",
"label": "Text",
"localizable": true,
"multiple": false,
"name": "Text86549034",
"nestedContentStructureFields": [],
"options": [],
"predefinedValue": "",
"repeatable": false,
"required": false,
"showLabel": true
},
{
"dataType": "image",
"label": "Image",
"localizable": true,
"multiple": false,
"name": "Image96876678",
"nestedContentStructureFields": [],
"options": [],
"predefinedValue": "{}",
"repeatable": false,
"required": false,
"showLabel": true
}
]
}
]
}
RESTサービスは、Javaクライアントを使って呼び出すこともできます。
-
curlフォルダから、javaフォルダに移動します。 -
ソースファイルをコンパイルします。
javac -classpath .:* *.java -
ContentStructures_GET_FromSites.javaクラスを実行します。siteId値をサイトのIDに置き換えます。java -classpath .:* -DsiteId=1234 ContentStructures_GET_FromSites
詳細については、以下のコードを参照してください。
public class ContentStructures_GET_FromSites {
public static void main(String[] args) throws Exception {
ContentStructureResource.Builder builder =
ContentStructureResource.builder();
ContentStructureResource contentStructureResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
System.out.println(
contentStructureResource.getSiteContentStructuresPage(
Long.valueOf(System.getProperty("siteId")), null, null, null,
Pagination.of(1, 2), null));
}
}
この Java クラスは、 ContentStructureResource API を使用して、特定の Liferay サイトからコンテンツ構造を取得します。 メインメソッドは、認証資格情報(test@liferay.com および learn)を使用して ContentStructureResource のインスタンスを構築します。 次に、サイト ID を getSiteContentStructuresPage() メソッドに渡して、サイトのコンテンツ構造のページ分けされたリストを取得します。 結果は System.out.println()を使用してコンソールに出力されます。 ページ区切りは、ページごとに 2 つの項目を含む最初のページを返すように設定されています。
サイトからWebコンテンツテンプレートを取得する
ContentTemplates_GET_FromSites.sh cURL スクリプトは、既存のテンプレートの一覧を表示します。 このスクリプトは、サイトIDを唯一のパラメーターとして、GET HTTPメソッドでContentTemplateサービスを使用します。
| メソッド | サービス | エンドポイント |
|---|---|---|
| GET | ContentTemplate | /v1.0/sites//content-templates |
ContentTemplates_GET_FromSites.sh スクリプトでは、 ${1} パラメータは siteIDを参照します。 スクリプトを実行するときは、例のサイト ID (20125) ではなく、自分のサイト ID を使用してください。
./ContentTemplates_GET_FromSites.sh 20125
以下は、このスクリプトが生成するJSON出力の一部です。 スクリプトはサイト内のすべてのテンプレートを返します。 この例では、 id と nameで識別される単一のテンプレートを確認できます。 contentStructureId は関連付けられている構造 ID に対応し、 templateScript はテンプレートを記述する FreeMarker テンプレート言語に対応します。
{
(...)
"availableLanguages" : [ "en-US" ],
"contentStructureId" : 41837,
"creator" : {
"additionalName" : "",
"contentType" : "UserAccount",
"familyName" : "Bowman",
"givenName" : "David",
"id" : 20129,
"name" : "David Bowman"
},
"dateCreated" : "2021-08-02T13:24:32Z",
"dateModified" : "2021-08-02T14:33:24Z",
"description" : "",
"id" : "41847",
"name" : "Simple Template",
"programmingLanguage" : "ftl",
"siteId" : 20125,
"templateScript" : "<#if (Text86549034.getData())??>\n\t${Text86549034.getData()}\n</#if>"
} ],
"lastPage" : 1,
"page" : 1,
"pageSize" : 20,
"totalCount" : 1
}
RESTサービスは、Javaクライアントを使って呼び出すこともできます。
-
curlフォルダから、javaフォルダに移動します。 -
ソース ファイルをコンパイルします (まだコンパイルしていない場合)。
javac -classpath .:* *.java -
ContentTemplates_GET_FromSites.javaクラスを実行します。siteId値をサイトのIDに置き換えます。java -classpath .:* -DsiteId=1234 ContentTemplates_GET_FromSitesContentTemplates_GET_FromSites.javaは、ContentStructures_GET_FromSites.javaファイルと同様に動作します。 唯一の違いは、ContentTemplateResourceのインスタンスを構築することです。 そのため、別のインポートが必要になり、代わりにgetSiteContentTemplatesPageメソッドが使用されます。
Webコンテンツ構造の権限を取得する
ContentStructures_GET_Permissions_ById.sh cURL スクリプトは、Web コンテンツ構造の権限を一覧表示します。 このスクリプトは、ストラクチャーIDを唯一のパラメーターとして、GET HTTPメソッドでContentStructureサービスを使用します。
| メソッド | サービス | エンドポイント |
|---|---|---|
| GET | ContentStructure | /v1.0/content-structures/{contentStructureId}/permissions |
ContentStructures_GET_Permissions_ById.sh スクリプトでは、 ${1} パラメータは contentStructureIdを参照します。 スクリプトを実行するときは、例の ID (41837) ではなく、構造体の ID を使用してください。
./ContentStructures_GET_Permissions_ById.sh 41837
JSON出力には、itemsセクションの下に権限が含まれます。 この例では、サンプル構造に対する権限を持つロールは roleNameに 1 つだけあり、権限のリストは actionIdsにあります。
{
"actions": {
"get": {
"method": "GET",
"href": "http://localhost:8080/o/headless-delivery/v1.0/content-structures/41837/permissions"
},
"replace": {
"method": "PUT",
"href": "http://localhost:8080/o/headless-delivery/v1.0/content-structures/41837/permissions"
}
},
"facets": [],
"items": [
{
"actionIds": ["DELETE", "PERMISSIONS", "UPDATE", "VIEW"],
"roleName": "Owner"
}
],
"lastPage": 1,
"page": 1,
"pageSize": 2,
"totalCount": 2
}
権限の管理方法については、「 Web コンテンツ構造とテンプレートへの権限の割り当て」を参照してください。
RESTサービスは、Javaクライアントを使って呼び出すこともできます。
-
curlフォルダから、javaフォルダに移動します。 -
ソース ファイルをコンパイルします (まだコンパイルしていない場合)。
javac -classpath .:* *.java -
ContentStructures_GET_Permissions_ById.javaクラスを実行します。contentStructureIdの値を構造体の ID に置き換えます。java -classpath .:* -DcontentStructureId=1234 ContentStructures_GET_Permissions_ByIdContentStructures_GET_Permissions_ById.javaは、ContentStructures_GET_FromSites.javaファイルと同様に動作します。 唯一の違いは、メソッドがパラメーターとしてLong contentStructureId(siteIdの代わりに) とString roleNamesを受け取ることです。 利用可能なすべての権限を返すために、roleNamesはnullとして設定されます。
Webコンテンツ構造の権限の置き換え
ContentStructures_PUT_Permissions_ById.sh cURL スクリプトは、 PUT HTTP メソッドを ContentStructure サービスと共に使用して、元の構造の権限を置き換えます。 このスクリプトには、Power User ロールの DELETE および VIEW 権限が含まれています。
| メソッド | サービス | エンドポイント |
|---|---|---|
| PUT | ContentStructure | /v1.0/content-structures/{contentStructureId}/permissions |
ContentStructures_PUT_Permissions_ById.sh スクリプトでは、 ${1} パラメータは contentStructureIdを参照します。 スクリプトを実行するときは、例の ID (41837) ではなく、構造体の ID を使用してください。
./ContentStructures_PUT_Permissions_ById.sh 41837
JSON 出力には、 items セクションの下に、ロールごとに 1 つずつ、2 つのエントリが表示されます。
{
"actions": {
"get": {
"method": "GET",
"href": "http://localhost:8080/o/headless-delivery/v1.0/content-structures/41837/permissions"
},
"replace": {
"method": "PUT",
"href": "http://localhost:8080/o/headless-delivery/v1.0/content-structures/41837/permissions"
}
},
"facets": [],
"items": [
{
"actionIds": ["DELETE", "PERMISSIONS", "UPDATE", "VIEW"],
"roleName": "Owner"
},
{
"actionIds": ["DELETE", "VIEW"],
"roleName": "Power User"
}
],
"lastPage": 1,
"page": 1,
"pageSize": 2,
"totalCount": 2
}
パワーユーザーには削除権限と表示権限が付与されました。
RESTサービスは、Javaクライアントを使って呼び出すこともできます。
-
curlフォルダから、javaフォルダに移動します。 -
ソース ファイルをコンパイルします (まだコンパイルしていない場合)。
javac -classpath .:* *.java -
ContentStructures_PUT_Permissions_ById.javaクラスを実行します。contentStructureIdの値を構造の ID に置き換え、actionIdsの値をアクションまたはアクションのリスト(カンマで区切る)に置き換え、roleNameの値を権限を更新するための希望するロールに置き換えます。java -classpath .:* -Dactions="DELETE, UPDATE, VIEW" -DcontentStructureId=1234 -Drole="Power User" ContentStructures_GET_Permissions_ById
詳細については、以下のコードとそのコメントを参照してください。
public class ContentStructures_PUT_Permissions_ById {
public static void main(String[] args) throws Exception {
ContentStructureResource.Builder builder =
ContentStructureResource.builder();
ContentStructureResource contentStructureResource =
builder.authentication(
"test@liferay.com", "learn"
).build();
System.out.println(
contentStructureResource.putContentStructurePermissionsPage(
Long.valueOf(System.getProperty("contentStructureId")),
new Permission[] {
new Permission() {
{
actionIds = System.getProperty(
"actionIds"
).split(
"\\s*,\\s*"
);
roleName = System.getProperty("roleName");
}
}
}));
}
}
この Java クラスは、 ContentStructureResource API を使用してコンテンツ構造の権限を更新します。 メインメソッドは、提供された認証情報 (test@liferay.com および learn) を使用して API で認証し、コンテンツ構造 ID と Permission オブジェクトの配列を putContentStructurePermissionsPage() メソッドに渡します。 各 Permission オブジェクトが作成され、ロール名は roleName システム プロパティに基づいて設定されます。 結果がコンソールに出力されます。