我在 Liferay 6.2 网站上工作,我有一个网页内容页面,我可以在其中添加文章和其他一些资源。我想创建在弹出操作中可用的功能,以复制或移动到选定的目的地。
但我不知道如何将这些操作添加到我的 liferay 门户。
当用户单击“操作”按钮(红色圆圈)时,我希望在弹出窗口中可以使用我的新操作。
我在 Liferay 6.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 是Liferay 中网络内容的代名词。通常,您会看到用户和管理员的书面材料中使用的 Web 内容,以及开发人员材料中使用的日志。
你的问题相当大,它真的问了三个主要问题。
问题 #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中打开它。执行以下步骤
您应该看到创建的文件夹结构和目录索引文件。如果切换回源视图,您会注意到没有生成新的 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 容器)。