ウィジェットの使用および拡張(クラシック UI)

Adobe Experience Manager の Web ベースインターフェイスでは、AJAX やその他の最新のブラウザー技術が使用されています。これらの技術により、作成者は、Web ページ上でコンテンツの WYSIWYG 編集や書式設定を行うことができます。

Adobe Experience Manager(AEM)では、ExtJS ウィジェットライブラリが使用されています。このライブラリのユーザーインターフェイス要素は、主要なすべてのブラウザーで動作するだけではなく、デスクトップクラスの UI の操作性も実現でき、非常に洗練されたものとなっています。

これらのウィジェットは AEM に組み込まれており、AEM 自体でも使用されていますが、AEM で作成したすべての Web サイトでも使用できます。

AEM で使用可能なすべてのウィジェットについて詳しくは、ウィジェット API ドキュメントまたは既存の xtype のリストを参照してください。また、ExtJS フレームワークを所有している Sencha のサイトには、ExtJS フレームワークの使用方法を示す例が多数掲載されています。

このページをご覧になると、ウィジェットを使用したり、拡張したりする方法についてのヒントが得られます。このページでは、最初に、クライアント側コードをページに組み込む方法が説明されています。次に、基本的な使用と拡張の方法を説明するために作成されたサンプルコンポーネントが示されています。これらのコンポーネントは、パッケージ共有​の Using ExtJS Widgets​パッケージで提供されています。

このパッケージには、次の例が含まれています。

メモ

Adobe Experience Manager のクラシック UI は、ExtJS 3.4.0 をベースに構築されています。

メモ

このページでは、クラシック UI でのウィジェットの使用について説明します。アドビでは、Coral UI および Granite UI をベースとした最新のタッチ操作対応 UI の使用を推奨しています。

クライアント側コードのページへの組み込み

クライアント側のJavaScriptとスタイルシートコードは、クライアントライブラリに配置する必要があります。

クライアントライブラリを作成するには:

  1. /apps/<project>の下に、次のプロパティを持つノードを作成します。

        name="clientlib"
        jcr:mixinTypes="[mix:lockable]"
        jcr:primaryType="cq:ClientLibraryFolder" 
        sling:resourceType="widgets/clientlib" 
        categories="[<category-name>]" 
        dependencies="[cq.widgets]"
    
    メモ

    注意:<category-name>は、カスタムライブラリの名前です(例:"cq.extjstraining")と呼ばれ、ページにライブラリを組み込むために使用されます。

  2. clientlibの下に、cssフォルダーとjsフォルダー(nt:folder)を作成します。

  3. clientlibの下に、css.txtファイルとjs.txtファイル(nt:files)を作成します。 これらの .txt ファイルには、ライブラリに組み込むファイルを記述します。

  4. js.txtを編集:「 #base=js 」で始まり、CQクライアントライブラリサービスによって集計されるファイルのリストが続く必要があります。例:

    #base=js
     components.js
     exercises.js
     CustomWidget.js
     CustomBrowseField.js
     InsertTextPlugin.js
    
  5. css.txtを編集:「 #base=css 」で始まり、CQクライアントライブラリサービスによって集計されるファイルのリストが続く必要があります。例:

    #base=css
     components.css
    
  6. js フォルダーの下に、ライブラリに属する Javascript ファイルを配置します。

  7. cssフォルダーの下に、.cssファイルと、CSSファイルで使用されるリソース(例:my_icon.png)です。

メモ

前述のスタイルシートの処理は、必要に応じておこないます。

ページコンポーネント jsp にクライアントライブラリを組み込むには:

  • Javascript コードとスタイルシートの両方を組み込むには:

    <ui:includeClientLib categories="<category-name1>, <category-name2>, ..."/>

    <category-nameX>はクライアント側ライブラリの名前です。

  • Javascript コードのみを組み込むには:

    <ui:includeClientLib js="<category-name>"/>

詳しくは、<ui:includeClientLib> タグの説明を参照してください。

クライアントライブラリは、オーサーモードでのみ使用可能にして、パブリッシュモードでは除外することが必要な場合があります。これをおこなうには、次のように設定します。

    if (WCMMode.fromRequest(request) != WCMMode.DISABLED) {
        %><ui:includeClientLib categories="cq.collab.blog"/><%
    }

サンプルの使用

このページのチュートリアルに従うには、Using ExtJS Widgets​という名前のパッケージをローカルのAEMインスタンスにインストールし、コンポーネントが含まれるサンプルページを作成します。 この作業を行うには、以下の手順を実行します。

  1. AEMインスタンスで、パッケージ共有から​Using ExtJS Widgets (v01)​という名前のパッケージをダウンロードし、インストールします。 リポジトリ内の/appsの下にプロジェクトextjstrainingが作成されます。

  2. Geometrixx​ブランチの新しいページにサンプルコンポーネントを含めるので、geometrixxページjspのheadタグに、スクリプト(js)とスタイルシート(css)を含むクライアントライブラリを含めます。

    CRXDE Lite​で、ファイル/apps/geometrixx/components/page/headlibs.jspを開き、次のようにcq.extjstrainingカテゴリを既存の<ui:includeClientLib>タグに追加します。

    %><ui:includeClientLib categories="apps.geometrixx-main, cq.extjstraining"/><%

  3. /content/geometrixx/en/productsの下の​Geometrixx​ブランチに新しいページを作成し、Using ExtJS Widgets​と呼び出します。

  4. デザインモードに切り替え、Using ExtJS Widgets という名前のグループのすべてのコンポーネントを Geometrixx のデザインに追加します。

  5. 編集モードに戻ります。Using ExtJS Widgets​グループのコンポーネントは、サイドキックで使用できます。

メモ

このページの例は、Geometrixx サンプルコンテンツに基づいています。これは現在、AEM には付属しておらず、We.Retail に置き換えられています。Geometrixxをダウンロードしてインストールする方法については、ドキュメントWe.Retail参照実装を参照してください。

基本ダイアログ

通常、ダイアログは、コンテンツを編集するために使用されますが、情報の表示のみをおこなうこともできます。ダイアログを完全に表示する簡単な方法は、その JSON 形式の表現にアクセスすることです。これをおこなうには、ブラウザーで次のように指定します。

http://localhost:4502/<path-to-dialog>.-1.json

サイドキックにある Using ExtJS Widgets グループの最初のコンポーネントは、1.Dialog Basics という名前で、4 つの基本ダイアログが入っています。これらのダイアログは、すぐに使用できるウィジェットで作成されており、カスタマイズした Javascript ロジックは含まれていません。ダイアログは/apps/extjstraining/components/dialogbasicsの下に保存されます。 基本ダイアログを次に示します。

  • ダイアログ(fullfull ノード):3 つのタブを持つウィンドウが表示されます。各タブには、2 つのテキストフィールドがあります。

  • Single Panel ダイアログ(singlepanel ノード):1 つのタブを持つウィンドウが表示されます。このタブには、2 つのテキストフィールドがあります。

  • Multi Panel ダイアログ(multipanel ノード):表示内容は Full ダイアログと同じですが、ダイアログの作成の仕方が異なります。

  • ダイアログ(designdesign ノード):2 つのタブを持つウィンドウが表示されます。最初のタブには、テキストフィールド、ドロップダウンメニューおよび折り畳み可能なテキスト領域があります。2 番目のタブには、4 つのテキストフィールドを含むフィールドセットと、2 つのテキストフィールドを含む折り畳み可能なフィールドセットがあります。

次の手順に従って、1.Dialog Basics コンポーネントをサンプルページに組み込みます。

  1. 1.​サイドキック​「Using ExtJS Widgets 」タブからサンプルページにDialog Basics​コンポーネントを追加します。

  2. このコンポーネントには、タイトル、テキストおよび​プロパティ​リンクが表示されます。リンクをクリックすると、リポジトリに保存されている段落のプロパティが表示されます。リンクをもう一度クリックすると、プロパティが非表示になります。

このコンポーネントは、次のように表示されます。

chlimage_1-135

例 1:Full ダイアログ

Full ダイアログには、3 つのタブを持つウィンドウが表示されます。各タブには、2 つのテキストフィールドがあります。これは、Dialog Basics コンポーネントのデフォルトダイアログです。特性は次のとおりです。

  • ノードによって定義されます。node type = cq:Dialog、xtype = dialog

  • 3つのタブが表示されます(node type = cq:Panel)。

  • 各タブには2つのテキストフィールドがあります(ノードタイプ= cq:Widget、xtype = textfield)。

  • ノードによって定義されます:

    /apps/extjstraining/components/dialogbasics/full

  • 次を要求することで、JSON形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/dialogbasics/full.-1.json

このダイアログは、次のように表示されます。

screen_shot_2012-01-31at45411pm

例 2:Single Panel ダイアログ

Single Panel ダイアログには、1 つのタブを持つウィンドウが表示されます。このタブには、2 つのテキストフィールドがあります。特性は次のとおりです。

  • 1つのタブを表示します(node type = cq:Dialog、xtype = panel)

  • このタブには2つのテキストフィールドがあります(ノードタイプ= cq:Widget、xtype = textfield

  • ノードによって定義されます:

    /apps/extjstraining/components/dialogbasics/singlepanel

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/dialogbasics/singlepanel.-1.json

  • Full ダイアログ​の利点の 1 つは、必要な設定が少ないことです。

  • 推奨される用途:情報を表示するだけの、またはフィールドが数個しかない単純なダイアログ。

Single Panel ダイアログを使用するには:

  1. Dialog Basics コンポーネントのダイアログを Single Panel ダイアログに置き換えます。

    1. CRXDE Lite​で、ノードを削除します。/apps/extjstraining/components/dialogbasics/dialog
    2. すべて保存」をクリックして変更を保存します。
    3. ノードをコピーします。/apps/extjstraining/components/dialogbasics/singlepanel
    4. コピーしたノードを次の場所に貼り付けます。/apps/extjstraining/components/dialogbasics
    5. ノードを選択します。/apps/extjstraining/components/dialogbasics/Copy of singlepanelと名前をdialogに変更します。
  2. コンポーネントを編集します。次のようなダイアログが表示されます。

screen_shot_2012-01-31at45952pm

例 3:Multi Panel ダイアログ

Multi Panel ダイアログは、Full ダイアログと同じ表示内容ですが、ダイアログの作成の仕方が異なります。特性は次のとおりです。

  • ノードによって定義されます(ノードタイプ= cq:Dialog、xtype = tabpanel)。

  • 3つのタブが表示されます(node type = cq:Panel)。

  • 各タブには2つのテキストフィールドがあります(ノードタイプ= cq:Widget、xtype = textfield)。

  • ノードによって定義されます:

    /apps/extjstraining/components/dialogbasics/multipanel

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/dialogbasics/multipanel.-1.json

  • Full ダイアログ​の利点の一つは、構造が簡単であることです。

  • 推奨される用途:複数のタブを持つダイアログ。

マルチパネルダイアログを使用するには:

  1. Dialog Basics​コンポーネントのダイアログを​Multi Panel​ダイアログに置き換えます。

    例2で説明されている手順に従います。シングルパネルダイアログ

  2. コンポーネントを編集します。次のようなダイアログが表示されます。

screen_shot_2012-01-31at50119pm

例 4:Rich ダイアログ

Rich ダイアログには、2 つのタブを持つウィンドウが表示されます。最初のタブには、テキストフィールド、ドロップダウンメニューおよび折り畳み可能なテキスト領域があります。2 番目のタブには、4 つのテキストフィールドを含むフィールドセットと、2 つのテキストフィールドを含む折り畳み可能なフィールドセットがあります。特性は次のとおりです。

  • ノードによって定義されます(ノードタイプ= cq:Dialog、xtype = dialog)。

  • 2つのタブが表示されます(node type = cq:Panel)。

  • 最初のタブには、textfieldと3つのオプションを持つselectionウィジェットを持つdialogfieldsetウィジェットと、textareaウィジェットを持つ折りたたみ可能なdialogfieldsetウィジェットがあります。

  • 2番目のタブには、4つのtextfieldウィジェットを持つdialogfieldsetウィジェットと、2つのtextfieldウィジェットを持つ折りたたみ可能なdialogfieldsetウィジェットがあります。

  • ノードによって定義されます:

    /apps/extjstraining/components/dialogbasics/rich

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/dialogbasics/rich.-1.json

Rich ダイアログを使用するには:

  1. Dialog Basics​コンポーネントのダイアログを​Rich​ダイアログに置き換えます。

    例2で説明されている手順に従います。シングルパネルダイアログ

  2. コンポーネントを編集します。次のようなダイアログが表示されます。

screen_shot_2012-01-31at50429 pmscreen_shot_2012-01-31at50519pm

Dynamic Dialogs

サイドキックにある Using ExtJS Widgets グループの 2 番目のコンポーネントは、2.Dynamic Dialogs という名前で、3 つの動的ダイアログが含まれています。これらのダイアログは、すぐに使用できるウィジェットと、カスタマイズされた Javascript ロジック​から作成されています。ダイアログは/apps/extjstraining/components/dynamicdialogsの下に保存されます。 動的ダイアログは次のとおりです。

  • Switch Tabs ダイアログ(switchtabs ノード):2 つのタブを持つウィンドウが表示されます。最初のタブでは、ラジオボタンにより、3 つのオプションのいずれかを選択できます。オプションを選択すると、選択したオプションに関連付けられているタブが表示されます。2 番目のタブには、2 つのテキストフィールドがあります。
  • ダイアログ(arbitraryarbitrary ノード):1 つのタブを持つウィンドウが表示されます。このタブには、2 つのフィールドがあります。一つは、アセットをドロップまたはアップロードするためのフィールド、もう一つは、コンポーネントを含むページに関する情報とアセットに関する情報(アセットが参照されている場合)を表示するフィールドです。
  • [フィールドの切り替え]ダイアログ( togglefieldノード):1つのタブを持つウィンドウが表示されます。 このタブには、1 つのチェックボックスがあります。このチェックボックスを選択すると、2 つのテキストフィールドを含むフィールドセットが表示されます。

2. Dynamic Dialogs コンポーネントをサンプルページに組み込むには:

  1. 2. Dynamic Dialogs コンポーネントをサンプルページに追加します(サイドキック​にある「Using ExtJS Widgets」タブから)。

  2. このコンポーネントには、タイトル、テキストおよび​プロパティ​リンクが表示されます。リンクをクリックすると、リポジトリに保存されている段落のプロパティが表示されます。リンクをもう一度クリックすると、プロパティが非表示になります。

このコンポーネントは、次のように表示されます。

chlimage_1-136

例 1:Switch Tabs ダイアログ

Switch Tabs ダイアログには、2 つのタブを持つウィンドウが表示されます。最初のタブでは、ラジオボタンにより、3 つのオプションのいずれかを選択できます。オプションを選択すると、選択したオプションに関連付けられているタブが表示されます。2 番目のタブには、2 つのテキストフィールドがあります。

このダイアログの主な特徴を次に示します。

  • ノードによって定義されます(ノードタイプ= cq:Dialog、xtype = dialog)。

  • 次の2つのタブが表示されます(node type = cq:Panel)。「1」タブの場合、「2」タブの場合は、「1」タブでの選択内容(「3」オプション)に応じて異なります。

  • 3つのオプションのタブ(node type = cq:Panel)があり、各タブには2つのテキストフィールドがあります(node type = cq:Widget、xtype = textfield)。 「オプション」タブは、同時に 1 つしか表示されません。

  • 次の場所にあるswitchtabsノードによって定義されます。

    /apps/extjstraining/components/dynamicdialogs/switchtabs

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/dynamicdialogs/switchtabs.-1.json

ロジックは、次のようにイベントリスナーと Javascript コードによって実装されています。

  • ダイアログノードには、ダイアログが表示される前に、すべてのオプションのタブを非表示にする「beforeshow」リスナーがあります。

    beforeshow="function(dialog){Ejst.x2.manageTabs(dialog.items.get(0));}"

    dialog.items.get(0) 選択パネルと3つのオプションパネルを含むタブパネルを取得します。

  • Ejst.x2オブジェクトは、次の場所にあるexercises.jsファイルで定義されます。

    /apps/extjstraining/clientlib/js/exercises.js

  • Ejst.x2.manageTabs()メソッドでは、indexの値が —1なので、すべてのオプションのタブが非表示になります(1 ~ 3)。

  • 「選択範囲」タブには、2 つのリスナーがあります。一つは、ダイアログのロード(「loadcontent」イベント)時に選択済みのタブを表示するリスナー、もう一つは、選択内容の変更(「selectionchanged」イベント)時に選択済みのタブを表示するリスナーです。

    loadcontent="function(field,rec,path){Ejst.x2.showTab(field);}"

    selectionchanged="function(field,value){Ejst.x2.showTab(field);}"

  • Ejst.x2.showTab()メソッドで、次の操作を実行します。

    field.findParentByType('tabpanel') すべてのタブを含むタブパネルを取得しま field す(選択ウィジェットを表す)。

    field.getValue() 選択の値を取得します。例:tab2

    Ejst.x2.manageTabs() 選択したタブが表示されます。

  • 各「オプション」タブには、「render」イベントでタブを非表示にするリスナーがあります。

    render="function(tab){Ejst.x2.hideTab(tab);}"

  • Ejst.x2.hideTab()メソッドで、次の操作を実行します。

    tabPanel は、すべてのタブを含むタブパネルです

    index はオプションのタブのインデックスです

    tabPanel.hideTabStripItem(index) タブを非表示

次のように表示されます。

screen_shot_2012-02-01at114745am

例 2:Arbitrary ダイアログ

ほとんどの場合、ダイアログには、基になるコンポーネントからのコンテンツが表示されます。ここで説明する Arbitrary ダイアログは、別のコンポーネントからコンテンツを取り込みます。

Arbitrary ダイアログには、1 つのタブを持つウィンドウが表示されます。このタブには、2 つのフィールドがあります。一つは、アセットをドロップまたはアップロードするためのフィールド、もう一つは、コンポーネントを含むページに関する情報とアセットに関する情報(アセットが参照されている場合)を表示するフィールドです。

このダイアログの主な特徴を次に示します。

  • ノードによって定義されます(ノードタイプ= cq:Dialog、xtype = dialog)。

  • 1つのパネル(node type = cq:Panel)を含む1つのtabpanelウィジェット(node type = cq:Widget、xtype = tabpanel)を表示します。

  • このパネルには、smartfileウィジェット(node type = cq:Widget、xtype = smartfile)とownerdrawウィジェット(node type = cq:Widget、xtype = ownerdraw)があります。

  • 次の場所にあるarbitraryノードによって定義されます。

    /apps/extjstraining/components/dynamicdialogs/arbitrary

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/dynamicdialogs/arbitrary.-1.json

ロジックは、次のようにイベントリスナーと Javascript コードによって実装されています。

  • ownerdrawウィジェットには、コンポーネントを含むページに関する情報と、コンテンツの読み込み時にsmartfileウィジェットが参照するアセットに関する情報を表示する「loadcontent」リスナーがあります。

    loadcontent="function(field,rec,path){Ejst.x2.showInfo(field,rec,path);}"

    field ownerdrawオブジェクトを使用して設定します。

    path コンポーネントのコンテンツパスを使用して設定します(例:/content/geometrixx/en/products/triangle/ui-tutorial/jcr:content/par/dynamicdialogs)

  • Ejst.x2オブジェクトは、次の場所にあるexercises.jsファイルで定義されます。

    /apps/extjstraining/clientlib/js/exercises.js

  • Ejst.x2.showInfo()メソッドで、次の操作を実行します。

    pagePath は、コンポーネントを含むページのパスです。

    pageInfo は、ページプロパティをjson形式で表します。

    reference は参照先のアセットのパスです。

    metadata アセットのメタデータをjson形式で表します。

    ownerdraw.getEl().update(html); 作成したhtmlがダイアログに表示されます。

Arbitrary ダイアログを使用するには:

  1. ダイナミックダイアログ​コンポーネントのダイアログを​任意の​ダイアログに置き換えます。

    例2で説明されている手順に従います。シングルパネルダイアログ

  2. コンポーネントを編集します。次のようなダイアログが表示されます。

screen_shot_2012-02-01at115300am

例 3:Toggle Fields ダイアログ

Toggle Fields ダイアログには、1 つのタブを持つウィンドウが表示されます。このタブには、1 つのチェックボックスがあります。このチェックボックスを選択すると、2 つのテキストフィールドを含むフィールドセットが表示されます。

このダイアログの主な特徴を次に示します。

  • ノードによって定義されます(ノードタイプ= cq:Dialog、xtype = dialog)。

  • 1つのパネル(node type = cq:Panel)を持つ1つのtabpanelウィジェット(node type = cq:Widget、xtype = tabpanel)を表示します。

  • このパネルには、2つのtextfieldウィジェット(node type = cq:Widget、xtype = textfield)でデフォルトで非表示になる、selection/checkboxウィジェット(node type = cq:Widget、xtype = selection、type = checkbox)と折りたたみ可能なdialogfieldsetウィジェット(node type = cq:Widget、xtype = dialogfieldset)があります。

  • 次の場所にあるtogglefieldsノードによって定義されます。

    /apps/extjstraining/components/dynamicdialogs/togglefields

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/dynamicdialogs/togglefields.-1.json

ロジックは、次のようにイベントリスナーと Javascript コードによって実装されています。

  • 「選択」タブには、2つのリスナーがあります。コンテンツの読み込み時にdialogfieldsetを表示するもの(「loadcontent」イベント)と、選択が変更されたときにdialogfieldsetを表示するもの(「selectionchanged」イベント)を次に示します。

    loadcontent="function(field,rec,path){Ejst.x2.toggleFieldSet(field);}"

    selectionchanged="function(field,value){Ejst.x2.toggleFieldSet(field);}"

  • Ejst.x2オブジェクトは、次の場所にあるexercises.jsファイルで定義されます。

    /apps/extjstraining/clientlib/js/exercises.js

  • Ejst.x2.toggleFieldSet()メソッドで、次の操作を実行します。

    • box は選択オブジェクトです。
    • panel は、選択およびdialogfieldsetウィジェットを含むパネルです。
    • fieldSet dialogfieldsetオブジェクト
    • show は選択範囲の値です(trueまたはfalse)
    • show 」に基づいて、dialogfieldsetが表示されるかどうかを設定します。

フィールドの切り替え​ダイアログを使用するには:

  1. ダイナミックダイアログ​コンポーネントのダイアログを、フィールドの切り替え​ダイアログに置き換えます。

    例2で説明されている手順に従います。シングルパネルダイアログ

  2. コンポーネントを編集します。次のようなダイアログが表示されます。

screen_shot_2012-02-01at115518am

カスタムウィジェット

AEM に付属しているすぐに使用できるウィジェットは、ほとんどのケースに対応できます。ただし、プロジェクト固有の要件をカバーするためにカスタムウィジェットを作成する必要が生じる場合があります。 カスタムウィジェットは、既存のウィジェットを拡張して作成できます。こうしたカスタマイズをおこなう際の手助けとなるように、Using ExtJS Widgets パッケージには、3 つの異なるカスタムウィジェットを使用する 3 つのダイアログが含まれています。

  • Multi Field ダイアログ(multifield ノード)。1 つのタブを持つウィンドウが表示されます。このタブには、カスタマイズされた multifield ウィジェットがあり、2 つのオプションを選択できるドロップダウンメニューとテキストフィールドという 2 つのフィールドが含まれています。このタブは、すぐに使用できる multifield ウィジェット(テキストフィールドのみを持つ)に基づいているので、multifield ウィジェットの機能をすべて使用できます。

  • Tree Browse ダイアログ(treebrowse ノード)。このダイアログに表示されるウィンドウには、パス参照ウィジェットを含む 1 つのタブがあります。このウィジェットで矢印をクリックすると、ウィンドウが開き、階層を参照しながら項目を選択できます。項目を選択すると、そのパスがパスフィールドに追加され、ダイアログを閉じても保持され続けます。

  • リッチテキストエディタープラグインベースのダイアログ(rteplugin ノード)。リッチテキストエディターにカスタムボタンを追加したもので、メインテキストにカスタムテキストを挿入できます。richtext ウィジェット(RTE)と、RTE プラグインメカニズムを通じて追加されたカスタム機能から構成されています。

カスタムウィジェットとプラグインは、3.Custom WidgetsUsing ExtJS Widgets パッケージに属する)という名前のコンポーネントに含まれています。このコンポーネントをサンプルページに組み込むには:

  1. 3. Custom Widgets コンポーネントをサンプルページに追加します(サイドキック​にある「Using ExtJS Widgets」タブから)。

  2. このコンポーネントには、タイトルとテキストが表示されます。また、プロパティ​リンクをクリックすると、リポジトリに保存されている段落のプロパティも表示されます。リンクをもう一度クリックすると、プロパティが非表示になります。

    このコンポーネントは、次のように表示されます。

chlimage_1-137

例 1:Custom Multifield ウィジェット

Custom Multifield ウィジェットベースのダイアログには、1 つのタブを持つウィンドウが表示されます。このタブには、カスタマイズされた multifield ウィジェットがあります。標準の multifield ウィジェットには 1 つのフィールドがありますが、このウィジェットには、2 つのオプションを選択できるドロップダウンメニューとテキストフィールドという 2 つのフィールドがあります。

Custom Multifield ウィジェットベースのダイアログ:

  • ノードによって定義されます(ノードタイプ= cq:Dialog、xtype = dialog)。

  • 1つのパネル(node type = cq:Widget、xtype = panel)を含む1つのtabpanelウィジェット(node type = cq:Widget、xtype = tabpanel)を表示します。

  • このパネルには、multifieldウィジェット(node type = cq:Widget、xtype = multifield)があります。

  • multifieldウィジェットには、カスタムxtype ' ejstcustom'に基づくfieldconfig (node type = nt:unstructured、xtype = ejstcustom、optionsProvider = Ejst.x3.provideOptions)があります。

    • fieldconfig 」は、CQ.form.MultiFieldオブジェクトの設定オプションです。

    • optionsProvider 」はejstcustomウィジェットの設定です。 これは、exercises.jsで次の場所に定義されているEjst.x3.provideOptionsメソッドを使用して設定されます。

      /apps/extjstraining/clientlib/js/exercises.js

      とは、2つのオプションを返します。

  • 次の場所にあるmultifieldノードによって定義されます。

    /apps/extjstraining/components/customwidgets/multifield

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/customwidgets/multifield.-1.json

Custom Multifield ウィジェット(xtype = ejstcustom):

  • Ejst.CustomWidget という名前の Javascript オブジェクトです。

  • 次の場所にある CustomWidget.js Javascript ファイルで定義されます。

    /apps/extjstraining/clientlib/js/CustomWidget.js

  • CQ.form.CompositeFieldウィジェットを拡張します。

  • 次の3つのフィールドがあります。hiddenField(テキストフィールド)、allowField(ComboBox)、otherField(テキストフィールド)

  • CQ.Ext.Component#initComponentを上書きして3つのフィールドを追加します。

    • allowFieldCQ.form. タイプ「select」のSelectionobjectです。optionsProviderは、ダイアログで定義されたCustomWidgetのoptionsProvider設定でインスタンス化されるSelectionオブジェクトの設定です
    • otherField は、CQ.Ext.form.TextField オブジェクトです。
  • CQ.form.CompositeFieldのメソッドsetValuegetValueおよびgetRawValueを上書きして、次の形式のCustomWidgetの値を設定および取得します。

    <allowField value>/<otherField value>, e.g.: 'Bla1/hello'

  • 自分自身を' ejstcustom' xtypeとして登録します。

    CQ.Ext.reg('ejstcustom', Ejst.CustomWidget);

Custom Multifield ウィジェットベースのダイアログは、次のように表示されます。

screen_shot_2012-02-01at115840am

例 2:カスタム Treebrowse ウィジェット

カスタム Treebrowse ウィジェットベースのダイアログには、1 つのタブを持つウィンドウが表示されます。このタブには、カスタムパス参照ウィジェットが含まれています。このウィジェットで矢印をクリックすると、ウィンドウが開き、階層を参照しながら項目を選択できます。項目を選択すると、そのパスがパスフィールドに追加され、ダイアログを閉じても保持され続けます。

カスタム treebrowse ダイアログ:

  • ノードによって定義されます(ノードタイプ= cq:Dialog、xtype = dialog)。

  • 1つのパネル(node type = cq:Widget、xtype = panel)を含む1つのtabpanelウィジェット(node type = cq:Widget、xtype = tabpanel)を表示します。

  • このパネルにはカスタムウィジェット(node type = cq:Widget、xtype = ejstbrowse)があります。

  • 次の場所にあるtreebrowseノードによって定義されます。

    /apps/extjstraining/components/customwidgets/treebrowse

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/customwidgets/treebrowse.-1.json

カスタム treebrowse ウィジェット(xtype = ejstbrowse):

  • Ejst.CustomWidget という名前の Javascript オブジェクトです。

  • 次の場所にある CustomBrowseField.js Javascript ファイルで定義されます。

    /apps/extjstraining/clientlib/js/CustomBrowseField.js

  • CQ.Ext.form.TriggerFieldを拡張します。

  • browseWindow という名前の参照ウィンドウを定義します。

  • 矢印をクリックしたときに参照ウィンドウを表示するようにCQ.Ext.form.TriggerFieldを上書きします。

  • CQ.Ext.tree.TreePanelオブジェクトを定義します。

    • /bin/wcm/siteadmin/tree.jsonに登録されたサーブレットを呼び出すことで、データを取得します。
    • ルートは「apps/extjstraining」です。
  • windowオブジェクト(CQ.Ext.Window)を定義します。

    • 事前定義済みのパネルに基づいています。
    • 選択されたパスの値を設定し、パネルを非表示にする「OK」ボタンを組み込みます。
  • ウィンドウは、「パス」フィールドの下に固定されます。

  • 選択されたパスは、show イベントが発生したときに、参照フィールドからウィンドウに渡されます。

  • 自分自身を' ejstbrowse' xtypeとして登録します。

    CQ.Ext.reg('ejstbrowse', Ejst.CustomBrowseField);

Custom Treebrowse​ウィジェットベースのダイアログを使用するには:

  1. カスタムウィジェット​コンポーネントのダイアログを、カスタムツリー参照​ダイアログに置き換えます。

    例2で説明されている手順に従います。シングルパネルダイアログ

  2. コンポーネントを編集します。次のようなダイアログが表示されます。

screen_shot_2012-02-01at120104pm

例 3:リッチテキストエディター(RTE)プラグイン

リッチテキストエディター(RTE)プラグイン​ベースのダイアログは、大括弧内にカスタムテキストを挿入するためのカスタムボタンがあるリッチテキストエディターベースのダイアログです。カスタムテキストをサーバー側ロジックで解析し、例えば、特定のパスで定義されたテキストを追加することができます(この例では、サーバー側ロジックは実装されていません)。

RTE プラグイン​ベースのダイアログ:

  • 次の場所にあるrtepluginノードによって定義されます。

    /apps/extjstraining/components/customwidgets/rteplugin

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/customwidgets/rteplugin.-1.json

  • rtePluginsノードには、プラグインの名前にちなんだ子ノードinserttext(ノードタイプ= nt:unstructured)があります。 このノードには、RTE で使用可能なプラグイン機能を定義する features という名前のプロパティがあります。

RTE プラグイン:

  • Ejst.InsertTextPlugin という名前の Javascript オブジェクトです。

  • 次の場所にある InsertTextPlugin.js Javascript ファイルで定義されます。

    /apps/extjstraining/clientlib/js/InsertTextPlugin.js

  • CQ.form.rte.plugins.Pluginオブジェクトを拡張します。

  • 次のメソッドは、CQ.form.rte.plugins.Plugin オブジェクトを定義するもので、プラグインの実装時に上書きされます。

    • getFeatures() は、プラグインが使用可能にするすべての機能の配列を返します。
    • initializeUI() RTEツールバーに新しいボタンを追加します。
    • notifyPluginConfig() ボタンにカーソルを合わせると、タイトルとテキストが表示されます。
    • execute() が呼び出され、プラグインのアクションが実行されます。含めるテキストを定義するウィンドウが表示されます。
  • insertText() 対応するダイアログオブジェクトを使用してテキ Ejst.InsertTextPlugin.Dialog ストを挿入します(後で参照)。

  • executeInsertText() は、ダイアログの apply() メソッドによって呼び出され、「 ​OK」ボタンがクリックされたときにトリガーされます。

  • 自分自身を「inserttext」プラグインとして登録します。

    CQ.form.rte.plugins.PluginRegistry.register("inserttext", Ejst.InsertTextPlugin);

  • Ejst.InsertTextPlugin.Dialog オブジェクトは、プラグインのボタンがクリックされたときに開くダイアログを定義します。このダイアログは、1 つのパネル、1 つのフォーム、1 つのテキストフィールドおよび 2 つのボタン(「OK」と「キャンセル」)から構成されます。

リッチテキストエディター(RTE)プラグイン​ベースのダイアログを使用するには:

  1. カスタムウィジェット​コンポーネントのダイアログを、リッチテキストエディター(RTE)プラグイン​ベースのダイアログに置き換えます。

    例2で説明されている手順に従います。シングルパネルダイアログ

  2. コンポーネントを編集します。

  3. 右側の最後のアイコン(4つの矢印の付いたアイコン)をクリックします。 パスを入力して「OK」をクリックします。

    パスは角括弧([])で囲んで表示されます。

  4. OK」をクリックしてリッチテキストエディターを閉じます。

リッチテキストエディター(RTE)プラグイン​ベースのダイアログは、次のように表示されます。

screen_shot_2012-02-01at120254pm

メモ

この例は、ロジックのクライアント側の部分の実装方法を示しています。プレースホルダー([text])は、サーバー側で明示的に解析する必要があります(例:コンポーネントJSP内)。

Tree Overview

すぐに使用できる CQ.Ext.tree.TreePanel オブジェクトは、ツリー構造のデータをツリー構造 UI として表示できます。Using ExtJS Widgets パッケージに含まれている Tree Overview コンポーネントを見ると、TreePanel オブジェクトを使用して特定のパスの下に JCR ツリーを表示する方法がわかります。このウィンドウ自体は、ドッキングすることも、ドッキング解除することもできます。この例の場合、ウィンドウのロジックは、コンポーネント jsp の <script> タグと </script> タグの間に埋め込まれています。

Tree Overview コンポーネントをサンプルページに組み込むには:

  1. 4. Tree Overview コンポーネントをサンプルページに追加します(サイドキック​にある「Using ExtJS Widgets」タブで)。

  2. このコンポーネントには、次のものが表示されます。

    • タイトルとテキスト
    • プロパティ​リンク。クリックすると、リポジトリに保存されている段落のプロパティが表示されます。リンクをもう一度クリックすると、プロパティが非表示になります。
    • リポジトリをツリーで表現した浮動ウィンドウ。このツリーは展開可能です。

このコンポーネントは、次のように表示されます。

screen_shot_2012-02-01at120639pm

Tree Overview コンポーネント:

  • 次で定義されます。

    /apps/extjstraining/components/treeoverview

  • このコンポーネントのダイアログでは、ウィンドウサイズの設定やウィンドウのドッキング、ドッキング解除が可能です(以下を参照)。

コンポーネント jsp:

  • リポジトリから幅、高さ、ドッキングの各プロパティを取得します。

  • ツリー概要のデータ形式に関するテキストを表示します。

  • ウィンドウのロジックをコンポーネント jsp の Javascript タグの間に埋め込みます。

  • 次で定義されます。

    apps/extjstraining/components/treeoverview/content.jsp

コンポーネント jsp に埋め込まれた Javascript コード:

  • ページからツリーウィンドウの取得を試みることにより、tree オブジェクトを定義します。

  • ツリーを表示するウィンドウが存在しない場合は、treePanel(CQ.Ext.tree.TreePanel)が作成されます。

    • treePanel には、ウィンドウの作成に使用されるデータが含まれています。

    • データは、次で登録されたサーブレットを呼び出すことにより、取得されます。

      /bin/wcm/siteadmin/tree.json

  • beforeloadリスナーは、クリックされたノードが読み込まれたことを確認します。

  • rootオブジェクトは、パスapps/extjstrainingをツリーのルートとして設定します。

  • tree (CQ.Ext.Window)は事前定義に基づいて設定さ treePanelれ、次のように表示されます。

    tree.show();

  • ウィンドウが既に存在する場合、ウィンドウは、リポジトリから取得した幅、高さ、ドッキングの各プロパティに基づいて表示されます。

コンポーネントダイアログ:

  • ツリー概要ウィンドウのサイズ(幅と高さ)を設定するための 2 つのフィールドとウィンドウをドッキング、ドッキング解除するための 1 つのフィールドを持つ 1 つのタブを表示します。

  • ノードによって定義されます(ノードタイプ= cq:Dialog、xtype = panel)。

  • このパネルには、sizefieldウィジェット(node type = cq:Widget、xtype = sizefield)と、2つのオプション(true/false)を持つ選択ウィジェット(node type = cq:Widget、xtype = selection、type = radio)があります。

  • 次の場所にあるdialogノードによって定義されます。

    /apps/extjstraining/components/treeoverview/dialog

  • 次を要求することにより、JSON 形式でレンダリングされます。

    http://localhost:4502/apps/extjstraining/components/treeoverview/dialog.-1.json

  • 次のように表示されます。

screen_shot_2012-02-01at120745pm

Grid Overview

グリッドパネルには、データが行と列の表形式で表示されます。このパネルは、次の内容から構成されています。

  • ストア:データレコード(行)を保持しているモデル。
  • 列モデル:列の構成。
  • ビュー:ユーザーインターフェイスが含まれます。
  • 選択モデル:選択の動作。

Using ExtJS Widgets​パッケージに含まれるGrid Overviewコンポーネントでは、データを表形式で表示する方法を示します。

  • 例 1 では、静的データを使用しています。
  • 例2では、リポジトリから取得したデータを使用します。

Grid Overviewコンポーネントをサンプルページに含めるには:

  1. 5. Grid Overview コンポーネントをサンプルページに追加します(サイドキック​にある「Using ExtJS Widgets」タブで)。

  2. このコンポーネントには、次のものが表示されます。

    • タイトルとテキスト
    • プロパティ​リンク。クリックすると、リポジトリに保存されている段落のプロパティが表示されます。リンクをもう一度クリックすると、プロパティが非表示になります。
    • 表形式のデータを含む浮動ウィンドウ。

このコンポーネントは、次のように表示されます。

screen_shot_2012-02-01at121109pm

例 1:デフォルトグリッド

すぐに使用できるバージョンの場合、Grid Overview コンポーネントには、静的データが表形式で含まれているウィンドウが表示されます。この例の場合、ロジックは、コンポーネント jsp に 次の 2 つの方法で埋め込まれます。

  • 一般的なロジックは、<script> タグと </script> タグの間に定義されます。
  • 特定のロジックは、個別の .js ファイルで用意され、jsp にリンクされます。このような設定であるので、<script> タグを必要に応じてコメント化すれば、2 つのロジック(静的/動的)を簡単に切り替えることができます。

Grid Overview コンポーネント:

  • 次で定義されます。

    /apps/extjstraining/components/gridoverview

  • このコンポーネントのダイアログでは、ウィンドウサイズの設定やウィンドウのドッキング、ドッキング解除が可能です。

コンポーネント jsp:

  • リポジトリから幅、高さ、ドッキングの各プロパティを取得します。

  • グリッド概要のデータ形式の紹介としてテキストを表示します。

  • GridPanel オブジェクトを定義する Javascript コードを参照します。

    <script type="text/javascript" src="/apps/extjstraining/components/gridoverview/defaultgrid.js"></script>

    defaultgrid.js では、一部の静的データをGridPanelオブジェクトの基礎として定義します。

  • GridPanel オブジェクトを使用する Window オブジェクトを Javascript コードで定義して、Javascript タグの間に埋め込みます。

  • 次で定義されます。

    apps/extjstraining/components/gridoverview/content.jsp

コンポーネント jsp に埋め込まれた Javascript コード:

  • ページからウィンドウコンポーネントの取得を試みることにより、grid オブジェクトを定義します。

    var grid = CQ.Ext.getCmp("<%= node.getName() %>-grid");

  • gridが存在しない場合、CQ.Ext.grid.GridPanelオブジェクト(gridPanel)は、getGridPanel()メソッドを呼び出すことで定義されます(以下を参照)。 このメソッドは、defaultgrid.js で定義されます。

  • grid は、事前 CQ.Ext.Window定義済みのGridPanelに基づくオブジェクトで、次のように表示されます。 grid.show();

  • gridが既に存在する場合は、リポジトリから取得した幅、高さ、ドッキングの各プロパティに基づいて表示されます。

コンポーネントjspで参照されるJavaScriptファイル( defaultgrid.js )では、JSPに埋め込まれたスクリプトによって呼び出され、静的データに基づいてCQ.Ext.grid.GridPanelオブジェクトを返すgetGridPanel()メソッドを定義します。 ロジックを次に示します。

  • myData は、静的データの配列で、5 列 x 4 行の表として書式設定されています。

  • store は、を使用す CQ.Ext.data.Store るオブジェクトで myDataす。

  • store はメモリに読み込まれます。

    store.load();

  • gridPanel は、次を使用す CQ.Ext.grid.GridPanel るオブジェクトで storeす。

    • 列幅は常に再調整されます。

      forceFit: true

    • 選択できる行は一度に 1 つのみです。

      singleSelect:true

例 2:参照検索グリッド

パッケージをインストールすると、Grid Overview​コンポーネントのcontent.jspに、静的データに基づくグリッドが表示されます。 次の特徴を持つグリッドを表示するようにコンポーネントを変更することが可能です。

  • 3 つの列を持つ。
  • サーブレットを呼び出すことにより、リポジトリから取得したデータを基礎にする。
  • 最後の列のセルを編集できる。この値は、先頭の列に表示されたパスで定義されたノードの下にある test プロパティに保持されます。

前の節で説明したように、windowオブジェクトは、/apps/extjstraining/components/gridoverview/defaultgrid.jsにあるdefaultgrid.jsファイルで定義されているgetGridPanel()メソッドを呼び出して、CQ.Ext.grid.GridPanelオブジェクトを取得します。 Grid Overview​コンポーネントは、/apps/extjstraining/components/gridoverview/referencesearch.jsにあるreferencesearch.jsファイルで定義されている、getGridPanel()メソッドに対して異なる実装を提供します。 コンポーネント jsp で参照される .js ファイルを切り替えることにより、グリッドは、リポジトリから取得したデータに基づくようになります。

コンポーネント jsp で参照される .js ファイルを切り替えます。

  1. CRXDE Lite で、コンポーネントの content.jsp ファイル内にある defaultgrid.js ファイルを含む行をコメント化します。次のようになります。

    <!-- script type="text/javascript" src="/apps/extjstraining/components/gridoverview/defaultgrid.js"></script-->

  2. referencesearch.js ファイルを含む行からコメントを削除します。次のようになります。

    <script type="text/javascript" src="/apps/extjstraining/components/gridoverview/referencesearch.js"></script>

  3. 変更内容を保存します。

  4. サンプルページを更新します。

このコンポーネントは、次のように表示されます。

screen_shot_2012-02-01at121429pm

コンポーネントjspで参照されるJavaScriptコード(referencesearch.js)は、コンポーネントjspから呼び出されるgetGridPanel()メソッドを定義し、リポジトリから動的に取得されるデータに基づいてCQ.Ext.grid.GridPanelオブジェクトを返します。 referencesearch.js のロジックでは、一部の動的データが GridPanel の基礎として定義されています。

  • reader は、JSON 形式のサーブレット応答を読み取る 3 列用の CQ.Ext.data.JsonReader オブジェクトです。

  • cm は3列 CQ.Ext.grid.ColumnModel のオブジェクトです。

    「テスト」列のセルは、editor で定義されているので、編集することが可能です。

    editor: new CQ.Ext.form.TextField({})

  • 列は並べ替え可能です。

    cm.defaultSortable = true;

  • store はオブジェクト CQ.Ext.data.GroupingStore です。

    • クエリのフィルタリングに使用するパラメーターをいくつか指定して、「 /bin/querybuilder.json 」に登録されたサーブレットを呼び出すことで、データを取得します
    • 前に定義した reader に基づきます。
    • 表は、「jcr:path」列に従って、昇順で並べ替えられます。
  • gridPanel は、編集 CQ.Ext.grid.EditorGridPanel 可能なオブジェクトです。

    • 事前定義済みの store と列モデル cm に基づいています。

    • 選択できる行は一度に 1 つのみです。

      sm: new CQ.Ext.grid.RowSelectionModel({singleSelect:true})

    • afteredit リスナーは、「テスト」列のセルが編集されたことを確認します。

      • jcr:path」列で定義されたパスにあるノードのプロパティ「test」は、セルの値を使用してリポジトリに設定されます
      • POST が成功した場合は、値が store オブジェクトに追加されます。POST が失敗した場合は、値が拒否されます。

このページ