jquery和cakephp中的分页和过滤问题

时间:2013-06-19 05:54:01

标签: php jquery jquery-ui cakephp pagination

在表单中有过滤器。根据按钮的点击,我进行了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表格行并最终将其附加到表格主体。在这种情况下,我需要分页,任何人都可以建议我实现它的方式。

1 个答案:

答案 0 :(得分:-1)

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

  • 包含标题,过滤形式,...(buying/purchase_orders
  • 的视图
  • 包含resultstable(elements/buying/purchase_orders_filter
  • 的元素

我的方法是使用jQuery的AJAX - Function。

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

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

然后你必须告诉Controller,如果通过AJAX调用该动作,那么该元素将被渲染而不是视图。 RequestHandler非常方便(在函数末尾添加):

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

另外请确保将Filterarguments设置回Element,您将需要它用于分页

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

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

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

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

您需要在此处添加filter-arguments,以便在对表进行分页时保持数据过滤。

还有一些事情:

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

  • 确保ajax.ctp目录

  • 中有空<?php echo this->fetch('content'); ?>(仅包含layouts

希望这有帮助!