Liferay CE 6.2:如何在JSP文件中选择搜索容器中的行

时间:2015-01-14 16:20:45

标签: jsp liferay portlet

我对liferay的发展很陌生,但到目前为止我已经取得了稳步进展。但是,我遇到了障碍。

我已经创建了一个portlet,它在liferay教程之后有一个配置页面。在我的configuration.jsp文件中,我从数据库中检索一些位置记录,然后在SearchContainer中显示这些记录的位置名称。我还有第二列,其中包含一个用于选择该行的复选框,即如果选中此框,则选择该行。

我想获取所有选定行的所有位置ID,并将它们存储为portletPreference值,这样ID就可以用于在视图模式下查看某些数据。我在其他地方读过,将ID作为逗号分隔的字符串存储到隐藏的输入标记中可能是一种前进的方式,但我无法使其工作。如何使用隐藏的输入来整理所有选定的ID?

configuration.jsp中的相关部分:

<aui:form action="<%= configurationURL %>" method="post" name="fm">

<liferay-ui:search-container delta="20" emptyResultsMessage="No locations available!">
    <liferay-ui:search-container-results
        results="<%= LocationAccessDescriptionsLocalServiceUtil.findByCustomerID(1)%>"
    />

    <liferay-ui:search-container-row
        className="com.database.model.LocationAccessDescriptions"
        keyProperty="locationID"
        modelVar="location"
    >
        <liferay-ui:search-container-column-text
            name="name"
            value="<%= location.getLocationName()%>"
        />

        <liferay-ui:search-container-column-text name="select">
            <aui:input type="checkbox" name="loc_sel" class="loc_sel" value="<%=location.getLocationID() %>" />        
        </liferay-ui:search-container-column-text>

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

    <liferay-ui:search-iterator />

</liferay-ui:search-container>

<aui:button-row>
   <aui:button type="submit" />
</aui:button-row>
</aui:form>

我认为这是我缺少的基础,所以请慢慢打字回复!

编辑1:我已经向前迈进了一步,并且进一步发展。感谢下面的第一条评论,我已经设法访问我的impl类中的'rowIds'值,但我似乎无法在视图模式下访问它们。

作为替代方案,我尝试在提交表单时将选定的ID存储到隐藏的输入中,但由于我使用了首选项表示法来输入名称,因此无法编译。即,如果我将'preferences - selectedIDs--'更改为'selectedIDs',它可以工作,但不会存储为portlet首选项。那不是我想要的。有没有人使用configuraiton.jsp文件进行这种选择?

<!-- MAIN FORM -->
<aui:form action="<%= configurationURL %>" method="post" name="fm">

    <!-- HIDDEN INPUTS -->
    <aui:input name="<%= Constants.CMD %>" type="hidden" value="<%= Constants.UPDATE %>" />
    <aui:input name="preferences--selectedIDs--" type="hidden" />

    <!-- MAIN SEARCH CONTAINER -->
    <liferay-ui:search-container delta="20" emptyResultsMessage="No locations available!" rowChecker="<%= new RowChecker(renderResponse) %>">

    <liferay-ui:search-container-results
        results="<%= LocationAccessDescriptionsLocalServiceUtil.findByCustomerID(1)%>"
        total="<%= LocationAccessDescriptionsLocalServiceUtil.findByCustomerID(1).size()%>"
    />

    <liferay-ui:search-container-row
        className="com.database.model.LocationAccessDescriptions"
        keyProperty="locationID"
        modelVar="location"
    >

        <liferay-ui:search-container-column-text
            name="ID"
            value="<%= String.valueOf(location.getLocationID())%>"
        />

        <liferay-ui:search-container-column-text
            name="name"
            value="<%= location.getLocationName()%>"
        />

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

    <liferay-ui:search-iterator />

    </liferay-ui:search-container>

    <aui:button-row>
       <aui:button
            value="SubmitForm"
            onClick='<%= renderResponse.getNamespace() + "SubmitForm();" %>' />
    </aui:button-row>

</aui:form>

<!-- AUXILIARY SCRIPTS -->
<aui:script>
Liferay.provide(
    window,
    '<std-portlet:namespace />SubmitForm',
    function()
    {
         var checkBoxValue = Liferay.Util.listCheckedExcept(document.<std-portlet:namespace />fm, "<std-portlet:namespace />allRowIds");
         document.<std-portlet:namespace />fm.<std-portlet:namespace />preferences--selectedIDs--.value=checkBoxValue;
         alert("Prefs Value: " + document.<std-portlet:namespace />fm.<std-portlet:namespace />preferences--selectedIDs--.value);
         submitForm(document.<std-portlet:namespace />fm, "<%=configurationURL%>");
    },
    ['liferay-util-list-fields']
);
</aui:script>

1 个答案:

答案 0 :(得分:0)

您可以使用Liferay SearchContainer的RowChecker:

行检查器: 如果要选择多行,则可以使用行检查器

我在Liferay DXP中发布了正在运行的代码,

<aui:form name="show_fm">

<liferay-ui:search-container rowChecker="<%=new RowChecker(renderResponse) %>"  delta='10' deltaConfigurable="true" total="<%=fooLocalService.getFoosCount() %>" totalVar="countVar" emptyResultsMessage="empty-results" compactEmptyResultsMessage="true">
    <liferay-ui:search-container-results results="<%=fooLocalService.getFoos(searchContainer.getStart(), searchContainer.getEnd()) %>"  />
    <liferay-ui:search-container-row
        className="com.example.sample.model.Foo"  escapedModel="<%= true %>" rowVar="curRow"
        keyProperty="fooId" modelVar="foo">

        <liferay-ui:search-container-column-text name="name"
            property="field1" />
        <liferay-ui:search-container-column-text name="age"
            property="field3" />
        <liferay-ui:search-container-column-text name="messasge"
            property="field5" />
        <liferay-ui:search-container-column-jsp name="action"
            path="/foo_action.jsp" align="right" />
    </liferay-ui:search-container-row>
    <liferay-ui:search-iterator markupView="lexicon" />
</liferay-ui:search-container>

<aui:button-row>
    <aui:button value="delete" onClick='<%= renderResponse.getNamespace() + "showSelectedFoos();"  %>' />
</aui:button-row>

</aui:form>

<aui:script>
Liferay.provide(
        window,
        '<portlet:namespace />showSelectedFoos',
         function() {
                    var cmd = 
                           Liferay.Util.listCheckedExcept(
                               document.<portlet:namespace />show_fm,   "<portlet:namespace />allRowIds"); 
                    if(cmd==""||cmd==null){
                         alert("Please select atleast one foo to delete");
                        return false;
                    }

                    if (confirm("Are you sure you want to delete Foos? ")) {

                        var actionURL = Liferay.PortletURL.createActionURL();
                        actionURL.setWindowState("<%=LiferayWindowState.NORMAL.toString() %>");
                        actionURL.setPortletMode("<%=LiferayPortletMode.VIEW %>");
                        actionURL.setParameter("selectedRows",cmd);
                        actionURL.setParameter("javax.portlet.action","deleteMultiple");
                        actionURL.setPortletId("<%=themeDisplay.getPortletDisplay().getId() %>");

                        submitForm(document.<portlet:namespace />show_fm, actionURL);

                }

          },
          ['liferay-util-list-fields', 'liferay-portlet-url']
);

</aui:script>

您可以在Portlet Controller中编写该方法:

public void deleteMultiple(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {
        String fooIds = ParamUtil.getString(actionRequest, "selectedRows");
        System.out.println(fooIds);
        sendRedirect(actionRequest, actionResponse);
    }

以上代码将带有所选行的表单提交给Portlet方法,并使用comman seprated值获取所选行的条目id。所以现在你可以执行String操作并拆分值并获取单个ID,并根据你的操作进行操作。