1

数日前から、デフォルトですべてのダッシュレットのタイトル バーにカスタム アクションを追加する最良の方法を見つけるのに苦労しています。

この段階で、すべてのダッシュレットの Web スクリプトでアクションがウィジェットとして設定されていることがわかります。たとえば、docsummary.get.js では次のようになります。

   var dashletTitleBarActions = {
      id : "DashletTitleBarActions",
      name : "Alfresco.widget.DashletTitleBarActions",
      useMessages : false,
      options : {
         actions: [
             {
                cssClass: "help",
                bubbleOnClick:
                {
                   message: msg.get("dashlet.help")
                },
                tooltip: msg.get("dashlet.help.tooltip")
             }
         ]
      }
   };
   model.widgets = [docSummary, dashletResizer, dashletTitleBarActions];

次に、ページがレンダリングされるときにウィジェットがインスタンス化されます。

私は次のアプローチを考え出しました:

  1. ページがレンダリングされるたびに、カスタム JS スニペットで必要なアクションを使用して、すべてのウィジェット インスタンスの「アクション」配列を拡張します。次のような手法を使用して成功せずにいくつかのテストを実行しました: http://acidmartin.wordpress.com/2012/03/19/getting-instance-names-of-a-javascript-object/

  2. カスタム アクションを追加して、Alfresco.widget.DashletTitleBarActions のプロトタイプを変更します。貼り付けた上記のコードでわかるように、ウィジェットがインスタンス化されると「アクション」オブジェクトが常にオーバーライドされるため、どちらも機能しないと思います。

  3. Dave Drapper が彼の投稿http://blogs.alfresco.com/wp/ddraper/2012/05/22で説明しているように、すべての Alfresco.widget.DashletTitleBarActions ウィジェット定義にカスタム アクションを追加するすべてのダッシュレットの Web スクリプト用の拡張モジュールを作成します。 /customizing-share-javascript-widget-instantiation-part-1/

  4. すべてのダッシュレット div コンテナーを取得し、ページの準備ができたら、DOM を直接操作して必要なアクションを追加します。それは機能するはずですが、少し汚れていて一貫性がないと思うので、避けたいと思います。

誰もがより良い実行可能な解決策を想像できますか??

4

2 に答える 2

4

単一の既存のダッシュレットにアクションを追加することから始めましょう。(3) で提案したように、拡張モジュールを定義して、モデルをインターセプトおよび変更することにより、ダッシュレットの動作を変更できます。

拡張モジュールの作成については、ブログ記事とフォローアップ記事で詳しく説明されていますが、ここでの秘訣は、DashletTitleBarActionsウィジェットを見つけてそれにアクションを追加するコントローラー JavaScript 拡張機能を提供することです。

if (model.widgets)
{
    for (var i = 0; i < model.widgets.length; i++)
    {
        var widget = model.widgets[i];
        if (widget.id == "DashletTitleBarActions")
        {
            widget.actions.push({...})
        }
    }
}

オブジェクト リテラルに入力する内容は、アクションの実装方法によって異なります。クライアント側の動作 (静的リンクではなく) が必要な場合は、それをバインドする必要もあります。例CustomEventについては、RSS フィード ダッシュレットを参照してください。org/alfresco/components/dashlets/rssfeed.get.html.ftl

拡張モジュールの欠点は、ダッシュレットごとに明示的な拡張 JS ファイルを定義する必要があることです。上記のコードを中央のファイルに簡単に配置し、必要な各ダッシュレット拡張に含めることができます。

<import resource="classpath:alfresco/site-webscripts/org/myco/utils/dashlet.utils.js">
于 2013-01-29T18:15:13.013 に答える
1

ここで国道2号線に入ります。

このウィジェットの定義は、share.js ファイル ({share.context}/js/share.js) にあります。Alfresco 4.2 では、DashletTitleBarActions が 1700 行目あたりで定義されています。ウィジェットのonReadyハンドラーには、アクションを処理するループがあります。

 // Reverse the order of the arrays so that the first entry is furthest to the left...
        this.options.actions.reverse();
        // Iterate through the array of actions creating a node for each one...
        for (var i = 0; i < this.options.actions.length; i++)
        {

ご覧のとおり、アクションパラメータの順序を逆にしてから、開始を追加してアクションをループさせます。したがって、アクションを最初にするか最後にするかによって、おそらくこのファイルを編集してカスタム アクションを追加できます。

myAction = {
"cssClass": "customCSS"
, "tooltip": this.msg("slingshot.messages.generic.tooltip")
, "eventOnClick": ...
...
}
this.options.actions.push(myAction);
// now move on with the rest of the loop
for (...)

もちろん、それには共有の独自の js ファイルを上書きする必要があり、それを拡張する必要はありません。それができない場合は、share.js も含まれる各ページにカスタム JS ファイルを含め、share.jsの後、ウィジェットの準備が整う前に実行されるようにし、 onReadyを上書きする必要があります。これを行うためのウィジェット自体のメソッド。

于 2013-01-29T21:25:39.667 に答える