【发布时间】:2014-10-03 18:55:17
【问题描述】:
换句话说,为了将portlet 映射到组织中的页面,我需要查看哪些数据库表?如果有这种事?!我们正在使用 Liferay 6.1.20
【问题讨论】:
-
layoutset 是您要查找的表格。此外,liferay 市场中有一个应用程序可用。(portlet 位置跟踪器)
-
还有布局表。
标签: liferay
换句话说,为了将portlet 映射到组织中的页面,我需要查看哪些数据库表?如果有这种事?!我们正在使用 Liferay 6.1.20
【问题讨论】:
标签: liferay
如果您有权访问数据库,则可以对 Layout 表进行简单查询,以了解您的 portlet 被添加到的所有页面中:
SELECT * FROM Layout WHERE typeSettings LIKE '%my_WAR_myportlet%';
您还可以使用 service-builder 构建一个 FinderImpl 以通过一个 portlet 执行此查询,并将该 portlet 添加到页面以以您想要的任何格式显示。
以下是另一种解决方案,无需部署任何 portlet,也无需访问数据库(在 MySQL 数据库上测试):
Beanshell
将以下脚本代码粘贴到文本区域并按下按钮执行:
import com.liferay.portal.kernel.dao.jdbc.DataAccess;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.StringBundler;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = DataAccess.getUpgradeOptimizedConnection();
// your custom query here
String sqlQuery = "SELECT * FROM Layout WHERE typeSettings LIKE '%my_WAR_myportlet%'";
out.println("SQL Query: "+ sqlQuery);
ps = con.prepareStatement(sqlQuery);
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
List rows = new ArrayList();
List columnLabels = new ArrayList();
columnLabels.add("Sr. No.");
for (int c = 1; c <= columnCount; c++) {
String cl = rsmd.getColumnLabel(c);
columnLabels.add(cl);
}
while (rs.next()) {
List row = new ArrayList(columnCount);
for (int c = 1; c <= columnCount; c++) {
Object value = rs.getObject(c);
row.add(value);
}
rows.add(row);
}
// --- formatting the results ---
out.append("<div class=\"lfr-search-container \"><div class=\"results-grid\">");
out.append("<table class=\"taglib-search-iterator\">");
out.append("<thead>");
out.append("<tr class=\"portlet-section-header results-header\">");
for (String value : columnLabels) {
out.append("<th>");
out.append(value);
out.append("</th>");
}
out.append("</tr>");
out.append("</thead>");
out.append("<tbody>");
boolean alt = false;
long resultsCount = 1;
for (List line : rows) {
out.append("<tr class=\"portlet-section-alternate results-row " + (alt ? "alt" : "") + "\">");
// for sr. no.
out.append("<td>");
out.append(resultsCount + "");
out.append("</td>");
resultsCount = resultsCount + 1;
for (Iterator iterator = line.iterator(); iterator.hasNext();) {
Object value = (Object) iterator.next();
out.append("<td>");
if (value != null) {
out.append(value.toString());
} else {
out.append("<span style=\"font-style:italic\">null</span>");
}
out.append("</td>");
}
out.append("</tr>");
alt = !alt;
}
out.append("</tbody>");
out.append("</table>");
out.append("</div></div>");
} catch (Exception exp) {
out.println("ERROR: " + exp);
throw exp;
}
finally {
DataAccess.cleanUp(con, ps, rs);
}
请记住将字符串 my_WAR_myportlet 更改为您的 portletId
String sqlQuery。希望这会有所帮助。
【讨论】:
"[EditServerAction:523] ... Sourced file: inline evaluation of: ``import com.liferay.portal.kernel.dao.jdbc.DataAccess; import com.liferay.portal. . . . '' : TargetError"(不正确的异常处理示例,Liferay 作者)。
这就是解决方案,一个可以解决您的问题的免费市场插件。
http://www.liferay.com/it/marketplace/-/mp/application/27156990
【讨论】:
这是从第一列获取所有 portlet 的代码
ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
Layout layout = themeDisplay.getLayout();
LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout.getLayoutType();
List<Portlet> portlets = layoutTypePortlet.getAllPortlets("column-1");
for (Portlet portlet : portlets) {
// print your portlet.getPortletId() or do whatever you need
}
【讨论】:
[layout] 是一个表格,您可以在其中找出哪些 portlet(typeSettings ) 部署在哪个页面上
【讨论】: