基于 Arraylist 动态显示 liferay-search-container 列?

Dynamically Display liferay-search-container columns based on Arraylist?

我正在尝试动态显示 liferay 网格的列。出于同样的原因,参考以下 link、 的一些建议,我为用户提供了一个选项,可以在配置页面中选择 table 的所需列。配置页面的选定列正在保存在数组列表中。

问题:现在我需要根据数组列表值显示列。而是对列属性进行硬编码,我需要迭代列表并在 table/grid.

中显示选定的列

假设我正在使用 liferay 默认 USER_ 模型。配置页面的所有选定列都保存在一个列表中,如下所示,

ArrayList<String> al = new ArrayList<String>();
    Iterator<String> itr = al.iterator();
    while(itr.hasNext())
    {
            String columnName = itr.next();
            columnName = columnName.trim().toLowerCase();

            String columnVal = portletPreferences.getValue(columnName, StringPool.BLANK);
       al.add(columnName);
    }

现在假设用户在配置页面{名字、姓氏、屏幕名称}中选择了以下列。因此该列表将仅包含这三个值。

基于这个选定的列,我需要在搜索容器中动态创建列 [<liferay-ui:search-container-column-text>]。

<liferay-ui:search-container delta="5" emptyResultsMessage="no-users-were-found">
        <liferay-ui:search-container-results
                 results="<%= ListUtil.subList(users, searchContainer.getStart(),searchContainer.getEnd()) %>"
        total="<%= totalNoOfUsers %>">    
    </liferay-ui:search-container-results>
    <liferay-ui:search-container-row className="com.liferay.portal.model.User" keyProperty="userId"        modelVar="user">

      </liferay-ui:search-container-row>

      <liferay-ui:search-iterator />

</liferay-ui:search-container>

如何创建硬编码列,如下所示,

<liferay-ui:search-container-column-text name="Last Name" value="<%= user.getLastName() %>">
        </liferay-ui:search-container-column-text>

需要一些建议,在此先感谢

可以使用<c:foreach>或者scriptletfor遍历列名ArrayList,如下:

这里 entryColumns 是您保存的 ArrayList 列。

<%
for(String columnName : entryColumns) {
%>

    <c:choose>
        <c:when test='<%= "firstName".equals(columnName) %>'>
            <liferay-ui:search-container-column-text name="First Name"> value="<%= user.getFirstName() %>" />
        </c:when>
        <c:when test='<%= "lastName".equals(columnName) %>'>
            <liferay-ui:search-container-column-text name="Last Name"> value="<%= user.getFirstName() %>" />
        </c:when>
        <c:when test='<%= "birthDate".equals(columnName) %>'>
            <liferay-ui:search-container-column-text name="Birth Date">
                <fmt:formatDate value="<%= user.getBirthDate() %>" pattern="dd MMM yyyy" />
            </liferay-ui:search-container-column-text>
        </c:when>
    </c:choose>

<%
}
%>

如果您不喜欢 scriptlet,则可以使用类似的东西:

<c:foreach items="${entryColumns}" var="columnName">
    <c:choose>
        <c:when test='${"firstName" eq columnName}'>
            <liferay-ui:search-container-column-text name="First Name"> value="<%= user.getFirstName() %>" />
        </c:when>
    </c:choose>
</c:foreach>

您需要检查容器文本和值的 columnName,因为它们是不同的,在某些情况下您可能想要编写一些额外的 HTML 而不是仅仅使用value 属性,这样它也可以处理。