技術・ツール

SAPUI5 フラグメント・カスタムコントロール・再利用のベストプラクティス

目次

はじめに

アプリが大きくなると、同じUI部品を複数画面で使い回したくなります。ダイアログ、検索フォーム、アクションバーなど、コピペで増殖させると修正時に地獄を見ます。

SAPUI5には再利用のための仕組みが3つあります:Fragment、Custom Control、Extension Point。それぞれ用途が違うので、適切に使い分けることがメンテナンス性の鍵です。


Fragment(フラグメント)

概要

Viewの一部分を切り出した部品です。独立したControllerを持たず、使う側のControllerを共有します。ダイアログや検索バー、再利用するフォーム部品に適しています。

基本の使い方

webapp/fragment/CustomerDialog.fragment.xml

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core">
  <Dialog title="顧客選択">
    <List items="{/customers}">
      <StandardListItem title="{name}"/>
    </List>
  </Dialog>
</core:FragmentDefinition>

Controllerから読み込み:

if (!this._oDialog) {
  this._oDialog = sap.ui.xmlfragment("app.fragment.CustomerDialog", this);
  this.getView().addDependent(this._oDialog);
}
this._oDialog.open();

addDependent を必ず呼ぶのがコツで、これを忘れるとフラグメント内のi18n/モデル参照が効かなくなります。

Fragmentを使うべきケース

  • ダイアログ・ポップオーバー・メニューの外出し
  • 複数Viewで共通のフォーム部品
  • ViewのXMLが長くなりすぎた際の論理分割

Extension Point(拡張ポイント)

標準のFiori ElementsやSAP標準アプリをカスタマイズしたいときに使う、SAP公式の拡張ポイント機構です。Viewに「ここは拡張可能」と事前に定義されたポイントがあり、プロジェクト側でそこにFragmentを差し込めます。

<core:ExtensionPoint name="extCustomerDetail">
  <!-- デフォルトコンテンツ -->
</core:ExtensionPoint>

Clean Core戦略(Clean Core戦略参照)の観点でも、Extension Point経由の拡張は推奨されます。標準コードに手を入れずに拡張できるためです。


Custom Control(カスタムコントロール)

Fragmentでは足りず、独自のふるまい・独自のレンダリングを持つUI部品を作りたい場合はCustom Controlを定義します。

sap.ui.define([
  "sap/ui/core/Control"
], function(Control) {
  return Control.extend("app.control.RatingStars", {
    metadata: {
      properties: {
        value: { type: "int", defaultValue: 0 }
      }
    },
    renderer: function(oRm, oControl) {
      oRm.write("<div");
      oRm.writeControlData(oControl);
      oRm.write(">");
      for (var i = 0; i < oControl.getValue(); i++) {
        oRm.write("★");
      }
      oRm.write("</div>");
    }
  });
});

Viewからは通常のコントロールと同じように使えます:

<custom:RatingStars xmlns:custom="app.control" value="{rating}"/>

Custom Controlが必要になるケース

  • 標準コントロールでは表現できない独自UIがある
  • 複雑な状態管理を内部でカプセル化したい
  • 独自のイベント・プロパティを公開したい

逆に「ちょっとした装飾」程度ならFragmentやCSSで済ませる方がメンテが楽です。


再利用の選び分け

flowchart LR
  N[再利用したい] --> Q{何を再利用?}
  Q -->|XML構造のみ| F["Fragment"]
  Q -->|独自ふるまい必要| CC["Custom Control"]
  Q -->|標準拡張| EP["Extension Point"]
  F --> U1["Dialog
フォーム部品"] CC --> U2["独自UI部品
プロパティ公開"] EP --> U3["Fiori Elements拡張
SAP標準拡張"]
凡例 選択フロー { } 判断 [ ] 機構名・用途

Reuse Library(再利用ライブラリ)

複数アプリで共通して使う部品は、Reuse Library として独立したUI5ライブラリ化する選択肢もあります。BTP上のCAPプロジェクトでは ui5.yaml にライブラリ依存を書き、複数アプリから同じコントロールを参照できます。

大規模プロジェクトで開発者が10人を超える規模になると、この手法が効いてきます。少人数なら都度Fragment共有で十分です。


よくある疑問

Q. FragmentのControllerは別に作れますか?

A. 通常は使う側のControllerを共有しますが、sap.ui.xmlfragment(sId, sFragmentName, oController) で別のControllerインスタンスを渡すこともできます。複雑なダイアログでは分離を検討してください。

Q. Custom Controlのレンダリングでセキュリティ対策は必要ですか?

A. ユーザー入力を直接HTMLとして出すとXSSのリスクがあります。RenderManagerの writeEscaped メソッドを使ってエスケープしてください。

Q. 非推奨のJS Viewから移行するコツは?

A. XML Viewに書き換えるのが正道です。動的生成部分はFragmentまたはCustom Controlに切り出して対応できます。

Q. Fiori Elementsに独自UIを差し込むのは難しい?

A. Extension Pointが用意されている箇所ならXML Fragmentで差し込めますが、任意の場所には入れられません。詳細はFiori Elements全体像を参照してください。


まとめ

  • Fragmentは「Viewの一部分の外出し」、Controllerを共有する軽量な再利用手段
  • Extension Pointは「標準アプリの拡張点」、Clean Coreに沿った拡張に最適
  • Custom Controlは「独自ふるまいを持つUI部品」を作るための機構
  • 大規模プロジェクトはReuse Library化で共通部品を集約
  • 選ぶ順序は Fragment → Extension Point → Custom Control の順で検討する

次はFiori Elements全体像で、これらの仕組みが標準提供されているアプリ生成フレームワークを見ていきます。


FragmentやCustom Controlの使い分けを実際のプロジェクトで試したい方には、UI5アプリを一から作ってBTPにデプロイするまでのハンズオン講座が効率的です。再利用パターンの実践感覚が身につきます。

▶ SAP Fiori UI5 & CAPM on BTP – Zero to Real Project 全97レクチャー / 評価4.6 / ※英語での受講になります
← SAPUI5 ルーティング&ナビゲーション実装ガイド|manifest.jsonからTargetまで Fiori Elements全体像|5テンプレート(List Report/Object Page/ALP/Worklist/OVP)の使い分け →
← 記事一覧に戻る