2012-02-08 26 views
5

ポートレットXがLiferayにデプロイされ、フレンドリなURLがマップされているとします。ユーザーがマップされたURLを介してLiferayポータルに入ったが、ポートレットがポータルに存在しないとします。これはデプロイされていますが、ページに追加されていません。ポートレットが存在しないときにLiferayに警告する

私の問題は、ユーザーがマップされたURLを使用する場合、何も起こらないということである - ポータルには視覚的なフィードバックを与えない、対象ポートレットが存在しないこと。

どうすれば変更できますか?私は

...ユーザーに警告/予告のいくつかの種類が必要 - 編集 -

私はまだ別のポートレットの存在を確認するために2番目のポートレットを使用する必要はありません。

親切よろしく、

答えて

4

私の知る限りでは、それを実現するために何natual方法はありません。ポートレットは、常にページにインストールする必要はありません。だから、その行動はかなり正常です。私は考えることができ

一つではなくハックソリューション:

  1. JSPスコープに暗黙オブジェクトthemeDisplayを公開します<liferay-theme:defineObjects />を使用してJSPでThemeDisplayオブジェクトのホールドを取得します。

  2. は使用タイプの設定文字列のホールドを取得する:あなたがIDを持つ非instanceableポートレットを持っているのであれば

    layout-template-id=foobar_2column 
    sitemap-include=1 
    column-1=foo_WAR_barportlet,abc_WAR_barportlet,56_INSTANCE_K4Vv, 
    column-2=baz_WAR_xyzportlet, 
    sitemap-changefreq=daily 
    
  3. String typeSettings = themeDisplay.getLayout().getTypeSettings(); 
    
  4. タイプの設定は、以下のような値を持つことになりますfoo WAR ファイルbarの場合、レイアウト上のポートレットの一意のIDは foo_WAR_barportletになります。

  5. 存在すると予想されるポートレットIDがわかったら、 という文字列の問題が含まれています。

    <% if(!typeSettings.contains("foo_WAR_barportlet")) { %> 
        <h3 style="color: red">Alert! Portlet foo_WAR_barportlet not installed.</h3> 
    <% } %> 
    

あなたも、テーマ内で上記の手順を行うことができますが、その後、代わりのJavaの速度でそれを行う必要があるでしょう。希望が役立ちます。

あなたが内部でこの行を追加することができます

EDITあなたportal_normal.vm

#if(!$layout.getTypeSettings().contains("foo_WAR_barportlet")) 
    <h3 style="color: red">Alert! Portlet foo_WAR_barportlet not installed.</h3> 
#end 
+0

このコードはどこに追加しますか? – Queequeg

+0

これをテーマに追加することはできますが、テーマがVelocityで書かれているので、少し修正する必要があります。 – adarshr

+0

@Queequegは、魔法のように動作 – adarshr

1

はいポートレットが追加されているかどうかをユーザに通知するため、ポートレット間通信を使用していることを達成することができますページかどうか。デフォルトではページに置かれている別のポートレット(ListenerPortletと呼ぶ)を作成する必要があります。

テーマにリスナー・ポートレットを追加すると、すべてのページにデフォルトで追加されます。

ポートレットをページに追加すると、ポートレットはクライアント側のJavaScriptイベントをトリガーし、ポートレットがページに追加されたことをリスナー・ポートレットに通知する必要があります。

ポートレット・コールから

Liferay.trigger(eventName, data) 

Liferay.bind(eventName, function, [scope]) //make the scope as page 

にイベントにポートレットをページに追加されているかどうか、あなたのリスナーのポートレットが知っているこの方法は、あなたのリスナーのポートレットをバインドします。ポートレットが追加されていない場合は、ユーザーにメッセージを表示できます。さらに参考のために

IPC

をチェックして、より具体的にclient-side Inter portlet communicaton

+0

返事ありがとうございます。最初のポートレットと同じように簡単にスイッチをオフにすることができます。別のポートレットよりもLiferay Portalによって表示されるユニバーサルアラートが必要です。 – Queequeg

+0

liferayによって提供される直接的な方法はありません。これは、ポートレットがページに追加されたかどうかを示します。 –

0

我々はこれをしようとした場合、リストが空の場合、ページのdoesntのはどのポートレットが含まれている

ThemeDisplay themeDisplay = request.getAttribute(WebKeys.THEME_DISPLAY); 

Layout layout = LayoutLocalServiceUtil.getLayout(themeDisplay.getLayout().getPlid()); 
LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType(); 

List allPortletIds = layoutTypePortlet.getPortletIds(); 

、良いだろう。

を取得するLayoutTypePortletは、ユーザーがリダイレクトされたページがレイアウトタイプのポートレットであることを保証します。

+0

このコードはどこに追加しますか? – Queequeg

+0

@sharanbm、これは良いアイデアですが、このコードはポートレットに入り、ページに追加する必要があります。 –

+0

@Queequeg MVCPortletを作成し、このコードをその中に入れ、そのポートレットをページに追加する必要があります。 –

関連する問題