6

コンテンツのブロックが見出しの下に保持され、一度に 1 つの見出ししか表示されない単純なアコーディオンのコンポーネントを作成しようとしています。私の推奨する実装では、2 つのコンポーネントを使用します。1 つはアコーディオン全体を表し、2 番目のコンポーネントは単一のエントリを表します。

コンテンツの作成者は、サイドキックからアコーディオンをプルして、1 つまたは複数のアコーディオン アイテムをアコーディオンにドロップできますが、他のコンポーネントをここにドロップすることはできません。アコーディオン アイテムは、アコーディオン コンポーネントにのみドロップできる必要があり、他の parsys 内にはドロップできません。

私の問題は、現在、他のコンテンツをアコーディオンに追加し、アコーディオンの外側にアコーディオン アイテムを追加できることです。

これを解決するための最初の試みは次のとおりです。

foobar/components/accordion
foobar/components/accordion/accordion.jsp
foobar/components/accordion/cq:editConfig
foobar/components/accordion/dialog
foobar/components/accordion/accordionitem
foobar/components/accordion/accordionitem/accordionitem.jsp
foobar/components/accordion/accordionitem/cq:editConfig
foobar/components/accordion/accordionitem/dialog

これらは、これからの構成ファイルです。

アコーディオン/.content.xml

<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
    xmlns:cq="http://www.day.com/jcr/cq/1.0"
    xmlns:jcr="http://www.jcp.org/jcr/1.0"
    cq:isContainer="{Boolean}true"
    jcr:primaryType="cq:Component"
    jcr:title="Accordion"
    sling:resourceSuperType="foundation/components/parbase"
    allowedChildren="[*/accordion/accordionitem]"
    allowedParents="[*/parsys]"
    componentGroup="General"/>

アコーディオン/_cq_editConfig.xml

<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0"
    xmlns:jcr="http://www.jcp.org/jcr/1.0"
    cq:actions="[-,edit,-,delete]"
    cq:layout="editbar"
    jcr:primaryType="cq:EditConfig">
    <cq:listeners
        jcr:primaryType="cq:EditListenersConfig"
        aftercopy="REFRESH_PAGE"
        afterdelete="REFRESH_PAGE"
        afterinsert="REFRESH_PAGE"/>
</jcr:root>

ダイアログは空白で、コンポーネントがサイドキックに表示されるようにするためだけに存在します。

accordion.jsp には、基礎となる parsys が含まれているだけです。

アコーディオン/accordionitem/.content.xml

<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
    xmlns:cq="http://www.day.com/jcr/cq/1.0"
    xmlns:jcr="http://www.jcp.org/jcr/1.0"
    jcr:primaryType="cq:Component"
    jcr:title="Accordion Item"
    sling:resourceSuperType="foundation/components/parbase"
    allowedParents="[*/accordion]"
    componentGroup="General"/>

アコーディオン項目ダイアログはタイトルを受け取ります。editConfig はツールバーを追加するだけで、リスナーは追加しません。

accordionitem.jsp は、ダイアログから取得したタイトルを出力し、parsys を持っています。

私の問題は、parsys が accordion および accordionitem コンポーネントのルールを使用していないことです。代わりに、上書きされない限り、代わりに次の parsys から継承するように見えます。

ページで編集モードを使用して適切なコンポーネントを選択することでコンポーネントを正しく設定できますが、それではテンプレートに対して情報が設定されるため、すべてのページ テンプレートに対して同じ構成を実行する必要があります。私が望むのは、それが一度存在するように、代わりにコンポーネント定義で定義することです。

最初にコンポーネントを書いた後、まったく同じシーンを説明しているこのブログを見つけました: http://jenikya.com/blog/2012/03/cq5-accordion-component.html

それを参照して、代わりに accordion.jsp 内で使用する parsys の拡張機能を追加してみました。これはコードに違いをもたらさなかったので、私のカスタム parsys でさえ、アコーディオン項目以外のコンポーネントを追加することができました。

何が間違っているのか、または他のアプローチを取るべきかについてのガイダンスは大歓迎です。

4

2 に答える 2

0

これは、AEM における非常に一般的な問題ステートメントです。これを処理する方法はいくつかありますが、ビジネス ニーズと設計でこれをどのようにマッピングするかによって異なります。これには 2 つの解決策を提案できます。 1. アコーディオン コンポーネントにテンプレート レベルの設計制限を適用します。つまり、アコーディオン コンポーネントをドロップしてから、ページのデザイン モードに移動し、アコーディオン パーでアコーディオン アイテム コンポーネントを選択します。これは 1 回限りのアクティビティです。

オプション #2 をお勧めしますが: 2. アコーディオン コンポーネント ダイアログで、マルチリストを使用してアコーディオン項目を追加するよう作成者に依頼します。- 新しいアイテムを追加するには、アコーディオン ダイアログを開いてマルチリストにアイテムを追加し、アコーディオン ID を入力します。- アイテムを削除するには、ダイアログを開いてマルチリストからアイテムを削除します - 位置を変更するには、マルチリスト内のアイテムを再配置します。アコーディオン ダイアログで作成者が入力したマルチリスト アイテムの数に基づいて、アコーディオン アイテム コンポーネントを静的に含め、作成者がマルチリストに入力したコンポーネント ID を指定します。

このアプローチを使用すると、 - アコーディオン内のコンポーネントを簡単に制限できます。- サイドキックの 1 つのコンポーネント (アコーディオン アイテム) を削減 - ページ上の 1 つの parsys を削減 (非常に多くの parsys がオーサリング パフォーマンスを犠牲にする)

于 2015-09-16T05:59:34.673 に答える