2017-06-13 116 views
0

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

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

enter image description here

我想有在当用户点击弹出的“操作”按钮(红圈)可用我的新的行动。

回答

2

创建挂钩

From Liferay's Knowledge base

从你的命令行终端,浏览到您的插件SDK的钩子文件夹。要创建钩子项目,您必须执行创建脚本。下面是执行该脚本遵循格式:

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的New Project向导和创建脚本在您的Plugin SDK的hooks文件夹中生成钩子项目。插件SDK自动将“-hook”附加到您的项目名称。

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

一旦钩创建开放在你的Liferay IDE或Liferay的开发者工作室(或者Eclipse)。你应该看到类似的东西。

enter image description here


杂志Java服务器页面(JSP)挂钩

如果您发现上面我用这个词杂志在钩插件的名称。 Journal与Liferay中的网页内容同义。通常,您会在用户和管理员的书面材料中看到Web内容,并在开发者材料中使用日记。

你的问题相当大,它确实要求三个主要的东西。

  1. 我们如何创建一个钩子
  2. 什么网页我重写
  3. 如何在图标菜单中添加一个附加动作
  4. 如何创建,当我选择生成一个弹出窗口,我新菜单选项

问题#1已被回答。问题#2是不是从您的文章明确清楚,但我会假设你正在谈论的杂志内容门户

有几件事情需要注意的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的开发工作室确保您在 标签而不是在概述标签。

此文件夹现在将包含您希望覆盖的每个jsp文件。在这个例子中,我们只会覆盖一个文件。这个目录遵循一个特定的惯例而不是配置,你希望覆盖的任何jsp文件都必须存在于这个目录中,并且存在于它在门户本身中的相同位置。

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

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

您不需要自己创建整个结构。您只能创建您的jsp文件夹。创建该文件夹后,再次打开liferay-hook.xml,但是这次打开概览。执行以下步骤

  1. 单击Custom jsps标签旁边的绿色加号。
  2. 搜索/ html/portlet/journal_content/view。JSP
  3. 什么应该是唯一的项目双击搜索返回
  4. 按Ctrl + S保存

enter image description here

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

enter image description here

,在你的WEB-INF文件夹中创建一个名为HTML新的文件夹。在该文件夹内创建一个名为view.jsp的新jsp。这将是你的钩子目录索引,它将是你的弹出窗口。你的结构应该看起来像这样。

enter image description here

钩子插件配置完成,所有剩下的就是编码。在/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> 

代码是非常自我解释,但我会给出一个简要的概述。前几行我们创建了一个url到我们的view.jsp页面。我们给它一个变量名customActionURL稍后referernced,指定它是一个弹出窗口(所以它不显示在窗口内的门户网站主题的标题,我们发送mvcPath参数用了目的地。

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

然后,我们创建一个事件侦听我们尚未创建customAction图标,当点击它会推出一个新的弹出窗口与我们的renderURL目的地。最后,我们创造出关闭弹出AA 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里面找到你的hook的build.xml文件。这是你的ANT构建脚本。只需将该文件拖放到您的ANT视角。

enter image description here

现在双击上的所有目标。

您还可以通过导航到你的钩子文件夹中的系统资源管理器和运行

ant all 

一旦完成后,只需启动你的嵌入式的Tomcat(或servlet容器使用)在命令行中运行此。

希望这对我有所帮助。请让我知道任何问题,意见,关切等,我也非常感谢您的反馈!

+0

我已经自定义挂钩(如权限),我尝试添加一个,将Web内容复制/移动到另一个站点或子站点。我有覆盖liferay类CopyArticleAction(尚未修改)。但是当我点击我的行动时,我到达了一个灰色的空白页面。我的卡塔利娜日志告诉我:转发不存在。 我的钩子已经存在并已被集成到我的项目中,但我的项目使用struts。我尝试将新的JSP和Java类添加到文件“struts-config-ext.xml”和“tiles-def-ext.xml”中,但我仍然有一个灰色的空白页面。 – Fred37b

+0

从最初发布此版本或之后发布版本起,您距离目标有多远?这个问题似乎已经完全改变了,我不确定你需要什么帮助。如果相信我也在Liferay论坛上偶然发现了你的问题。如果你需要一段非常具体的代码的帮助,可以在SO上发布另一篇文章,但是如果你只是需要帮助,一般都会对Liferay线索做出回应,因为它为我们提供了一个更好的论坛来回传递 –