2

我正在开发自定义 portlet,在我的一个视图页面中我需要一些帮助。

以下是我的表格,其中每一行都有复选框,每一行都将在运行时(动态)创建:

<form method="post" name="editform">
   <table class="table table-bordered table-striped" id="dt_gal_res">
      <thead>
         <tr>
            <th class="table_checkbox"><input type="checkbox"
                    name="select_rows" class="select_rows"
                    data-tableid="dt_gal_rest" /></th>
            <th>Name</th>
            <th>Contact Person</th>
            <th>Website</th>
            <th>EDIT</th>
            <th>DELETE</th>
          </tr>
      </thead>

 <%
       List<restaurant> rest_listOBJ = restaurantLocalServiceUtil.getAllAvailableRestaurant();

       for (int i = 0; i < (rest_listOBJ.size()); i++) {
                restaurant temprest = rest_listOBJ.get(i);
  %>

     <tbody>
         <tr>
            <td><input type="checkbox" name="row_sel" class="row_sel" /></td>
            <td><%=temprest.getName() %></td>
            <td><%=temprest.getContactno() %></td>
            <td><%=temprest.getWebsite() %></td>
            <td>
                <input type="submit" id="1" value="edit"
                            onclick="return getbuttonId('<%=temprest.getPrimaryKey() %>')" />
            </td>
            <td>
                <input type="submit" id="2" value="DELETE"
                            onclick="return getdeletebuttonId('<%=temprest.getPrimaryKey() %>')" />
                </td>
        </tr>
     </tbody>
        <%
            }
        %>
</table>

    <div style="visibility: hidden;">
        <input type="hidden" name="hide1" id="hiddenkey" value="">
    </div>
</form>

现在我有删除按钮,通过其他一些逻辑,我正在逐行删除。
但是现在我想要的是,在我提交一个按钮时选择一个或多个行的复选框后,然后单击该一个按钮,我想删除选中复选框的所有行。

不知何故,如果有人可以指导我如何在我的 portlet 类的操作方法中获取选定复选框列表的列表,那么即使这对我来说也足够了。

我对jsp很陌生,所以有任何想法的人请建议我。

正如你所建议的那样,我已经做了同样的事情。但没有取得任何成功..请纠正我哪里错了这是我的行动课

public void deleteMultipleRestaurant(ActionRequest ar, ActionResponse ap)
            throws Exception {

        log.info("ENTERED");
        List<restaurant> restaurants = restaurantLocalServiceUtil.getAllAvailableRestaurant();



        for (restaurant restaurantitem : restaurants) {        
            if (Boolean.valueOf(ar.getParameter("row_sel" + restaurantitem.getPrimaryKey()))) {
               // This is a selected checkbox so add you remove code here

                log.info(restaurantitem);

                restaurantitem.setIsdeleted(true);
                restaurantLocalServiceUtil.updaterestaurant(restaurantitem);


            }
        }
    }

在我的视图文件中,我正在执行以下操作

这是我的 ul 之一,我的删除链接在那里

<portlet:actionURL name="deleteMultipleRestaurant"
                        var="multideleteURL">
                    </portlet:actionURL>

                    <button data-toggle="dropdown" class="btn dropdown-toggle">
                        Action <span class="caret"></span>
                    </button>
                    <ul class="dropdown-menu">                          
                        <li><aui:button name="DELETE" value="DELETE" onClick="<%=multideleteURL.toString() %>"/></li>                           
                        <li><a href="javascript:void(0)">Lorem ipsum</a></li>
                        <li><a href="javascript:void(0)">Lorem ipsum</a></li>
                    </ul>

以下是查看页面

<tbody>
                                <%
                                    List<restaurant> rest_listOBJ = restaurantLocalServiceUtil
                                                                    .getAllAvailableRestaurant();

                                                              for (int i = 0; i < (rest_listOBJ.size()); i++) {

                                                                restaurant temprest = rest_listOBJ.get(i);
        %>

<tr>                                            
      <td><input type="checkbox" id="row_sel<%= temprest.getPrimaryKey() %>" name="<portlet:namespace/>row_sel<%= temprest.getPrimaryKey() %>" class="row_sel" />
      </td>

    <td><%=temprest.getName()%></td>
    <td><%=temprest.getContactno()%></td>
    <td><%=temprest.getWebsite()%></td>
    <td><input type="button" id="1"
                                            onclick="return getbuttonId('<%=temprest.getPrimaryKey()%>')"
                                            style="border:none;width:20px" class="icon-pencil"/>
                                        <input type="button" id="2"
                                            onclick="return getdeletebuttonId('<%=temprest.getPrimaryKey()%>')"
                                            style="border:none;width:20px" class="icon-trash" /></td>
                                    </tr>                               
                                <%
                                    }
                                %>
                            </tbody>

但什么都没有得到..它只是重新加载页面..只是 dat

4

3 回答 3

4

现在你正在做:

  1. 发送单IdprocessAction方法
  2. 执行基于按钮的动作editdelete

你要:

  1. 选择多个复选框
  2. 单击Delete某处的按钮
  3. 所有选定的项目都被删除

解决方案(可能有很多其他方法):

  1. 你的复选框应该是这样的:

    <input type="checkbox" name="<portlet:namespace/>row_sel" class="row_sel" value="<%=temprest.getPrimaryKey() %>" />
    

    如果您使用<aui:input />标签,则不必费心在name属性前面加上<portlet:namespace/>

  2. 以逗号分隔的格式收集Id隐藏输入字段中的所有 s,<input type="hidden" name="<portlet:namespace/>allCheckedIds" />然后将其发送到服务器。

  3. 这可以使用 javascript 来完成,在单击Delete按钮时调用一个 javascript 方法,该方法Id将从选中的复选框的值中构造一个包含所有 s 的字符串。您可以借助此链接来构建 javascript 方法。
  4. 然后submitformjavascript方法本身的帮助下。
  5. 然后在您的processAction方法中,您可以将Ids 与收到的逗号分隔字符串分开:

    String allIds = ParamUtil.getString(actionRequest, "allCheckedIds");
    //allIds = "1,2,3,4,5,6"; // this is how the Ids might look
    long[] idArray = StringUtil.split(allIds, ",", 0); // were 0 is the default value
    
  6. 现在将这些 Id 传递给服务层以删除它们。

而已。是不是很简单。

liferay 也使用了类似的方法,您可以检查Document Library Displayportlet。如果您使用<liferay-ui:searchContainer>来显示您的列表,那么您可以利用 liferay 如何为您执行此操作。

我将在这个方向上提供一些指示,您可以查看源代码:
view_file_entries.jspf,查看rowChecker="<%= entriesChecker %>"whick 为您创建复选框的行,然后查看 ['<portlet:namespace />deleteEntries'][4],实际将请求发送到操作类的 JavaScript 方法。您可以签出一些 jsps 和动作类,但我将由您来探索。:-)

快乐探索。

于 2012-11-01T09:11:35.970 回答
4

我不知道它只是以这种简单的方式完成的。如果我错了,请纠正我。我刚刚用以下代码解决了我的问题:

<td><input type="checkbox" name="row_sel" class="row_sel" /></td>

在我的行动方法中

String[] camp_id = request.getParameterValues("row_sel");
// boolean booln = false;

for(String camp_iditem:camp_id){ ... }

它只是给了我变量中选中按钮的camp_iditem值。

我刚刚得到了我想做的事。如果我做错了请纠正我?

谢谢大家的指导..

于 2012-11-02T10:11:34.950 回答
2

您需要做的第一件事是更改 name 属性并将 id 属性添加到您的复选框。所以不要这样:

<td><input type="checkbox" name="row_sel" class="row_sel" /></td>

你应该有这样的东西:

<td><input type="checkbox" id="row_sel<%= temprest.getPrimaryKey() %>" name="<portlet:namespace/>row_sel<%= temprest.getPrimaryKey() %>" class="row_sel" /></td>

这将确保每个复选框都可以在您的 processAction 方法中唯一标识。

然后在您的流程操作方法中,您可以使用以下逻辑来确定是否选中了复选框:

List<Restaurant> restaurants = RestaurantLocalServiceUtil.getAllAvailableRestaurant();

for (Restaurant restaurant : restaurants) {        
    if (Boolean.valueOf(actionRequest.getParameter("row_sel" + restaurant.getPrimaryKey())) {
       // This is a selected checkbox so add you remove code here
    }
}

那应该以粗略的方式为您解决问题!

此外,如果此答案(或对您的问题的任何其他答案)对您有帮助,请“接受”该答案以帮助社区,并感谢那些花时间帮助您的人。

~~编辑~~

此外,正如 Olaf 在下面提到的,您的<form>标签应如下所示:

<form method="post" name="editform" action="<portlet:actionURL/>">

~~ 编辑 02/11/12 ~~

以下代码可用于查看传递给 Action 方法的所有参数及其值:

for (String key : actionRequest.getParameterMap().keySet()) {
    log.info("Param " + key + " has value: " + actionRequest.getParameter(key));
}
于 2012-11-01T08:18:18.947 回答