2016-03-31 1 views
3

は、私は思っていました。

EDIT:2014年5月4日の時点で

、それはthis blogによると、ことはできませんでした。 これについてのニュースはありますか?

+0

それは、例えば、@コンテキスト= 'styleString' 明示的を使用しての必要性を排除することができるカスタム属性を作成するには、確かに、素晴らしいことです。 –

答えて

0

EDIT:必要なクラスimplが入ってくるバンドルからエクスポートされないため、この時点では実行できないように見えます。Radu Cotescuがコメント内でそれを指摘してくれてありがとうございます。

以下、私の元の回答を残します。誰かが本当に必要か、githubの上のスリングレポをフォークし、追加/独自のプラグインを展開するか、単に必要なimplパッケージをエクスポートしてみると、あなた自身のコードベース



にプラグインを追加することができますし、単にたい場合Sightlyのソースコードでは、プラグインと呼ばれるもののリストを見ることができます。これは目に見えるブロックステートメントのそれぞれの実装を提供します。 https://github.com/apache/sling/tree/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/plugin

これは単なる推測です、と私はまだそれを試していないが、それはあなたがorg.apache.sling.scripting.sightly.impl.plugin.PluginComponentを拡張し、Plugin OSGiサービスで独自のクラスを提供することができるかもしれように思える:それらはここで見つけることができます。私は、既存のプラグインの1つをコピーして、新しい名前で動作させることができるかどうかを確認します。たぶんTextPlugin、それはかなりまっすぐ進むようです。

うまくいけば、これはいくつかの楽しみにつながる方向にあなたを指します:)

をおそらく

@Component 
@Service(Plugin.class) 
@Properties({ 
     @Property(name = Plugin.SCR_PROP_NAME_BLOCK_NAME, value = "foo"), 
     @Property(name = Plugin.SCR_PROP_NAME_PRIORITY, intValue = 9) 
}) 
public class FooPlugin extends PluginComponent { 

    @Override 
    public PluginInvoke invoke(final Expression expression, PluginCallInfo callInfo, final CompilerContext compilerContext) { 
     return new DefaultPluginInvoke() { 

      @Override 
      public void beforeChildren(PushStream stream) { 
       String variable = compilerContext.generateVariable("fooContent"); 
       stream.emit(new VariableBinding.Start(variable, 
         compilerContext.adjustToContext(expression, MarkupContext.TEXT, ExpressionContext.TEXT).getRoot())); 
       stream.emit(new OutVariable(variable)); 
       stream.emit(VariableBinding.END); 
       Patterns.beginStreamIgnore(stream); 
      } 

      @Override 
      public void afterChildren(PushStream stream) { 
       Patterns.endStreamIgnore(stream); 
      } 
     }; 
    } 
} 

このような何かが、その後、見た目のファイルにそれを使用

<div data-sly-foo="${properties.jcr:description}">This text should get replaced</div> 

I私が試してみるとこの答えが更新されます。

メモ:実際のシナリオでこれを実行しようとしている場合は、この方法で解決しようとしている問題を解決するためのより良い方法があります。視覚的なチームは、目に見えるものをするために必要なものすべてを私たちに提供しようとしました。

+0

私はこれをいつか戻してみましたが、うまくいきませんでした。どういうわけか、FooPluginはpluginregistryでは利用できません。プラグインfooが存在しないというエラーが表示されることになります。とにかく、私たちはいくつかの理由でこのアプローチ(カスタムattrの作成)を追求しませんでした。 – awd

+0

新しい 'data-sly- *'ブロック要素をサポートするカスタムプラグインを登録することはできません。 OSGiはDI用に使用されていますが、 'impl'パッケージはエクスポートされないため、バンドルの外側には表示されません。 –

+0

ああ、それは良い点@RaduCotescuです。私の答えを更新し、あなたをアップしました:-) –

3

いいえ、独自のブロック要素を作成することはできません。その実装は仕様[0]に準拠していないためです。新しいプラグインを追加するだけではなく、同じHTML要素で複数のブロックが使用されているときにブロック要素の優先順位が設定されます。これが可能であれば、提供されたプラグインを無効にすることはできません。

しかし、新しいブロック要素が必要と思われる場合は、明確に定義されたユースケースで仕様にプルリクエストを送信してください。さらに、Apache Sling開発メーリングリスト[1]でユースケースについて話し合うと助けになるでしょう - あなたが必要とするのは他の開発者も考えていることかもしれません。その場合、コラボレーションは最適な解決策を見つけるのに間違いなく役立ちます問題に

[0] - https://github.com/Adobe-Marketing-Cloud/sightly-spec/blob/1.2/SPECIFICATION.md
[1] - https://sling.apache.org/project-information.html#mailing-lists

+0

私たちはユースケースを別の方法で解決しましたが、今後は間違いなくそれを見ていきます。私はAngularの属性ディレクティブのようなものを考えていました。 – Alfeu

+0

もちろん、お客様のニーズに合わせてテンプレートエンジンを拡張したいというユースケースもあります。エンジンをよりダイナミックかつフレキシブルにするためにAPIを閉じる理由コアの内容をロックアウトしたままにしておくことはできますが、顧客のニーズに合わせて拡張し調整することができます。私は、仕様の有効なユースケースとなる一般的なものについて話しているわけではありませんが、それよりも...既存のプラグインのフィルターを作成することはできません。私は非常に気に入っていますが、何らかの形で拡張する可能性のないテンプレートエンジンを使用したことはありません。 – d33t

関連する問題