如何以编程方式指向DAM显示portlet的根文件夹

时间:2017-06-11 10:31:00

标签: liferay liferay-6 liferay-7

如何通过programmatically.PFA图像将其中一个文件夹设置为Documents And Media Display portlet的根文件夹 enter image description here

1 个答案:

答案 0 :(得分:1)

Liferay主要版本

  

您的问题被标记为 Liferay 6 Liferay 7 。这两个版本截然不同。这个答案假设您正在使用 Liferay 6.x ,因为您询问的是DDM portlet 而不是 OSGI 模块。

以编程方式将输入资源设置为默认值作为您选择的文件夹,需要您在文档库显示 portlet中为JSP创建JavaServer Page钩子。我将简要介绍如何在进入细节之前创建JSP钩子。

创建一个挂钩

From Liferay's Knowledge base

  

从命令行终端,导航到Plugins SDK的hooks文件夹。要创建钩子项目,必须执行create脚本。以下是执行脚本时要遵循的格式:

create.[sh|bat] [project-name] "[Hook Display Name]"
  

在Linux和Mac OS X上,您输入的命令与此示例中的命令类似:

./create.sh doc-lib-disp-hook "Document Library Display Hook"
  

在Windows上,您输入的命令与此示例中的命令类似:

create.bat doc-lib-disp-hook "Document Library Display Hook"
  

Liferay IDE的New Project向导和创建脚本在Plugin SDK的hooks文件夹中生成钩子项目。 Plugins SDK会自动将“-hook”附加到项目名称。

您需要安装Apache ANT才能实现此功能。如果需要安装,请参考以下文档。

创建钩子后,在Liferay IDE或Liferay Developers Studio(或Eclipse)中打开它。

  1. 在IDE中,点击文件(左上角)
  2. 下方的向下箭头
  3. 从现有来源选择 Liferay插件项目
  4. 双击插件的SDK Hook目录中的 doc-lib-disp-hook 文件夹,打开。
  5. 你应该看到类似的东西(名字不同)。

    enter image description here

    覆盖JSP

    现在您已成功创建了一个钩子插件,我们需要覆盖必要的文件。这个钩子特别需要两个文件

    • 的HTML /门户/ document_library_display / configuration.jsp
    • 的HTML /门户/ document_library / init.jsp
      

    我们需要这两个文件在逻辑上遍历这个例子,尽管我们只需要实际覆盖其中一个。

    要覆盖JSP,请执行以下步骤

    1. 在您的META-INF文件夹下,创建一个名为 custom_jsp
    2. 的新目录
    3. 概述模式下打开 liferay-hook.xml
    4. 单击绿色加号(自定义JSP标签右侧)
    5. 搜索上面列出的两个文件(将URL复制并粘贴到窗口中),然后单击“保存”。
    6. 现在您将注意到您具有以下目录结构。

      enter image description here

      让我们先打开 configuration.jsp 。这是生成您拍摄的屏幕截图的GUI的代码。找到以下代码块。

              <aui:field-wrapper label="root-folder">
                  <div class="input-append">
                      <liferay-ui:input-resource id="rootFolderName" url="<%= rootFolderName %>" />
      
                      <aui:button name="openFolderSelectorButton" value="select" />
      
                      <%
                      String taglibRemoveFolder = "Liferay.Util.removeFolderSelection('rootFolderId', 'rootFolderName', '" + renderResponse.getNamespace() + "');";
                      %>
      
                      <aui:button disabled="<%= rootFolderId <= 0 %>" name="removeFolderButton" onClick="<%= taglibRemoveFolder %>" value="remove" />
                  </div>
              </aui:field-wrapper>
      

      在该块中,您将看到要设置的根文件夹元素。

      <liferay-ui:input-resource id="rootFolderName" url="<%= rootFolderName %>" />
      

      正如您所看到的,文件夹的网址默认已设置为变量 rootFolderName 。我们需要找到首次初始化变量的位置。

        

      我们根本不需要修改此文件。我让你包括它并打开它,这样你就可以按照逻辑顺序进行操作。

      如果您注意到 configuration.js p文件中的 rootFolderName 未初始化。因此,我们需要调查 init.jsp 文件,因为它是页面顶部的包含。如果您打开该文件,您会注意到以下块。

      String portletResource = ParamUtil.getString(request, "portletResource");
      
      if (layout.isTypeControlPanel()) {
          portletPreferences = PortletPreferencesLocalServiceUtil.getPreferences(themeDisplay.getCompanyId(), scopeGroupId, PortletKeys.PREFS_OWNER_TYPE_GROUP, 0, PortletKeys.DOCUMENT_LIBRARY, null);
      }
      
      long rootFolderId = PrefsParamUtil.getLong(portletPreferences, request, "rootFolderId", DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
      String rootFolderName = StringPool.BLANK;
      
      if (rootFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
          try {
              Folder rootFolder = DLAppLocalServiceUtil.getFolder(rootFolderId);
      
              rootFolderName = rootFolder.getName();
          }
          catch (NoSuchFolderException nsfe) {
          }
      }
      

      这段代码基本上是说我们要将rootFolderName初始化为空白。但是,如果rootFolderId通过

      设置为高于0
      1. Portlet首选项,或
      2. 请求参数
      3. 然后我们将相应地设置rootFolderName。

        结论

        如果你想默认以编程方式将rootFolderName设置为你选择的文件夹,你可以做一些事情。最简单的方法是获取文件夹的ID并像这样修改代码

        long folderIdConstant = 999999L; // place folder id here
        
        long rootFolderId = PrefsParamUtil.getLong(portletPreferences, request, "rootFolderId", folderIdConstant );
        

        这将以编程方式设置默认根文件夹。现在就构建和部署。

相关问题