【问题标题】:How can i find - which portlets are deployed on which pages in Liferay 6.1?我怎样才能找到——在 Liferay 6.1 的哪些页面上部署了哪些 portlet?
【发布时间】:2014-10-03 18:55:17
【问题描述】:

换句话说,为了将portlet 映射到组织中的页面,我需要查看哪些数据库表?如果有这种事?!我们正在使用 Liferay 6.1.20

【问题讨论】:

  • layoutset 是您要查找的表格。此外,liferay 市场中有一个应用程序可用。(portlet 位置跟踪器)
  • 还有布局表。

标签: liferay


【解决方案1】:

除了marketplace portlet

如果您有权访问数据库,则可以对 Layout 表进行简单查询,以了解您的 portlet 被添加到的所有页面中:

SELECT * FROM Layout WHERE typeSettings LIKE '%my_WAR_myportlet%';

您还可以使用 service-builder 构建一个 FinderImpl 以通过一个 portlet 执行此查询,并将该 portlet 添加到页面以以您想要的任何格式显示。


以下是另一种解决方案,无需部署任何 portlet,也无需访问数据库(在 MySQL 数据库上测试):

  1. 转到服务器管理
  2. 转到脚本选项卡
  3. 从语言下拉菜单中选择Beanshell
  4. 将以下脚本代码粘贴到文本区域并按下按钮执行:

    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);
    }
    
  5. 请记住将字符串 my_WAR_myportlet 更改为您的 portletId

  6. 不用说,您可以修改脚本以更新样式并显示选择性列。您也可以运行任何 SQL 查询,只需更新 String sqlQuery

希望这会有所帮助。

【讨论】:

  • 像魅力一样工作,真的很酷!从未出现在控制面板的脚本选项卡中。现在我现在使用它。仍在学习 Liferay。感谢您的帮助!
  • :-) 我很高兴。但是在 stackoverflow 中,有一种不同的方式来表示感谢......希望你知道我的意思 ;-) ...呵呵
  • 我知道但我还没有'资源'来感谢你:(
  • 如果它解决了你的问题,我认为你仍然可以接受这个作为答案
  • 很好的答案,我只编辑了它,所以答案与 MySQL 无关(等待同行评审)。由于特定的“LIMIT”子句,在使用其他数据库时,可能会在日志中得到无意义的错误"[EditServerAction:523] ... Sourced file: inline evaluation of: ``import com.liferay.portal.kernel.dao.jdbc.DataAccess; import com.liferay.portal. . . . '' : TargetError"(不正确的异常处理示例,Liferay 作者)。
【解决方案2】:

这就是解决方案,一个可以解决您的问题的免费市场插件。

http://www.liferay.com/it/marketplace/-/mp/application/27156990

【讨论】:

  • 感谢您提供简单的解决方案!还不能投票,当我有一些声誉时会这样做。
【解决方案3】:

这是从第一列获取所有 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
}

【讨论】:

  • 或者只是调用 layoutTypePortlet.getAllPortlets() 来获取页面上的所有 portlet
【解决方案4】:

[layout] 是一个表格,您可以在其中找出哪些 portlet(typeSettings ) 部署在哪个页面上

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多