2

表单中有过滤器。基于单击按钮,我进行了 ajax 调用。

$.getJSON('<?php echo $this->Html->url(array('controller'=>'buying', 'action'=>'purchase_orders')); ?>/'+warehouse_id+'/'+status+'/'+start_date+'/'+end_date+'/'+supplier_id, 
            function(data) {
                var table_row = '';
                $.each(data, function(key,value){ 
                    table_row += '<tr><td class="sl"><input name="checkboxlist" type="checkbox" class="select" value="'+value.PurchaseOrder.id+'"/></td><td class="name"><a href="/snow_white/buying/view_purchase_order/'+value.PurchaseOrder.id+'">'+value.PurchaseOrder.order_no+'</a></td><td class="description">'+value.PurchaseOrder.order_date+'</td><td class="description">'+value.Supplier.company_name+'</td><td class="description">'+value.Warehouse.name+'</td><td class="align-center actions"><a class="btn btn-small edit-po" href="/snow_white/buying/edit_purchase_order/'+value.PurchaseOrder.id+'"><i class="icon-edit"></i></a><a class="btn btn-small delete-po" href="#"><i class="icon-trash"></i></a></td></tr>';
                });
                $('#table-body').empty(table_row);
                $('#table-body').append(table_row);
                $('#table-division').show();
            });

此 AJAX 调用将以 JSON 格式返回行。使用 JSON 格式,我使用 JQUERY 脚本中的 $.each 并迭代以获取 HTML 表格行,最后将其附加到表格主体。在这种情况下,我需要分页,任何人都可以建议我实现它的方法。

4

1 回答 1

-1

更好的解决方案是将整个 HTML-Results-Table 接收为呈现的 HTML,而不是 JSON-Data,然后使用 AJAX-Pagination。因此,您需要将结果表和周围的东西(过滤器等)分开。我通常将它分为

  • 包含 Headline、Filterform、... ( buying/purchase_orders)的视图
  • 一个元素,包含结果表 ( elements/buying/purchase_orders_filter)

我的方法是使用 jQuery 的 AJAX - 函数。

$.ajax({
    type:'get',
    url: $('base').attr('href') + 'buying/purchase_orders/warhouse_id:'+warehouse_id+'/status:'+status ...
    success: function(html){
        $('#table-division').html(html);
    }
  });

purchase控制器的 -Function 中,您尝试通过 passArgs ( $this->passedArgs['warehouse_id']),... 获取参数,并像往常一样设置分页。

然后您必须告诉控制器,如果通过 AJAX 调用该操作,则呈现元素而不是视图。这RequestHandler非常方便(在函数末尾添加):

if($this->RequestHandler->isAjax()) {
      $this->autoRender = false;
      $this->render('/elements/buying/purchase_orders_filter');
}

还要确保将 Filterarguments 设置回元素,您将需要它来进行分页

$this->set('warehouse_id',$this->passedArgs['warehouse_id']);
$this->set('status',$this->passedArgs['status']);
.
.

在您的purchase_orders- 视图中,在table-division-area 内渲染元素(使用$this->element()),以确保在启动时有一个未过滤的列表。

要启用 AJAX 分页,请添加以下行:

<?php $paginator->options(array(
'update'=>'table-division', 
'url' => array(
    'controller'=>'buying', 
    'action'=>'purchase_orders',
    'warehouse_id' => $warehouse_id, 
    .
    .
))); ?>

您需要在此处添加过滤器参数,以便在表分页时过滤数据。

剩下的几件事:

  • $('base').attr('href')对您的 AJAX 请求很有帮助,它提供了您 url 的第一部分,因此您可以从controller/action/...
    添加<base href="<?php echo $this->base; ?>" />到您layouts/default<head>-Section 开始。它非常方便。

  • 确保您的- 目录中有一个空的ajax.ctp(仅包含<?php echo this->fetch('content'); ?>layouts

希望这可以帮助!

于 2013-06-20T07:50:04.967 回答