2012-02-08 33 views
5

Giả sử portlet X được triển khai thành Liferay và có một URL thân thiện được ánh xạ. Giả sử người dùng vào Cổng thông tin Liferay qua một URL được ánh xạ nhưng portlet không có trong cổng - nó được triển khai nhưng không được thêm vào trang.Người dùng cảnh báo Liferay khi portlet không hiện diện

Vấn đề của tôi là khi người dùng sử dụng URL được ánh xạ không có gì xảy ra - cổng không đưa ra phản hồi trực quan, rằng portlet đích không có mặt.

Tôi làm cách nào để thay đổi điều đó? Tôi cần một số loại một cảnh báo/thông báo cho người sử dụng ...

- chỉnh sửa -

tôi không cần phải sử dụng một portlet thứ hai để kiểm tra sự hiện diện của thêm một portlet.

liên quan tử tế nhất mà,

Trả lời

4

AFAIK, không có natual cách để làm cho điều đó xảy ra. Một portlet không cần phải luôn được cài đặt trên một trang. Vì vậy, hành vi khá bình thường.

Một thay giải pháp hacky tôi có thể nghĩ ra:

  1. Nhận tổ chức của các đối tượng ThemeDisplay trong một JSP sử dụng <liferay-theme:defineObjects /> đó sẽ phơi bày các đối tượng tiềm ẩn themeDisplay trong phạm vi JSP.

  2. Nhận tổ chức của các chuỗi thiết lập loại sử dụng:

    String typeSettings = themeDisplay.getLayout().getTypeSettings(); 
    
  3. Loại thiết lập này sẽ có giá trị như bên dưới:

    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 
    
  4. Vì vậy, nếu bạn có một portlet phi instanceable với ID foo bên trong WAR tệp bar, ID duy nhất của portlet trên bố cục sẽ là foo_WAR_barportlet.

  5. Khi bạn biết ID portlet mà bạn mong muốn có mặt, nó chỉ là vấn đề chuỗi chứa kiểm tra.

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

Bạn có thể làm các bước trên, ngay cả bên trong một chủ đề, nhưng bạn sẽ phải làm điều đó trong Velocity thay vì Java sau đó. Hy vọng rằng sẽ giúp.

EDIT

Bạn có thể thêm dòng này bên trong của bạn portal_normal.vm

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

tôi sẽ thêm mã này ở đâu? – Queequeg

+0

Bạn có thể thêm điều này vào chủ đề, nhưng sau đó bạn sẽ phải sửa đổi nó một chút khi các chủ đề được viết trong Vận tốc. – adarshr

+0

@Queequeg xem cập nhật của tôi – adarshr

1

Có bạn có thể đạt được điều đó bằng thông tin liên lạc liên portlet, thông báo cho người sử dụng xem các portlet được thêm vào trang hay không. bạn cần tạo một portlet khác (cho phép gọi nó là ListenerPortlet) theo mặc định nằm trên trang.

bạn có thể thêm portlet Trình nghe vào chủ đề, để nó được thêm theo mặc định vào mọi trang.

Bây giờ, khi bạn thêm portlet vào trang của bạn, portlet của bạn sẽ kích hoạt sự kiện javascript phía máy khách và thông báo cho portlet Listener rằng portlet của bạn được thêm vào trang của bạn.

Từ gọi portlet của bạn,

Liferay.trigger(eventName, data) 

và ràng buộc portlet Listener mình vào sự kiện

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

Bằng cách này portlet Listener của bạn sẽ biết nếu portlet của bạn sẽ được thêm vào trang hay không. và bạn có thể hiển thị một tin nhắn cho người dùng nếu portlet không được thêm vào.

Đối với kiểm tra tham khảo thêm các IPC

và đặc biệt hơn client-side Inter portlet communicaton

+0

Cảm ơn bạn đã trả lời. Vấn đề là tôi không muốn một portlet khác - nó có thể được tắt dễ dàng như portlet đầu tiên. Tôi cần một cảnh báo phổ quát được hiển thị thay vì Liferay Portal hơn là một portlet riêng biệt. – Queequeg

+0

Không có phương pháp trực tiếp nào được cung cấp bởi liferay mà sẽ cho biết liệu một portlet được thêm vào một trang hay không. –

0

Sẽ tốt hơn nếu chúng ta cố gắng này,

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

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

List allPortletIds = layoutTypePortlet.getPortletIds(); 

Nếu danh sách rỗng thì doesnt trang chứa bất kỳ các portlet .

Cài đặt LayoutTypePortlet đảm bảo rằng trang mà người dùng đã được chuyển hướng đến là portlet kiểu bố cục.

+0

tôi sẽ thêm mã này ở đâu? – Queequeg

+0

@sharanbm, đó là một ý tưởng hay, nhưng mã này sẽ đi vào một portlet, cần được thêm vào một trang. –

+0

@Queequeg bạn cần phải tạo một MVCPortlet và đặt mã này bên trong đó, và portlet đó sẽ được thêm vào trang. –

Các vấn đề liên quan