0

我在 Liferay 6.2 网站上工作,我有一个网页内容页面,我可以在其中添加文章和其他一些资源。我想创建在弹出操作中可用的功能,以复制或移动到选定的目的地。

但我不知道如何将这些操作添加到我的 liferay 门户。

在此处输入图像描述

当用户单击“操作”按钮(红色圆圈)时,我希望在弹出窗口中可以使用我的新操作。

4

1 回答 1

2

创建一个钩子

来自 Liferay 的知识库

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

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

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

./create.sh journal-hook "Journal Hook"

在 Windows 上,您将输入类似于本示例中的命令:

create.bat journal-hook "Journal Hook"

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

您需要安装 Apache ANT 才能正常工作。如需安装,请参考以下文档。

创建挂钩后,在 Liferay IDE 或 Liferay Developers Studio(或 Eclipse)中打开它。您应该看到与此类似的内容。

在此处输入图像描述


Journal JavaServer Page (JSP) 挂钩

如果你注意到上面我在钩子插件的名称中使用了日志这个词。Journal 是Liferay 中网络内容的代名词。通常,您会看到用户和管理员的书面材料中使用的 Web 内容,以及开发人员材料中使用的日志。

你的问题相当大,它真的问了三个主要问题。

  1. 我们如何创建一个钩子
  2. 我要覆盖哪个页面
  3. 如何在该图标菜单中添加其他操作
  4. 当我选择我的新菜单选项时,如何创建一个弹出窗口

问题 #1 已经得到解答。您的帖子中没有明确说明问题 #2,但是我假设您正在谈论Journal Content portlet的view.jsp

有几点需要注意。View.jsp 是 Liferay 的目录索引页面(类似于 Apache 的 index.html)。Liferay 的“核心”功能实际上(大部分)是几十个 JSR-286 和 JSR-186 portlet。

第三个问题终于是我们开始编码的地方。在您的 META-INF 文件夹下创建一个名为jsp的目录(这是我们按照惯例放置 JSP 覆盖文件的位置)。导航到您的 liferay-hook.xml 文件,清除所有现有内容,然后粘贴以下 xml。

liferay-hook.xml

<hook>
    <custom-jsp-dir>/META-INF/jsp</custom-jsp-dir>
</hook>

如果您在 Liferay Developer Studio 中,请确保您在 选项卡中,而不是在概览选项卡中。

这个文件夹现在将包含您希望覆盖的每个 jsp 文件。在此示例中,我们将仅覆盖一个文件。此目录遵循特定的配置约定,即您希望覆盖的任何 jsp 文件都必须存在于此目录中,并且与它存在于门户本身中的相对位置相同。

对于我们的特定示例,Journal Content portlet 的目录索引文件存在于以下目录中。

META-INF/
      jsp/
        html/
          portlet/
            journal_content/
              + view.jsp

您不需要自己创建整个结构。您必须只创建您的jsp文件夹。创建该文件夹后,再次打开liferay-hook.xml,但这次在Overview中打开它。执行以下步骤

  1. 单击自定义 jsps 标签旁边的绿色加号。
  2. 搜索 /html/portlet/journal_content/view.jsp
  3. 双击应该是从搜索返回的唯一项目
  4. Ctrl + s 保存

在此处输入图像描述

您应该看到创建的文件夹结构和目录索引文件。如果切换回视图,您会注意到没有生成新的 xml。这就是约定优于配置的工作方式。

在此处输入图像描述

现在,在您的 WEB-INF 文件夹中创建一个名为html的新文件夹。在该文件夹中创建一个名为 view.jsp 的新 jsp。这将是您的钩子目录索引,它将是您的弹出窗口。你的结构最终应该是这样的。

在此处输入图像描述

您的钩子插件已完全配置,剩下的就是编码。在 /html/view.jsp 中输入一些样板代码。

<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui"%>
<%@ taglib uri="http://liferay.com/tld/util" prefix="liferay-util"%>

<liferay-ui:panel collapsible="false" title="Custom Option">
    <aui:form  name="fm" onSubmit="event.preventDefault();">
        <aui:input name="name" label="Name"></aui:input>
        <aui:button-row>
            <aui:button type="cancel" onClick="closeWindow('journalWindow');"></aui:button>
            <aui:button type="submit"></aui:button>
        </aui:button-row>
    </aui:form>
</liferay-ui:panel>

我们只是创建一个简单的表单,它不做任何严格的展示。如您所见,有一个

closeWindow(string)

我们将在其他页面上定义的函数。现在,打开 ../journal_content/view.jsp 页面。正下方

<%@ include file="/html/portlet/journal_content/init.jsp" %>

添加以下代码

<liferay-portlet:renderURL var="customActionURL"  windowState="<%=LiferayWindowState.POP_UP.toString()%>">
    <portlet:param name="mvcPath" value="/html/view.jsp" />
</liferay-portlet:renderURL>

<aui:script use="aui-base, liferay-util-window, aui-io-plugin-deprecated">
    var A = AUI();
    A.one('#<portlet:namespace/>customAction').on('click', function(event){
    var custom_popup= Liferay.Util.Window.getWindow({
        dialog: {
            centered: true,
            constrain2view: true,
            modal: true,
            resizable: false,
            width: 475
        }
     }).plug(A.Plugin.DialogIframe, {
         autoLoad: true,
         iframeCssClass: 'dialog-iframe',
         uri:'<%=customActionURL.toString()%>'
     }).render();

     login_popup.show();
     login_popup.titleNode.html("Custom Action");
});


Liferay.provide(window, 'closeWindow', function(id) {
    var dialog = Liferay.Util.getWindow(id);
    dialog.destroy(); 
}, ['aui-base','aui-dialog','aui-dialog-iframe']);
</aui:script>

代码很容易解释,但我将简要概述一下。前几行我们创建了一个指向 view.jsp 页面的 url。我们给它一个变量名 customActionURL 以供稍后引用,指定它是一个弹出窗口(因此它不会在窗口内显示门户主题的标题,我们发送一个 mvcPath 参数没有目的地。

<liferay-portlet:renderURL var="customActionURL"  windowState="<%=LiferayWindowState.POP_UP.toString()%>">
    <portlet:param name="mvcPath" value="/html/view.jsp" />
</liferay-portlet:renderURL>

然后,我们为尚未创建的 customAction 图标创建一个事件侦听器。单击后,它将启动一个带有我们的 renderURL 目标的新弹出窗口。最后,我们创建一个 closeWindow 函数来关闭弹出窗口。

最后,我们需要在列表中实际添加新的图标项。找到以下代码。

<div class="lfr-icon-actions">
    <c:if test="<%= showEditArticleIcon %>">
        <liferay-portlet:renderURL portletName="<%= PortletKeys.JOURNAL %>" var="editURL" windowState="<%= WindowState.MAXIMIZED.toString() %>">
            <portlet:param name="struts_action" value="/journal/edit_article" />
            <portlet:param name="redirect" value="<%= currentURL %>" />
            <portlet:param name="groupId" value="<%= String.valueOf(latestArticle.getGroupId()) %>" />
            <portlet:param name="folderId" value="<%= String.valueOf(latestArticle.getFolderId()) %>" />
            <portlet:param name="articleId" value="<%= latestArticle.getArticleId() %>" />
            <portlet:param name="version" value="<%= String.valueOf(latestArticle.getVersion()) %>" />
        </liferay-portlet:renderURL>

        <liferay-ui:icon
            cssClass="lfr-icon-action lfr-icon-action-edit"
            image="edit"
            label="<%= true %>"
            message="edit"
            url="<%= editURL %>"
        />
    </c:if>

在这段代码的正下方写下以下内容。

<liferay-ui:icon iconCssClass="icon-link" message="Custom Action" id="customAction" />

如果父窗口正在重定向,您可能需要添加以下属性

<liferay-ui:icon iconCssClass="icon-link" message="Custom Action" id="customAction" url="event.preventDefault()" />

构建并运行

构建和部署钩子是一个轻松的过程。此指示不能准确,因为它们取决于您的应用程序服务器。

这些说明还取决于您的构建工具。Liferay 支持 ANT、IVY、Maven 和 Gradle。我假设您使用的是 ANT。

在您的 IDE 中找到您的钩子的 build.xml 文件。这是您的 ANT 构建脚本。只需将该文件拖放到您的 ANT 透视图中即可。

在此处输入图像描述

现在双击所有目标。

您也可以通过导航到系统资源管理器中的 hooks 文件夹并运行来在命令行上运行它

ant all

完成后,只需启动您的嵌入式 Tomcat(或您使用的 servlet 容器)。

希望这有帮助。请让我知道任何问题、意见、疑虑等。我也将非常感谢您的反馈!

于 2017-06-13T21:10:45.273 回答