Deactivating and activating custom modules for a particular site in Liferay 7.4 (Part 1)

In Liferay 7.4 we can deactivate or activate a module for Liferay portal. This can be done using the components and app manager section from the control panel. 

 

But Liferay doesn’t provide any feature to activate or deactivate a module for a particular site. As it can be a necessary thing when we have multiple sites and want to limit modules for that. To achieve this in Liferay we must create a panel module, service builder and theme. In the following part we will create a panel module to list all custom modules and to give user the access to disable a module on a particular site. In second part we will create a service builder and theme. 

Creating a panel module (IntelliJ)

To show and let users perform action we need a module to display portlets and take user action.

To create a panel module this are the following steps: 

  1. Go to File -> New -> Module
  2. Select Liferay Modules 
  3. Give the name to the module and choose the project type panel app.
    .unnamed (52)
  4. This will create a panel module
  5. After this to see all modules in view we need to add a render method that will give the list of all custom modules present on the portal.

In ModuleBlacklistConfigurationPortlet paste the following code 

@Override
public void render(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {
  try {
      ServiceContext serviceContext = ServiceContextFactory.getInstance(
            Portlet.class.getName(), renderRequest);
      ThemeDisplay themeDisplay  =(ThemeDisplay)renderRequest.getAttribute(WebKeys.THEME_DISPLAY);
      List<com.liferay.portal.kernel.model.Portlet> portlets = PortletLocalServiceUtil.getPortlets(216,PortletLocalServiceUtil.getPortletsCount());
      renderRequest.setAttribute("portlets", portlets);

  } catch (PortalException e) {
      throw new RuntimeException(e);
  }
  super.render(renderRequest,renderResponse);

Note: The start can be different according to the start number of custom modules  

6. Now we will show this list in view.jsp 

<%@ page import="com.liferay.portal.kernel.service.PortletLocalServiceUtil" %>
<%@ page import="com.liferay.portal.kernel.model.Portlet" %>
<%@ page import="java.util.List" %>
<%@ include file="/init.jsp" %>

<%
  List<Portlet> portlets = (List<Portlet>) request.getAttribute("portlets");
  System.out.println(request.getAttribute("portlets"));
%>
<liferay-ui:search-container
      total="<%= portlets.size()%>">
  <liferay-ui:search-container-results
        results="<%= portlets %>" />

  <liferay-ui:search-container-row
        className="com.liferay.portal.kernel.model.Portlet" modelVar="portlet">

      <liferay-ui:search-container-column-text name="PortletName"
                                    property="portletId" />

            <liferay-ui:search-container-column-jsp
            align="right"  name="Action"
            path="/action.jsp" />

  </liferay-ui:search-container-row>

  <liferay-ui:search-iterator />
</liferay-ui:search-container

7. Now for action we will create action.jsp and action_portlet.jsp 

Create an action.jsp page and paste the following code: 

<%@ page import="com.liferay.portal.kernel.dao.search.ResultRow" %>
<%@ page import="com.liferay.portal.kernel.model.Portlet" %>
<%@ include file="/init.jsp" %>

<%
    ResultRow row = (ResultRow) request
            .getAttribute("SEARCH_CONTAINER_RESULT_ROW");

    Portlet portlet = (Portlet) row.getObject();
%>


<portlet:renderURL var="activeURL">
    <portlet:param name="portletId" value="<%=portlet.getPortletId()%>" />
    <portlet:param name="mvcPath" value="/active_portlet.jsp" />
</portlet:renderURL>

  <aui:button name="active" onClick="<%=activeURL.toString()%>type="button" value="Actions"/> 

Now Create an action_portlet.jsp page and paste the following code:

<%@ page import="com.liferay.portal.kernel.util.ParamUtil" %>
<%@ page import="com.liferay.portal.kernel.theme.ThemeDisplay" %>
<%@ page import="com.liferay.portal.kernel.util.WebKeys" %>
<%@ page import="moduleblacklistservice.model.Portlet" %>
<%@ page import="moduleblacklistservice.service.PortletLocalServiceUtil" %>
<%@ include file="/init.jsp" %>


<%
    String portletId = ParamUtil.getString(request, "portletId");
    Portlet portlet = null;
    if(PortletLocalServiceUtil.getPortlet(themeDisplay.getSiteGroupId(),portletId).size() > 0) {
        portlet = PortletLocalServiceUtil.getPortlet(themeDisplay.getSiteGroupId(), portletId).get(0);
    }
%>
<portlet:actionURL name="activatePortlet" var="active">
    <portlet:param name="portletId"
                  value="<%= portletId %>"/>
</portlet:actionURL>


<portlet:renderURL var="viewURL">
    <portlet:param name="mvcPath" value="/view.jsp"/>
</portlet:renderURL>
<aui:form action="<%=active.toString()%>" name="fm">
    <aui:row>
        <aui:col width="10"></aui:col>
        <aui:col width="80">
            <aui:input name="portletId" value="<%=portletId%>" label="PortletId"/>
            <c:choose>
                <c:when test="<%=portlet != null%>">
                    <aui:input type="checkbox" name="active" label="active" value="<%=portlet.getActive()%>" id="activeCheckBox"/>
                </c:when>
                <c:otherwise>
                    <aui:input type="checkbox" name="active" label="active" value="true" id="activeCheckBox"/>
                </c:otherwise>
            </c:choose>
            <aui:button-row>
                <aui:button type="submit"/>
                <aui:button onClick="<%= viewURL %>" type="cancel"/>
            </aui:button-row>
        </aui:col>
    </aui:row>
</aui:form

8. Now to call this action we will add an action method in Portlet  

public void activatePortlet(ActionRequest request, ActionResponse response) throws PortletException, PortalException {
  ServiceContext serviceContext = ServiceContextFactory.getInstance(
        Portlet.class.getName(), request);
  String portletID = ParamUtil.getString(request,"portletId");
  boolean activate = ParamUtil.getBoolean(request, "active");
  ThemeDisplay themeDisplay  =(ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY);
  List<moduleblacklistservice.model.Portlet> existportlet = _portletLocalService.getPortlet(themeDisplay.getSiteGroupId(),portletID);
  if(existportlet.size()!=0)
  {
      moduleblacklistservice.model.Portlet portlet=existportlet.get(0);
      portlet.setActive(activate);
      _portletLocalService.updatePortlet(portlet);
  }
  else {
      _portletLocalService.addPortlet(themeDisplay.getUserId(), themeDisplay.getSiteGroupId(), portletID, activate, serviceContext);
  }

The portlet will look like this: 

unnamed (51)

As we don’t have service builder and theme, we won’t be able to perform the active and deactivating functionality.

Conclusion

We have created a module to list all the custom modules and let the users have access to activate and deactivate modules for a particular site. In part 2 we will create a service builder and theme. 

For code follow the GitHub link given below: https://github.com/brijesh-2203/Liferay7.4u42/tree/master/modules/ModuleBlacklistConfiguration




Source link