2015-05-26 3 views
1

Я работаю на Liferay 6.1
Я хочу удалить портлет в Liferay 6.1 из моего кода. То, что я сделал до сих пор является:Как удалить портлет в Liferay 6.1 программно из кода

<a onclick="Liferay.Portlet.close('#p_p_id_28_'); return false;">Remove</a> 

Приведенный выше код работает отлично. Но он работает только с текущей страницей, т. Е. Может удалять портлеты, которые есть только на текущей странице.

Но я хочу удалить портлеты, которые могут быть где-то в меню моего портала, используя его идентификатор макета.

Пожалуйста, предложите выход. Спасибо заранее.

С уважением,
Варун Джайнских

ответ

2
public void removePortlets(ActionRequest request, ActionResponse response) 
      throws PortletException { 
     ThemeDisplay themeDisplay = (ThemeDisplay) request 
       .getAttribute(WebKeys.THEME_DISPLAY); 
     long groupId = themeDisplay.getScopeGroupId(); 
     String friendlyURL = "/demochildpage"; 
     boolean privateLayout = false; 
     long userId = themeDisplay.getUserId(); 
     try { 
      Layout layout = LayoutLocalServiceUtil.getFriendlyURLLayout(
        groupId, privateLayout, friendlyURL); 
      LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout 
        .getLayoutType(); 
      layoutTypePortlet.removePortletId(userId, "28"); 
      LayoutLocalServiceUtil.updateLayout(layout.getGroupId(), 
        layout.getPrivateLayout(), layout.getLayoutId(), 
        layout.getTypeSettings()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
+0

«Я хочу удалить портлеты, которые могут быть в каком-либо месте в меню моего портала, используя его идентификатор макета« Непонятные отношения с вашим ответом. –

+0

Вышеупомянутая логика удалит портлет только с страницы demochildpage. –

+0

Для демонстрационной цели я удалял портлет только на этой странице, но его можно было динамически удалять. –

1

Пути пойти бы: запроса к базе данных для всех макетов, на котором портлет включен, чем перебирать и удалять. Вам нужно будет выполнить пользовательский запрос или динамический запрос, если я не буду что-то контролировать. Может быть, уже есть функция сервиса, чтобы получить желаемый идентификатор макета, но я в этом сомневаюсь.

+0

Эй Gevatterjan, Это хорошая идея, я попробовал объявление это также, но проблема в том, что он удаляет портлет (ов) только после перезапуска сервера. Я пробовал и другие вещи, и один из них работал нормально, и я вложил его здесь в качестве ответа. Поэтому вы можете взглянуть на него. btw благодарит за помощь. –

0

Никогда не пробовал, но я думаю, вы можете достичь того, что хотите, используя сервис Liferay.

Процесс, кажется, достаточно просто следующим образом:
1. Получить список всех страниц/макеты с использованием com.liferay.portal.service.LayoutLocalServiceUtil.getLayouts(long groupId, boolean privateLayout)
2. Iterate список макета и список экстракта portletIds от объекта макета отлит в com.liferay.portal.model.LayoutTypePortlet
3. Инертный портлетИспользуйте и сопоставьте каждый porteltId с вашей строкой portletId.
4. Если соответствие вызова com.liferay.portal.model.layoutTypePortlet.removePortletId(long userId, String portletId) и раскладка обновление с помощью LayoutLocalServiceUtil.updateLayout(Layout layout)

Таким образом, образец кода будет выглядеть следующим образом:

String portletId = "#p_p_id_28_"; 
long userId = user.getUserId(); 
ArrayList<Layout> layouts = LayoutLocalServiceUtil.getLayouts(10180, true); 

for(Layout layout : layouts){ 
    if(!layout.isHidden()){ 
     LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout.getLayoutType(); 
     ArrayList<String> layoutPortletIds = layoutTypePortlet.getPortletIds(); 

     for(String layoutPortletId : layoutPortletIds){ 
      if(layoutPortletId.equalsIgnoreCase(portletId)){ 
       layoutTypePortlet.removePortletId(userId, portletId); 
       LayoutLocalServiceUtil.updateLayout(layout); 
      } 
     } 
    } 
} 
Смежные вопросы