web-dev-qa-db-ja.com

AEM 6.0:data-sly-resourceを使用する場合の追加パラメーター?

比較的簡単なことを実装しようとしています... data-sly-resourceタグを介して内部に別のコンポーネント(内部コンポーネントと呼びます)を含む1つのコンポーネント(ラッパーコンポーネントと呼びます)があります:

<div data-sly-resource="${ 'inner' @ resourceType='/projectname/components/inner' }"></div>

このタグを使用していくつかの追加パラメーターを渡したいのですが、具体的には、内部コンポーネントテンプレートで視覚的に取得できるパラメーターですか?コンポーネントがdata-sly-resourceを介して呼び出されたときに渡されるパラメーターに基づいて、内部テンプレートの外部htmlタグがラップ解除されるかどうかを指定しようとしています。

見た目の良いドキュメントを実験して熟読した後、これを達成する方法を見つけることができません。

これが可能かどうか誰かが知っていますか?

どうもありがとう、

デイブ

12
David Woollard

ここで提案されている代替案 が機能しない場合は、Use-APIを使用してリクエスト属性を読み書きできます。

外側のコンポーネントが属性を設定し、内側のコンポーネントによって表示される2つのコンポーネントの簡単な例:

/apps/siteName/components/
    outer/ [cq:Component]
        outer.html
    inner/ [cq:Component]
        inner.html
    utils/ [nt:folder]
        setAttributes.js
        getAttributes.js
/content/outer/ [sling:resourceType=siteName/components/outer]
    inner [sling:resourceType=siteName/components/inner]

/apps/siteName/components/outer/outer.html:

<h1>Outer</h1>
<div data-sly-use="${'../utils/setAttributes.js' @ foo = 1, bar = 2}"
     data-sly-resource="inner"></div>

/apps/siteName/components/inner/inner.html:

<h1>Inner</h1>
<dl data-sly-use.attrs="${'../utils/getAttributes.js' @ names = ['foo', 'bar']}"
    data-sly-list="${attrs}">
    <dt>${item}</dt> <dd>${attrs[item]}</dd>
</dl>

/apps/siteName/components/utils/setAttributes.js:

use(function () {
    var i;
    for (i in this) {
        request.setAttribute(i, this[i]);
    }
});

/apps/siteName/components/utils/getAttributes.js:

use(function () {
    var o = {}, i, l, name;
    for (i = 0, l = this.names.length; i < l; i += 1) {
        name = this.names[i];
        o[name] = request.getAttribute(name);
    }
    return o;
});

/content/outer.htmlにアクセスしたときの結果の出力:

<h1>Outer</h1>
<div>
    <h1>Inner</h1>
    <dl>
        <dt>bar</dt> <dd>2</dd>
        <dt>foo</dt> <dd>1</dd>
    </dl>
</div>

@AlasdairMcLeayがコメントしたように、この提案されたソリューションには、内部コンポーネントがリクエストに複数回含まれている場合に問題があります。コンポーネントの後続のインスタンスには、最初に設定された属性が引き続き表示されます。

これは、(getAttributes.jsで)アクセスされた瞬間に属性を削除することで解決できます。ただし、内部コンポーネントが複数のSightly(またはJSP)ファイルに分割され、すべてがこれらの属性にアクセスする必要がある場合、これも問題になります。これは、要求属性にアクセスする最初のファイルでもそれらが削除されるためです。

これは、属性にアクセスするときに属性を削除するかどうかを示すフラグを使用してさらに回避できます...しかし、基本的にグローバル変数を使用することで構成されるため、要求属性の使用が適切なパターンではない理由も示しています。コンポーネント間で通信します。したがって、 ここで提案されている他の2つのソリューション がオプションでない場合は、これを回避策と見なしてください。

8
Gabriel Walt

Data-sly-includeとdata-sly-resourceに request-attributesを設定できます という新しい機能があります:

<sly data-sly-include="${ 'something.html' @ requestAttributes=amapofattributes}" />

残念ながら、HTL(= Sightly)式を使用してマップを作成することはできないようです。また、HTLからリクエスト属性を読み取る方法がわからないため、そのためのJava/Jコードが必要です。

5

残念だけど違う。見た目の機能を拡張する方法はありません。新しいdata-sly属性を追加したり、既存の属性を変更したりすることはできません。最善の方法は、 SE API を使用して独自のヘルパーを作成することです。

0
santiagozky